}w !"#$%&'()+,-./012345
Masarykova univerzita Fakulta informatiky
Tvorba charakteru pro počítačovou hru nové generace Diplomová práce
Bc. Vít Blecha
Brno, jaro 2015
Prohlášení Prohlašuji, že tato diplomová práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj.
Bc. Vít Blecha
Vedoucí práce: MgA. Helena Lukášová, ArtD. ii
Poděkování Chtěl bych poděkovat především vedoucí svojí práce, paní doktorce Lukášové, za ochotu a velmi přínosné rady při konzultacích mojí práce.
iii
Shrnutí Práce je složena ze dvou částí. První je část umělecká, věnuje se tvorbě charakteru pro počítačové hry. V práci vypracovávám postavu od jejího návrhu, včetně jejího příběhu, až po realizaci 3D modelu. Informatická část práce se zabývá možností zpracování klávesového vstupu v systému Windows, která umožňuje identifikovat klávesnici použitou pro daný vstup a současně má možnost daný vstup zablokovat (zabránit jeho zaznamenání aktivní aplikací). V praktické části práce je vytvořen nástroj, který umožňuje nastavení klávesových zkratek pro více současně připojených klávesnic.
iv
Klíčová slova Charakter, postava, počítačové hry, videohry, příběh, 3D sochání, klávesové zkratky, klávesnice, rozpoznání více klávesnic, zpracování klávesového vstupu.
v
Obsah 1
2
3
4
Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Způsob odkazování . . . . . . . . . . . . . . . . . . . . . . 1.2 Volba hry . . . . . . . . . . . . . . . . . . . . . . . . . . . Návrh charakteru a jeho příběhu . . . . . . . . . . . . . . . . 2.1 Svět Zaklínače . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Příběh jako základ charakteru . . . . . . . . . . . . . . . . . 2.3 Píseň za soumraku . . . . . . . . . . . . . . . . . . . . . . 2.4 Inspirace . . . . . . . . . . . . . . . . . . . . . . . . . . . . Realizace charakteru . . . . . . . . . . . . . . . . . . . . . . . 3.1 Tvorba 3D modelu charakteru . . . . . . . . . . . . . . . . . 3.1.1 Základový model . . . . . . . . . . . . . . . . . . 3.1.2 3D sochání modelu . . . . . . . . . . . . . . . . . 3.1.3 Finální nízkopolygonový model . . . . . . . . . 3.1.4 3D snímání . . . . . . . . . . . . . . . . . . . . . 3.2 Texturování . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Zpracovaná postava . . . . . . . . . . . . . . . . . . . . . . LiteKeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 Motivace vzniku LiteKeys . . . . . . . . . . . . . . . . . . 4.2 Zpracování klávesového vstupu . . . . . . . . . . . . . . . . 4.2.1 Metody zpracování vstupu na úrovni jádra . . . 4.2.2 Metody zpracování vstupu na aplikační úrovni . 4.2.2.1 Raw Input . . . . . . . . . . . . . . . . . 4.2.2.2 Hook . . . . . . . . . . . . . . . . . . . 4.2.2.3 Kombinace rozhraní . . . . . . . . . . . 4.3 Kombinování Raw Input a Keyboard Hook . . . . . . . . . . 4.3.1 Základní princip . . . . . . . . . . . . . . . . . . 4.3.2 Nejdůležitější protiopatření . . . . . . . . . . . . 4.3.2.1 Ukládání Raw Input rozhodnutí . . . . 4.3.2.2 Chybějící Keyboard Hook zpráva . . . 4.3.2.3 Čekání na Raw Input zprávu . . . . . . 4.3.2.4 Chybějící Raw Input zpráva . . . . . . 4.3.3 Předcházení problémům . . . . . . . . . . . . . . 4.3.3.1 Klávesa AltGr . . . . . . . . . . . . . . 4.3.3.2 Nesmyslné Keyboard Hook události . 4.3.3.3 Opakované Keyboard Hook události .
1 2 2 4 4 6 8 8 10 10 11 12 13 16 18 18 22 22 24 24 24 25 25 25 26 26 30 30 31 33 34 35 35 35 36 vi
4.3.4 Speciální klávesy . . . . . . . . . . 4.4 Realizace LiteKeys . . . . . . . . . . . . . . 4.5 Použití LiteKeys v praxi . . . . . . . . . . . Celkem stisknutých kláves 37 Počet akcí LiteKeys 37 Počet vygenerovaných klávesových událostí 38 Počet znaků vygenerovaného textu 38 Odhad počtu ušetřených stisků kláves 38 Předpokládané procento ušetřených stisků kláves Počet ušetřených stisků kláves za minutu 38 4.5.1 Test — Mudbox . . . . . . . . . . . 4.5.2 Test — LaTeX . . . . . . . . . . . . 5 Závěr . . . . . . . . . . . . . . . . . . . . . . . . Seznam literatury . . . . . . . . . . . . . . . . . . . Seznam her . . . . . . . . . . . . . . . . . . . . . . . Seznam převzatých obrázků . . . . . . . . . . . . . A Přiložené soubory . . . . . . . . . . . . . . . . A.1 Píseň za soumraku — příběh o Aylie . . . . . A.2 Lidská kostra . . . . . . . . . . . . . . . . . A.3 3D model Aylie . . . . . . . . . . . . . . . . A.4 Raw Input a Keyboard Hook demo program . A.5 LiteKeys zdrojové kódy . . . . . . . . . . . . A.6 Program LiteKeys verze 1.0 . . . . . . . . . . A.7 Uživatelská příručka LiteKeys . . . . . . . .
. . . . . . . . 36 . . . . . . . . 37 . . . . . . . . 37
38 . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
38 39 40 42 45 46 47 47 47 47 47 47 47 48
vii
1 Úvod Moje diplomová práce se skládá ze dvou poměrně rozličných částí. První je umělecky zaměřena a věnuji se v ní tvorbě charakteru pro počítačové hry. Během práce jsem vypracovával postavu od samotného návrhu, včetně návrhu jejího příběhu v rámci hry. Poté jsem tento návrh realizoval zpracováním 3D modelu metodou takzvaného 3D sochání, včetně přípravy textur. Během této části práce jsem se však dostal do časových problémů (tuto část jsem vypracovával až jako druhou). Z toho důvodu se mi nepodařilo model dokončit do finální podoby. Nedostatek času se projevil i na textové části práce, která popisuje můj postup při praktické tvorbě postavy. Několik kapitol jsem nestihl do práce sepsat. Náplní informatické části práce je návrh a realizace programu pro správu klávesových zkratek, který umí využít více klávesnic připojených k počítači. V teoretické části práce popíšu způsob, který umožňuje při zpracování klávesové události v systému Windows identifikovat klávesnici, která byla pro vstup použita, a současně umí tento vstup zablokovat (zabránit tomu, aby aplikace, které je vstup původně adresován, tento vstup zaznamenala). Postup využívá kombinaci rozhraní Raw Input a mechanismu Keyboard Hook, která nebyla nikde zdokumentována. Bylo proto velmi obtížné najít informace, které mě k řešení tohoto problému navedly. Z tohoto důvodu jsem se rozhodl, přestože základní princip řešení není mým originálním dílem, že jedním z cílů mé práce bude tento postup zdokumentovat a zveřejnit. Aby případně další vývojáři, kteří na tento problém narazí, mohli snáze najít řešení. Stěžejní částí informatické poloviny práce je praktická realizace programu LiteKeys. Tento nástroj pro správu klávesových zkratek umožňuje přiřazovat funkci jednotlivým klávesám na několika klávesnicích, současně připojených k počítači. Díky tomu je možné nastavit klávesnici, která bude sloužit pro spouštění klávesových zkratek, a funkce hlavní klávesnice zůstane zachována pro standardní klávesový vstup. Cílem tohoto řešení je zlepšit ergonomii práce, zvlášť při používání grafického tabletu.
1
1. Úvod
1.1
Způsob odkazování
Protože ve své práci mimo běžných literárních zdrojů odkazuji poměrně často i počítačové hry, rozhodl jsem se zvýšit přehlednost odkazovaných záznamů rozdělením bibliografie zvlášť pro hry a literaturu. Když už jsem v práci rozděloval tyto dvě kategorie, přidal jsem ještě třetí pro obrázky, které jsou v mé práci převzaty. Systém používá číselné odkazování s předponou, která určuje o jaký seznam jde. Písmeno L značí, že se jedná o literaturu, H je určeno pro hry a předpona O odkazuje převzaté obrázky. Například odkaz na knihu Scotta Spencera, která je zařazena v seznamu literatury, je uveden jako [L30]. Tento systém je poněkud nestandardní, ale věřím, že přinese práci větší přehlednost. V seznamu her jsou v pořadí uvedeny údaje o vývojářském studiu, které za hrou stojí, název hry v češtině (pokud nějaký hra má), platformy, pro které je hra určena, anglický název a rok vydání.
1.2
Volba hry
Při návrhu charakteru pro počítačovou hru v praxi většinou designér pracuje na konkrétním herním projektu, já však měl možnost zvolit si pro svoji práci hru dle vlastního uvážení. Její výběr jsem omezil několika kritérii. Prvním, které plyne ze samotného názvu mojí práce, bylo, aby se jednalo o hru nové generace, přesněji řečeno o hru určenou pro novou generaci konzolí. Představení nových technik, které se v těchto hrách používají pro tvorbu postav, je jedním z cílů, které jsem pro svoji práci stanovil. Označení „nová generace“ je nicméně velmi zavádějící, protože již v době psaní práce se přeměňuje na současnou generaci a za několik let se stane generací minulou. Abych předešel případným nedorozuměním, tato práce pojednává o hrách určených pro konzole PlayStation 4 a Xbox One, v případě počítačů jde o hry využívající rozhraní DirectX 11 (výhledově DirectX 12). Svůj výběr jsem omezil na žánr role-playing game (zkráceně RPG). Jak napovídá název, hráč takovéto hry se dostává do role postavy, která prožívá nějaký fiktivní příběh. Hráč má prostřednictvím této postavy možnost vnímat a ovlivňovat herní svět a tím se podílet na 2
1. Úvod vývoji odehrávajícího se příběhu. Příběh hraje v tomto žánru většinou velmi důležitou roli, což je hlavní důvod, proč jsem jej zvolil. Důraz kladený na příběh se odráží na postavách, které jsou jeho součástí. Kvůli tomu považuji tento žánr za obzvlášť vhodný pro práci na návrhu postav. Dalším kritériem bylo, aby hra byla AAA produkce. To znamená, že hra má vysoký rozpočet a většinou ji vytváří velké vývojářské studio. Toto omezení jsem zvolil z důvodu, že chci při tvorbě postavy prezentovat některé moderní technologie, které bývají využívány převážně v takovýchto projektech. Převládajícím trendem vysokorozpočtových her je co nejrealističtější grafické zpracování, pro které jsou tyto technologie vhodné. Projekty s menším rozpočtem, takzvané indie hry, typicky pracují s více stylizovanou nebo jednodušší grafikou, proto tyto nové techniky většinou nepoužívají. Konkrétní hrou, pro kterou jsem se nakonec rozhodl vytvořit svůj charakter a jeho příběh, je Zaklínač 3: Divoký hon [H-8]. Ten mě oslovil především atmosférou svého světa a velmi dobrým příběhem, ve kterém vystupují propracované postavy. Tento svět krátce představím v následující kapitole 2.1. Dalším důvodem, proč jsem se rozhodl pro Zaklínače 3, je možnost modifikací, kterou by hra měla nabízet. Díky tomu budu moci svůj charakter a jeho příběh vložit do hry, kde budou mít hráči možnost si jej stáhnout a zahrát. V době, kdy jsem tuto práci zpracovával, ještě nebyl Zaklínač 3 vydán. Mohl jsem tedy pracovat pouze s informacemi a materiály, které byly v té době dostupné. Z toho pramení riziko, že obzvlášť některé části práce na 3D modelu charakteru mohou být nepřesné nebo neúplné a jeho zapojení do hry bude vyžadovat menší či větší úpravy. Nicméně velmi významná část práce, kterou je samotný návrh charakteru a jeho příběhu, by měla být pro hru použitelná. Možnost, že by se ve hře vyskytlo něco, co by bylo s mnou navrženým příběhem v rozporu, považuji za poměrně málo pravděpodobnou.
3
2 Návrh charakteru a jeho příběhu 2.1
Svět Zaklínače
Prvním zásadním krokem při tvorbě videoherního charakteru je seznámení se se hrou, pro kterou je charakter vytvářen. Je nezbytné mít dobrou představu o světě, ve kterém se hra odehrává, a o její atmosféře. Bez ní by se mohlo stát, že navržený charakter bude nějakým zásadním způsobem vybočovat ze zavedených reálií herního prostředí a nebude tak pro hráče uvěřitelný. V krajním případě by takový charakter mohl zcela narušit hráčovo potlačení nedůvěry 1 , čímž by zkazil celkový dojem z hraní. Protože nemohu předpokládat, že všichni čtenáři této práce Zaklínače znají, stručně jeho svět popíšu v této kapitole. Zaklínač 3: Divoký hon [H-8] navazuje na hry Zaklínač [H-6] a Zaklínač 2: Vrahové králů [H-7]. Celá herní série vychází z knih Andrzeje Sapkowského [L-22, L-23, L-24, L-25, L-26, L-27, L-28]. Jedná se o klasickou fantasy literaturu. Prostředí by se dalo přirovnat k ranému středověku, nicméně kromě lidí obývají tento svět také elfové, trpaslíci a nejrůznější nadpřirozené bytosti. Od příšer z bažin, přes nemrtvé, až po bazilišky nebo draky. Paleta bestií, které se zde vyskytují, je opravdu široká. Na ochranu lidí a jiný civilizovaných bytostí před monstry jsou cvičeni zaklínači. Tito lidé jsou od malička podrobováni náročnému fyzickému tréninku a požívají lektvary, které působí na jejich tělo a dodávají mu nadlidské schopnosti. Mimoto se během výcviku učí o všech možných příšerách, aby věděli jak s nimi bojovat. Zaklínač Geralt z Rivie je hlavní postavou knižní předlohy i her, kde hráč vstupuje přímo do jeho role. Svět Zaklínače rozhodně není možné považovat za idylickou pohádku. Je plný strachu, utrpení, násilí a boje o přežití. A to nejen kvůli přítomnosti monster. Lidská království jsou zužována lokálními konflikty i hrozbou další války se sousední říší. Nenávist, zloba, předsudky, touha po moci či bohatství jsou zakořeněny ve společnosti. 1. Potlačení nedůvěry (anglicky suspension of disbelief ) je stav, kdy při hraní hry považuje hráč fiktivní herní prostředí za skutečné nebo alespoň jeho skutečnost připouští, protože se je nesnaží cíleně kriticky hodnotit. Díky tomu se může zcela ponořit do děje hry. Pokud však dojde k jeho narušení, například nějakým herním prvkem, může hráč začít situaci ve hře zpochybňovat a hra jej může přestat bavit.
4
2. Návrh charakteru a jeho příběhu Lidé páchají mnohdy horší činy než leckteré příšery. Naopak některé nelidské bytosti jsou inteligentní a mírumilovné, nepředstavující žádné nebezpečí. Pojmy jako dobro a zlo zde nejsou rozlišitelné prostě jako bílá a černá. Často dochází ke konfliktu dvou stran, které by v rámci předchozího přirovnání odpovídaly různým odstínům šedé. Ani protagonista Geralt není typický kladný hrdina. Zaklínači většinou nepomáhají lidem pouze pro dobrý pocit. Nechávají si za svoji práci lovců monster platit. Do sporů lidí se Geralt obvykle snaží nezasahovat, zachovává neutrální postoj. Ne vždy má však takovou možnost.
Obrázek 2.1: Zaklínač 3: Divoký hon [H-8] — ukázka atmosféry [O-7]. Knihy i hry vyprávějí příběh o Geraltovi velmi osobním způsobem. Nevyhýbají se násilí, smrti nebo sexu, jsou proto jednoznačně určeny pro dospělé. Přestože svět Zaklínače je čistě fiktivní, je podáván tak realisticky (mnohdy naturalisticky), že je velice uvěřitelný. Celkově má dílo poměrně temnou atmosféru, kterou ilustruje obrázek 2.1. Pokud si ji chcete ještě více přiblížit, můžete se podívat na některá videa o hře. Doporučuji například The Witcher 3: Wild Hunt — Killing Monsters Cinematic Trailer, The Witcher 3: Wild Hunt — The Sword Of Destiny Trailer nebo The Witcher 3: Wild Hunt Recap Video, která je možné vyhledat na serveru Youtube. 5
2. Návrh charakteru a jeho příběhu
2.2
Příběh jako základ charakteru
Uvedu tuto část práce citátem Bryana Tillmana (spolu s mým překladem), kterým zakončil svoji knihu Creative Character Design [L-31], z níž jsem při tvorbě charakteru hodně čerpal: “Story is the most important aspect of character design!” — Bryan Tillman [L-31, s. 173] „Příběh je nejdůležitější součástí tvorby charakteru!“ Čím je příběh pro postavy tak důležitý? Jistě je možné vytvořit postavy, které budou vizuálně zajímavé, aniž by měly nějak propracovaný příběh. Dokonce bych řekl, že to je v některých herních žánrech, například těch zaměřených více na akci, poměrně běžné. I takový charakter může plnit svoji úlohu v rámci hry. Kniha Bryana Tillmana [L-31] se zabývá tvorbou charakterů obecně a nebere v úvahu specifické podmínky počítačových her. Nicméně velká část poznatků, které kniha nabízí, je snadno přenositelná. Autor uvádí jako jeden z hlavních důvodů, proč je příběh pro charaktery zásadní, zaujetí. Například když člověk narazí na charakter, který mu bude připadat zajímavý, bude se o něm chtít dozvědět víc. Konkrétně o jeho příběhu, protože vizuální stránka příliš prostoru pro hlubší poznávání nenabízí. Pokud žádný příběh postavu nedokresluje, může to v člověku vyvolat pocit zklamání. Naopak dobrý příběh by jej upoutal a pomohl ho vtáhnout hlouběji do děje. Propracované charaktery ve hrách tedy mohou pomoci udržet hráčův zájem. K zaujetí bych doplnil ještě zapamatovatelnost, která s ním nepřímo souvisí. Postava, která nabízí zajímavý příběh, má větší šanci, že si ji hráč uchová v paměti, což vytváří dobrý dojem ze hry i po jejím dohrání. Jako příklad bych uvedl hru Dragon Age II [H-1]. Postavy v této hře mi nepřišly zajímavé, mám proto problém si je vybavit. Díky tomu je můj celkový dojem z této hry poměrně chladný. Oproti tomu například v Zaklínači 2: Vrahové králů [H-7] vystupuje celá řada propracovaných charakterů, ať už jde o ústřední postavy celé série, jako samotného protagonistu Geralta, barda Marigolda nebo čarodějku Triss, či postavy tohoto konkrétního dílu, jako elfa Iorvetha nebo Vernona Roche. Snad ještě lepším příkladem skvěle zpracovaných charakterů je hra The Last of Us [H-2], která díky poutavému 6
2. Návrh charakteru a jeho příběhu příběhu Joela a Ellie, zachycených na obrázku 2.2, získává nejvyšší hodnocení kritiků i hráčů.
Obrázek 2.2: The Last of Us [H-2] [O-6]. Střídmější pohled na důležitost příběhu v kontextu počítačových her uvádí Jesse Schell ve své knize The Art of Game Design — A Book of Lenses [L-29]. Příběh považuje za jednu ze čtyř elementárních složek hry. Dalšími jsou herní mechaniky, estetika a technologie. Při vývoji hry je na tvůrci, aby určil, jak velkou roli budou jednotlivé složky hrát. Zda budou všechny v rovnováze a vzájemně se podporovat, zda nějaká bude upozaděna, nebo třeba zda bude jedna velmi dominantní. Je tedy zcela dobře možné vytvořit hru, která nebude nabízet vůbec žádný příběh. Typickým příkladem jsou hry abstraktní, které se zaměřují na herní mechaniky, jmenovitě třeba Bejeweled [H-4]. Na druhou stranu existují hry, které jsou založené čistě na vyprávění příběhu. Kupříkladu textové adventury či interaktivní fikce jako Anchorhead [H-5]. Z toho plyne, že příběh, potažmo příběhy jednotlivých postav, je pro hru tak důležitý, jak důležitým ho stanoví tvůrce. V žánru počítačových RPG her, který jsem pro svoji práci zvolil, lze předpokládat, že bude na příběh kladen velký důraz. Je to dáno samotnými kořeny žánru, neboť se vyvinul ze stolních RPG her. 7
2. Návrh charakteru a jeho příběhu V nich hráči, zjednodušeně řečeno, společně vytváří příběh postav, které ve hře představují. Tento princip se přenáší do počítačových her, kde hráč prožívá příběh svojí postavy, který může ovlivňovat svými akcemi. Dalo by se tedy říct, že dobrý příběh je základem takové hry. Z tohoto důvodu považuji návrh příběhu za velmi důležitou součást tvorby videoherního charakteru, a proto jsem se na něj při tvorbě svojí diplomové práce zaměřil.
2.3
Píseň za soumraku
V rámci svojí práce jsem vytvořil příběh Píseň za soumraku. Protože jde o příběh pro počítačovou hru, je ze své podstaty interaktivní. Kvůli tomu by nebylo snadné vložit jej přímo do textu této práce a to jak z hlediska přípravy, tak jeho následného plynulého čtení. Prezentuji tedy svůj příběh formou interaktivního vyprávění, kde čtenář představuje roli hlavního hrdiny Geralta. Tímto způsobem je možné přiblížit příběh tak, jak jej bude vnímat hráč během hraní. Příběh Píseň za soumraku si můžete přečíst v připojených materiálech A.1.
2.4
Inspirace
Pro každou tvůrčí činnost je důležitá inspirace. Při tvorbě mého příběhu a jeho postav pro mne bylo pochopitelně nejdůležitějším zdrojem dílo Andrzeje Sapkowského [L-22, L-23, L-24, L-25, L-26, L-27, L-28] a předchozí díly ze série her Zaklínače [H-6, H-7]. Rozhodl jsem se, že se příběh bude odehrávat na souostroví Skellige, o kterém jsem z dostupných informací věděl, že bude ve hře obsaženo. Prostředí těchto ostrovů je silně inspirováno severskou mytologií a dobou vikingů. Bylo tedy vhodné, abych z takových zdrojů čerpal i já. Pustil jsem se proto nejen do studia dostupných literárních zdrojů, ale shlédl jsem také celou řadu dokumentů o této době. Internet nabízí opravdu široké možnosti získávání informací a byla by chyba je nevyužít. Nejvíce jsem využíval materiály přístupné na stránce Project Gutenberg, jmenovitě třeba [L-7, L-34]. Mimo takovéto konkrétně vyhledávané zdroje člověk vědomě i nevědomě čerpá ze své paměti. Ať už to jsou jeho osobní zkušenosti 8
2. Návrh charakteru a jeho příběhu nebo věci, které četl a viděl. Je proto vhodné tuto svoji sbírku inspirace neustále rozšiřovat.
9
3 Realizace charakteru Jak jsem předesílal v úvodu, tento text neposkytuje podrobný návod na zpracování 3D modelu charakteru, neboť toto téma již zpracoval ve své bakalářské práci Tomáš Mádr [L-12]. Popisuje sice tvorbu postavy pro počítačovou hru minulé generace, nicméně velká část celého procesu zůstává stejná i pro hry generace nové. Případným zájemcům o podrobnější popis jednotlivých fází zpracování 3D modelu tedy mohu doporučit buď práci Tomáše Mádra [L-12] nebo dále v textu budu u každé podkapitoly uvádět zdroje, ze kterých jsem při tvorbě vycházel já. Tato kapitola je tedy brána spíš jako dokumentace postupu, který jsem při zpracování postavy pro počítačovou hru použil já v rámci praktické části svojí práce. Postavou, kterou budu zpracovávat z mého příběhu uvedeného v podkapitole 2.3, je rusalka Aylie.
3.1
Tvorba 3D modelu charakteru
V dnešní době se dá považovat za standardní postup při tvorbě 3D modelu postavy takzvané 3D sochání (anglicky 3D sculpting nebo digital sculpting), které je pro práci na organických tvarech velmi vhodné. Proto jsem jej pro tvorbu charakteru využil i já. Celý proces tvorby modelu tímto způsobem se dá rozdělit na tři kroky. Nejprve je nutné připravit výchozí model, který bude pomocí 3D sochání upravován. Aby bylo možné zachytit požadovaný tvar objektu a jeho detaily, je polygonová síť výchozího modelu rozdělována, čímž dochází k výraznému nárůstu počtu jejích polygonů. Proto je v posledním kroku z tohoto detailního modelu vytvořen model jednodušší, který kopíruje jeho tvar. Má však výrazně nižší počet polygonů a topologie jeho sítě je uzpůsobená tak, aby podporovala deformování objektu při animaci. Při 3D sochání jsem se nejvíce inspiroval postupem, který popisuje Scott Spencer [L-30]. 3D sochání jsem prováděl v aplikaci Autodesk Mudbox a ostatní modelování v Autodesk Maya. 10
3. Realizace charakteru 3.1.1
Základový model
Jako výchozí bod pro 3D sochání charakteru jsem si vytvořil základový model (anglicky base mesh). Tento model je velice jednoduchý a udržuje pouze velmi základní proporce. Do podoby lidského těla je upraven až při samotném sochání. Základový model je zobrazen na snímku 3.1.
Obrázek 3.1: Základový model Můj základový model je velmi podobný tomu, který používá Scott Spencer [L-30]. Nesnaží se definovat žádné tělesné rysy pomocí topologie polygonové sítě tím, že by vedl jednotlivé pásy polygonů podél výrazných rysů. Místo toho se snaží dodržovat rovnoměrnou čtvercovou síť. Pouze v místech, kde bude potřeba větších detailů, jako kolem očí nebo pro nos, vkládá do sítě dodatečné polygony. S takto navrženým základovým modelem jsem později narazil na jeden problém. Při 3D sochání jsem postupoval tak, že jsem nejprve model upravoval na nižších úrovních rozdělení (anglicky subdivision level). Celkové proporce modelu jsem stavěl již na první úrovni. Problém se objevil v místech, kde dochází k větším změnám ve tvaru modelu. Nejvíc jsem jej pocítil při tvarování nosu. Síť pro tato místa 11
3. Realizace charakteru sice obsahuje dodatečné polygony, ale jejich umístění jsem nevěnoval velkou pozornost. Aby bylo možné definovat požadované tvary na nižších úrovních rozdělení, bylo by nutné tyto polygony přemístit. Tím by ale byla narušena rovnoměrnost rozložení sítě. Scott Spencer [L-30] na tento problém nenaráží, protože při práci přechází rovnou na vyšší úroveň rozdělení, která díky zahuštění polygonové sítě nepotřebuje přesnější umístění základních polygonů. Řešení jsou tedy možná dvě. Buď na základovém modelu věnovat větší pozornost rozmístění dodatečných polygonů, nebo při 3D sochání pracovat rovnou na vyšší úrovni rozdělení. 3.1.2
3D sochání modelu
Jak jsem zmínil výše, při 3D sochání postavy jsem vycházel převážně z knihy a videa Scotta Spencera [L-30]. Popisovaná technika mě zaujala především tím, že přistupuje k tvorbě s obrovským důrazem na anatomii. Na rozdíl od jiných autorů, s nimiž jsem se při studiu setkal, zachází Scott Spencer při zpracování modelu více do hloubky. Nestaví jej pouze jako studii povrchu, ale věnuje velkou pozornost vnitřní stavbě těla. Například při tvorbě hlavy nejprve vymodeluje podobu lebky, na kterou nanáší jednotlivé svaly, jak ukazuje obrázek 3.2. Tento postup vyžaduje anatomické znalosti na velmi vysoké úrovni. Avšak moje znalosti anatomie takto vysoké úrovně nedosahují. Přesto mě autor inspiroval a navedl na metodu, která je použitelná i pro méně zkušené tvůrce. Spočívá v tom, že jsem si do modelu vložil některé významné kosti (lebku, hrudní koš a pánev). Vnitřní reference mi výrazně pomohly stanovit celkové proporce modelu v prostoru a začít umísťovat svalovou hmotu. Referenční model kostry jsem získal ze stránky [L-20]. Původní model je pro tento účel zbytečně podrobný — skládá se z velkého množství polygonů. Jeho zjednodušenou verzi, kterou jsem si připravil, jsem zahrnul do přiložených materiálů A.2. Při tvorbě modelu jsem počítal s tím, že postava bude nosit šaty. Největší pozornost jsem proto věnoval obličeji, který bude nejlépe viditelný. Při tvorbě těla jsem dbal hlavně na to, aby mělo správnou proporci a celkovou formu. Výsledný model, který jsem pomocí 3D sochání vytvořil ukazuje obrázek 3.3. 12
3. Realizace charakteru
Obrázek 3.2: Tvorba modelu obličeje vycházející od lebky [L-30]. 3.1.3
Finální nízkopolygonový model
Model, který jsem připravil pomocí 3D sochání, je tvořen více než sedmi miliony polygonů, takže není možné jej přímo použít ve hře. A to nejen z důvodu velké výpočetní a paměťové náročnosti jeho zobrazení. Takto složitý model by bylo velice obtížné kontrolovat při animaci. Je proto potřeba na základě tohoto modelu vyrobit jeho zjednodušenou verzi, která se anglicky označuje jako low poly. Zde přichází na řadu první omezení, které je kladeno na modely určené do videoher. Je jím počet polygonů, ze kterých se model skládá. Při rozebírání této tématiky může být běžně používaný termín „polygony“ dost nejednoznačný. Můžou jím být myšleny buď čtyřúhelníkové plošky, které se převážně používají při tvorbě modelu i jeho animací, nebo trojúhelníkové plošky, na které je každý model rozložen před exportem do hry. V této souvislosti tak polygon může znamenat jeden, nebo dva trojúhelníky v modelu přímo ve hře. Abych této nejednoznačnosti předešel, budu v této podkapitole dále hovořit pouze o počtu trojúhelníků. Kolik je vhodný počet trojúhelníků pro model charakteru není 13
3. Realizace charakteru
Obrázek 3.3: Model Aylie vytvořený metodou 3D sochání.
14
3. Realizace charakteru žádné obecně platné číslo, ale závisí na jádru konkrétní hry. Hra Zaklínač 3: Divoký hon [H-8] využívá pro postavy až 40 000 trojúhelníků, jak uvádí vývojáři v prezentaci [L-3]. Pro srovnání uvedu, že hry pro minulou generaci konzolí využívaly většinou do 20 000 trojúhelníků jako například Zaklínač 2: Vrahové králů [H-7] [L-17]. Oproti tomu hra Ryse: Son of Rome [H-3], která byla vyvíjena pro generaci novou, pracuje s charaktery složenými až z více než 100 000 trojúhelníků [L-14]. Lze tedy říct, že nárůst výkonu zařízení nové generace umožňuje tvořit postavy z většího počtu trojúhelníků, což se projeví především na jemnější siluetě. Výše jsem se o stanoveném počtu trojúhelníků vyjádřil jako o omezení. Ve skutečnosti se jedná spíš o doporučení. Jádro hry je schopné zobrazit i modely z většího počtu trojúhelníků. Typicky třeba modely velkých příšer bývají řádově složitější než model běžné postavy. Nicméně stabilní výkon je jedním z hlavních požadavků na herní jádro. Není proto vhodné předepsané doporučení překračovat, pokud k tomu není dobrý důvod. V případě postavy Aylie žádný takový důvod neexistuje, 40 000 trojúhelníků jsem tedy bral jako maximální strop při tvorbě jejího modelu. Finální nízkopolygonový model těla postavy, který jsem připravil se skládá z přibližně 20 000 trojúhelníků. Nechal jsem si tak rezervu pro šaty a případně další doplňky. Druhým požadavkem na výsledný nízkopolygonový model je, aby jeho polygonová síť byla vhodná pro animaci. To obnáší sestavit síť tak, aby souvislé pásy polygonů definovaly jednotlivé tvary povrchu, které se budou při animaci deformovat. V přednášce [L-3] autoři uvádí, že Zaklínač 3: Divoký hon [H-8] používá pro hlavy člověku podobných bytostí jednu výchozí topologii sítě. Díky tomu mohou postavy využívat univerzální sadu animací a automatický artikulační systém. Ten se stará o animaci úst, když postava mluví. Ideální by tedy bylo, abych stejnou síť použil i pro svoji postavu. Avšak vzhledem k tomu, že zatím nejsou volně dostupné nástroje pro modifikaci Zaklínače 3 [H-8], jsem neměl tuto síť k dispozici. Nicméně přednáška obsahovala její ilustraci, přestože jen v poměrně nízké kvalitě. Snažil jsem se tedy topologii sítě alespoň napodobit. V místech, o kterých jsem měl pochybnosti, a pro tělo jsem vycházel z následujících zdrojů [L-13, L-5, L-32]. Další poznatek z přednášky [L-3] bylo to, že tvůrci pracují s modely postav, které mají oddělenou hlavu od těla a některé další části, 15
3. Realizace charakteru jako oči a zuby, jsou také samostatné. Proto jsem svůj model rozdělil stejně. Podobu mého finálního modelu Aylie, včetně topologie jeho sítě, ukazuje obrázek 3.4.
Obrázek 3.4: Finální nízkopolygonový model Aylie.
3.1.4
3D snímání
V současné době se pro tvorbu modelů lidských postav začíná rozšiřovat technika 3D snímání. Ta umožňuje automaticky převést podobu živého herce na 3D model ve vysokém rozlišení (z velkého množství polygonů). Z velké míry tak nahrazuje ruční tvorbu 3D modelů (ne zcela, protože nasnímané modely bývá pořád třeba upravit). Systém pracuje na principu fotogrammetrie, který vypočítává polohu jednotlivých bodů v prostoru na základě fotografií daného objektu pořízených z různých úhlů. Průkopníkem v této oblasti byla firma Infinite Realities, která se tvorbou těchto snímacích systémů zabývá. Například jeden z jejich systémů je sestaven ze 150 synchronizovaných digitálních fotoaparátů, které jsou rozmístěny ve studiu, díky čemuž je 16
3. Realizace charakteru možné snímat objekt velice rychle a přesně. Jak takové studio vypadá ukazuje obrázek 3.5. Existují však již i méně přesná softwarová řešení, která umožňují vytvářet 3D objekt na základě fotografií pořízených i v domácích podmínkách.
Obrázek 3.5: Studio snímacího systému Infinite Realities [O-2]. Vzhledem ke snižujícím se nákladům na pořízení nasnímaných modelů se tedy dá očekávat, že se bude tato technika dále rozšiřovat. Techniku využívají například vývojáři Zaklínače 3 [H-8], kteří snímají modely postav pro videosekvence. Ryse [H-3] využívá 3D snímání i pro modely postav přímo ve hře [L-14]. Pomocí této techniky je možné připravit opravdu velmi realistické modely, jak ukazuje obrázek 3.6. S tím je nicméně spojen jeden problém, na který upozornili Roman Hladík a Jan Zelený na přednášce Trendy v grafice počítačových her [L-21]. Pokud jsou ve hře používány takto realistické modely (nemusí se jednat nutně jen o modely postav), vytváří to vyšší nároky na všechny ostatní objekty ve hře, aby mezi nimi nebyl příliš velký rozdíl v úrovni detailů, kvůli čemuž by hra působila nekonzistentně. A příprava detailnějších objektů znamená zvýšení celkových nákladů. 17
3. Realizace charakteru
Obrázek 3.6: Obrázek modelu vytvořeného pomocí 3D snímání a jeho render [O-1, O-5].
3.2
Texturování
Při přípravě UV mapování pro textury jsem postupoval standardním způsobem, který popisuje článek [L-33]. Texturování samotné jsem pak prováděl v kombinaci programů Autodesk Mudbox a Adobe Photoshop. Hlavní zdrojové soubory, které jsem pro textury využil, jsou ze stránek 3D.sk [3d-sk ], které nabízejí širokou škálu referenčních fotografií. Kromě nich jsem použil ještě [O-4, O-3].
3.3
Zpracovaná postava
Během práce na charakteru mi bohužel docházel čas před odevzdáním práce. Mohl jsem tak dokončit pouze velmi omezený počet úkolů, které jsem si stanovil. Více jsem se věnoval praktické části práce, díky 18
3. Realizace charakteru tomu jsem Aylie přidal šaty. Výsledný model, který se mi povedlo před odevzdáním práce zpracovat je zobrazen na obrázcích 3.7 a 3.8. Pro dokončení modelu by bylo ještě potřeba dokončit práci na texturách a hlavně přidat rusalce vlasy.
19
3. Realizace charakteru
Obrázek 3.7: Obrázek realizovaného modelu Aylie. 20
3. Realizace charakteru
Obrázek 3.8: Obrázek realizovaného modelu Aylie. 21
4 LiteKeys 4.1
Motivace vzniku LiteKeys
Grafický tablet je velice užitečný nástroj pro širokou řadu grafických projektů. Jako zjevný příklad bych uvedl digitální malbu. Já osobně tablet používám poměrně často. Avšak při delší práci s ním jsem začal pociťovat únavu levé ruky, kterou mačkám klávesové zkratky. Jsem přesvědčen, že je to do jisté míry způsobeno špatnou ergonomií práce. Tablet totiž na stole zabírá poměrně hodně místa a klávesnice musí být posunutá více dozadu. Musím mít proto nataženou ruku, abych na klávesnici dosáhl. To není zcela v souladu se správným držením těla pro prevenci RSI [L-9]. Začal jsem proto hledat způsob, jak toto uspořádání vylepšit, protože klávesové zkratky jsou důležité pro efektivní práci. Bylo mi doporučeno zařízení Razer Nostromo (respektive nové modely Razer Orbweaver nebo Tartarus), což je v podstatě malá klávesnice s programovatelnými klávesami. Tato klávesnice by zřejmě poskytovala ideální řešení, protože by mohla být umístěna vedle tabletu v pohodlném dosahu. Nevýhodou tohoto zařízení je však jeho relativně vysoká cena (levnější model Razer Tartarus se prodává přibližně za 1 900 Kč). Při hledání levnější varianty mě napadlo, zda by tuto funkci mohla zastat obyčejná numerická klávesnice (jejichž ceny se pohybují okolo 100– 200 Kč). Jak by mělo vypadat zamýšlené vylepšené uspořádání pracovního místa ukazuje obrázek 4.1. Pro to jsem potřeboval najít software pro operační systém Windows, který by umožňoval nastavit klávesové zkratky pro tuto klávesnici. Pouze přiřadit klávesové zkratky různých aplikací na vybrané klávesy (za předpokladu, že by to bylo v dané aplikaci vůbec možné) nebo nastavit obecně klávesové zkratky na tyto klávesy pro všechny klávesnice by bylo nevyhovující, protože by to znemožnilo používat tyto klávesy na hlavní klávesnici například pro zadávání číselných hodnot. Software, který by odpovídal mým požadavkům, se mi podařilo najít pouze jeden a to Quick Macros [L-19]. Jedná se však o software licencovaný (s cenou 60 dolarů). Celkové náklady na toto řešení by se tedy blížily ceně specializované klávesnice. Navíc program působí dojmem, že jeho nastavování je poměrně komplikované (je to 22
4. LiteKeys
Obrázek 4.1: Ergonomičtější uspořádání pracovního místa díky druhé připojené klávesnici však pouze můj dojem, neboť jsem toto řešení zavrhl kvůli ceně a nezkoušel jsem s programem pracovat). Jediný další software, který umožňuje nastavit klávesové zkratky pro konkrétní klávesnice, co se mi podařil najít, je HID macros [L-15]. Tento software je dostupný zdarma, má však jeden zásadní nedostatek. Neumožňuje totiž nastavit rozdílné klávesové zkratky pro různé aplikace. Vzhledem k tomu, že je běžné pracovat s více aplikacemi, by bylo nastavování obecně platných klávesových zkratek značně komplikované. Tento nedostatek je možné obejít použitím dalšího programu pro správu klávesových zkratek, který umí rozlišovat aktivní aplikace, jako je například AutoHotkey [L-2]. Spouštění klávesových zkratek pak funguje tak, že nejprve HID macros určí, na které klávesnici byla klávesa zmáčknuta a simuluje místo ní stisk jiné speciální klávesy, která se běžně nepoužívá. Tuto speciální klávesu zachytí AutoHotkey a vykoná požadovanou akci pro aktivní aplikaci. Tento postup je neefektivní, protože pro každou klávesovou zkratku musí být simulována klávesová událost navíc. Další nevýhodou je to, že nasta23
4. LiteKeys vovat dva programy současně není zrovna pohodlné. Navíc nastavování AutoHotkey se velice blíží programování ve skriptovacím jazyku, což může být pro některé grafiky, kteří nemají s programováním zkušenosti, odrazující. Vzhledem k tomu, že se mi nepodařilo najít vhodné dostupné řešení, rozhodl jsem se takový software sám vytvořit, protože věřím, že může spoustě grafiků usnadnit práci. Měl by umožnit přiřazení klávesových zkratek pro konkrétní klávesnici a konkrétní aplikaci. Také by měl být jednoduše nastavitelný.
4.2
Zpracování klávesového vstupu
Pro návrh programu pro správu klávesových zkratek, který jsem nastínil v předchozí podkapitole 4.1, je zcela zásadní to, jakým způsobem bude zpracovávat klávesové události. Systém Windows nabízí několik možností, jak pracovat s klávesovým vstupem. Ty je možné na základě článku [L-6] rozdělit do dvou hlavních kategorií. 4.2.1
Metody zpracování vstupu na úrovni jádra
Tyto metody vesměs obnáší tvorbu nebo úpravu ovladačů klávesnic. Pravděpodobně nejvhodnější pro moje účely by byl Keyboard Class Filter Driver, který by upravoval funkci všech klávesnic. Nicméně nemám s tvorbou ovladačů žádné zkušenosti a tento postup se mi zdál poměrně složitý. Alternativní řešení by bylo použít knihovnu Interception [L-11], která nabízí takový ovladač s programovacím rozhraním. Problém však je v tom, že zdrojový kód tohoto ovladače není dostupný. Neměl bych tedy možnost ověřit, zda neobsahuje nějaký potencionálně škodlivý kód. Další nevýhodou těchto metod obecně je nutnost instalace daného ovladače, což by omezilo přenositelnost. 4.2.2
Metody zpracování vstupu na aplikační úrovni
V systému Windows je těchto metod k dispozici několik a výrazně se liší v tom, co všechno dokážou s klávesovým vstupem udělat. Pro můj navrhovaný program jsou důležité dva požadavky. Prvním je schopnost rozpoznat klávesnici, která byla pro daný vstup použita, jelikož to má být jedna z hlavních vlastností mého programu. Druhým je 24
4. LiteKeys schopnost daný klávesový vstup zablokovat, tedy zabránit tomu, aby klávesová událost byla zaznamenána aktivní aplikací. To je důležité z toho důvodu, aby se původní klávesový vstup neprojevil v aktivní aplikaci, když klávesa spustí nějakou klávesovou zkratku. A protože to, zda klávesa spustí nějakou klávesovou zkratku, může záviset na použité klávesnici, musí být tyto požadavky splněny současně. S přihlédnutím k tomuto jsou z metod zpracovávání vstupu na aplikační úrovni zajímavé následující dvě možnosti. 4.2.2.1 Raw Input Toto rozhraní poskytuje možnosti pro zpracování událostí z různých vstupních zařízení, mimo jiné i z klávesnic. Umožňuje vstupní zařízení identifikovat, je tedy možné pomocí tohoto rozhraní určovat, která klávesnice byla použita pro daný vstup. Druhý požadavek však toto rozhraní nesplňuje, protože neumí klávesové vstupy blokovat. 4.2.2.2 Hook Hook je mechanismus, který umožňuje programu zachytávat různé události v systému, včetně událostí souvisejících s klávesovým vstupem. Pro to jsou nejvhodnější typy Keyboard Hook (WH_KEYBOARD) a Low Level Keyboard Hook (WH_KEYBOARD_LL). Takto zachycené události je možné blokovat a zabránit tak tomu, aby je systém dál šířil a zpracovával. Pomocí tohoto mechanismu však není pro klávesové události možné určit, na které klávesnici byly klávesy stisknuty. 4.2.2.3 Kombinace rozhraní Ani jedna z metod zpracování vstupu na aplikační úrovni nesplňuje oba požadavky. Když jsem hledal možnosti, jak tento problém obejít, našel jsem příspěvek v diskusi od Petra Medka, autora programu HID macros [L-15]. Naznačoval, že je možné výše uvedené metody zkombinovat. Daný postup se mi nepodařilo najít v žádné oficiální dokumentaci, ani v jiných zdrojích. Poradil jsem se proto s autorem a požádal o jeho svolení tento postup použít pro svůj program a veřejně jej zdokumentovat, s čímž pan Medek souhlasil. 25
4. LiteKeys
4.3
Kombinování Raw Input a Keyboard Hook
Jak jsem uvedl výše v odstavci 4.2.2.3, kombinace rozhraní Raw Input a mechanismu Keyboard Hook je jedinou možností, kterou se mi podařilo najít, jak rozpoznat klávesnici použitou pro klávesovou událost a současně mít možnost tuto událost zablokovat, aniž by bylo nutné pracovat s ovladači. Neboť tento postup nebyl doposud nikde zdokumentován a považoval jsem ho za potencionálně užitečný pro další vývojáře, rozhodl jsem se jeho popisu věnovat část svojí diplomové práce. Pro praktickou demonstraci tohoto principu jsem vytvořil jednoduchý demo projekt, který je zařazen v přiložených materiálech A.4. V následujícím textu budou použity ukázky kódu právě z tohoto demo projektu. Nejprve vždy proberu konkrétní záležitost v textu a pak uvedu část kódu, která jí odpovídá. Pro lepší orientaci je vždy u kódu vypsán název funkce a souboru, kde je daná pasáž umístěna. Se základním principem tohoto postupu mě obeznámil Petr Medek [L-15]. Další testování a návrhy řešení objevených problémů jsem však již zpracovával sám. 4.3.1
Základní princip
Podstatou této metody je použít rozhraní Raw Input pro identifikování klávesnice dané klávesové události, na základě čehož se rozhodne, zda má být tato klávesová událost zablokována. Samotné zablokování provádí pak mechanismus Keyboard Hook. V první řadě je tedy potřeba připravit rozhraní Raw Input a mechanismus Keyboard Hook. V případě Raw Input je to poměrně jednoduché, stačí se při spouštění programu přihlásit pro odběr zpráv daného typu zařízení pro všechna okna aplikací. // --- InitInstance ( Ho o ki n gR a w In p ut D e mo . cpp ) --// Register for receiving Raw Input for keyboards RAWINPUTDEVICE rawInputDevice [1]; rawInputDevice [0]. usUsagePage = 1; rawInputDevice [0]. usUsage = 6; rawInputDevice [0]. dwFlags = RIDEV_INPUTSINK ; rawInputDevice [0]. hwndTarget = hWnd ; R e g i s t e r R a w I n p u t D e v i c e s ( rawInputDevice , 1 , sizeof ( rawInputDevice [0]));
26
4. LiteKeys Program poté bude dostávat zprávy WM_INPUT pro každou klávesovou událost. Z parametrů těchto zpráv je pak možné určit o jakou klávesu se jedná, včetně toho jaká klávesnice byla pro daný vstup použita. Pro podrobnější popis rozhraní Raw Input viz [L-1]. // --- WndProc ( Ho o k in g Ra w I np u tD e mo . cpp ) --// Raw Input Message case WM_INPUT : { // ... // Get the virtual key code of the key and report it USHORT virtualKeyCode = raw - > data . keyboard . VKey ; USHORT keyPressed = raw - > data . keyboard . Flags & RI_KEY_BREAK ? 0 : 1; WCHAR text [128]; swprintf_s ( text , 128 , L " Raw Input : % X (% d )\ n " , virtualKeyCode , keyPressed ); Outpu tDebugSt ring ( text ); // ... // Prepare string buffer for the device name G e t R a w I n p u t D e v i c e I n f o ( raw - > header . hDevice , RIDI_DEVICENAME , NULL , & bufferSize ); WCHAR * stringBuffer = new WCHAR [ bufferSize ]; // Load the device name into the buffer G e t R a w I n p u t D e v i c e I n f o ( raw - > header . hDevice , RIDI_DEVICENAME , stringBuffer , & bufferSize ); // ... }
Nastavení Hook mechanismu je o něco složitější. Je totiž nutné použít typ Keyboard Hook (WH_KEYBOARD) [L-8], který musí být umístěn v dynamicky linkované knihovně, aby zachytával události i v ostatních aplikacích a ne pouze v programu samotném. Pro postup, jak takovou knihovnu vytvořit, můžu doporučit článek [L-16] (autor v příkladu pracuje s myší, nicméně postup pro klávesnici je velmi podobný). // --- InstallHook ( H o o k i n g R a w I n p u t D e m o D L L . cpp ) --BOOL InstallHook ( HWND hwndParent ) { //... // Register keyboard Hook hookHandle = SetWindowsHookEx ( WH_KEYBOARD ,
27
4. LiteKeys ( HOOKPROC ) KeyboardProc , instanceHandle , 0); if ( hookHandle == NULL ) { return FALSE ; } hwndServer = hwndParent ; return TRUE ; }
Pro základní účel mého programu není možné použít mechanismus Low Level Keyboard Hook (WH_KEYBOARD_LL), který by nemusel být umístěn v dynamicky linkované knihovně. Jeho zpracování totiž probíhá ještě předtím, než systém zasílá zprávy pro Raw Input rozhraní. Pokud by měl tedy Low Level Keyboard Hook klávesovou událost zablokovat, nebylo by možné identifikovat klávesnici pomocí Raw Input zprávy, kterou by systém nevytvořil. Keyboard Hook mechanismus funguje tak, že když nastane příslušná událost — stisk klávesy, systém zavolá zadanou proceduru. Podle hodnoty, kterou tato procedura vrátí, pak buď událost dále zpracovává, nebo její šíření zastaví. Pro to, aby Keyboard Hook mechanismus mohl využít rozhodnutí, zda danou klávesovou událost blokovat či nikoliv, musí komunikovat s řídícím programem, který zpracovává zprávy rozhraní Raw Input. K tomu je možné použít zaslání zprávy prostřednictvím funkce SendMessage. Řídící program pro tuto zprávu vrátí hodnotu, která určí, zda má mechanismus Keyboard Hook událost zablokovat. // --- KeyboardProc ( H o o k i n g R a w I n p u t D e m o D L L . cpp ) --// Keyboard Hook procedure static LRESULT CALLBACK KeyboardProc ( int code , WPARAM wParam , LPARAM lParam ) { // ... // Report the event to the main window . If the return // value is 1 , block the input ; otherwise pass it along // the Hook Chain if ( SendMessage ( hwndServer , WM_HOOK , wParam , lParam )) { return 1; } return CallNextHookEx ( hookHandle , code , wParam , lParam ); }
28
4. LiteKeys Řídící program tedy dostává dva typy zpráv. Zprávy WM_INPUT pro Raw Input rozhraní, ze kterých je možné určit, která klávesnice byla pro daný vstup použita, a na základě toho rozhodnout, zda tato událost má být zablokována. A zprávy, které zasílá procedura Keyboard Hook mechanismu z dynamicky linkované knihovny, umožňující vrácením odpovídající hodnoty danou událost zablokovat, nebo nechat systém, aby ji předal aktivní aplikaci. // --- WndProc ( Ho o k in g Ra w I np u tD e mo . cpp ) --// Message from Hooking DLL case WM_HOOK : { USHORT virtualKeyCode = ( USHORT ) wParam ; USHORT keyPressed = lParam & 0 x80000000 ? 0 : 1; WCHAR text [128]; swprintf_s ( text , 128 , L " Hook : % X (% d )\ n " , virtualKeyCode , keyPressed ); Outpu tDebugSt ring ( text ); BOOL blockThisHook = FALSE ; //... // Apply the decision if ( blockThisHook ) { swprintf_s ( text , 128 , L " Keyboard event : % X (% d ) is being blocked !\ n " , virtualKeyCode , keyPressed ); Outpu tDebugSt ring ( text ); return 1; } return 0; }
V ideálním případě, kdy řídící program obdrží vždy zprávu Raw Input rozhraní následovanou zprávou pro Keyboard Hook mechanismus jedné klávesové události, by stačilo pro tuto zprávu vrátit hodnotu určenou při zpracování oné poslední Raw Input zprávy. To je ale bohužel pouze ideální scénář, který při běžném provozu velmi často neplatí. Z tohoto důvodu je nutné zavést různá protiopatření, která případné problematické situace řeší. 29
4. LiteKeys 4.3.2
Nejdůležitější protiopatření
Jak jsem předeslal výše, řídící program ne vždy obdrží zprávy v ideálním pořadí. Uvedu zde jednotlivé problémové situace, o kterých z testování vím, že mohou nastat, a návrh postupu, jak tyto situace řešit. 4.3.2.1 Ukládání Raw Input rozhodnutí Při rychlém sledu klávesových událostí se často stává, že řídící program obdrží více zpráv Raw Input rozhraní a až poté odpovídající zprávy pro Keyboard Hook mechanismus. Není tedy možné používat rozhodnutí, zda událost blokovat či nikoliv, pouze na základě poslední zpracované Raw Input zprávy. Místo toho je nutné při zpracování Raw Input zprávy, určit, jestli má být tato událost zablokována, a toto rozhodnutí uložit do fronty v paměti. Poté je pro příchozí Keyboard Hook události patřičné rozhodnutí vytaženo z této fronty. // --- WndProc ( Ho o k in g Ra w I np u tD e mo . cpp ) --// Raw Input Message case WM_INPUT : { // ... // Check whether the key struck was a "7" on a numeric // keyboard , and remember the decision whether to block // the input if ( virtualKeyCode == 0 x67 && wcscmp ( stringBuffer , n u m e r i c K e y b o a r d D e v i c e N a m e ) == 0) { decisionBuffer . push_back ( TRUE ); } else { decisionBuffer . push_back ( FALSE ); } // ... } // --- WndProc ( Ho o k in g Ra w I np u tD e mo . cpp ) --// Message from Hooking DLL case WM_HOOK : { // ... // Check the buffer if this Hook message is supposed to
30
4. LiteKeys // be blocked ; return 1 if it is BOOL blockThisHook = FALSE ; if (! decisionBuffer . empty ()) { blockThisHook = decisionBuffer . front (); decisionBuffer . pop_front (); } // ... }
4.3.2.2 Chybějící Keyboard Hook zpráva Může se stát, že pro některé klávesové události řídící program vůbec neobdrží Keyboard Hook zprávu, ale obdrží pro ni Raw Input zprávu. S touto situací se setkávám například při použití klávesové zkratky Ctrl + Esc. Chybějící zpráva Keyboard Hook by způsobila, že rozhodnutí, která program ukládá při zpracování Raw Input zpráv, by přestaly odpovídat Keyboard Hook zprávám. Rozhodnutí pro chybějící Keyboard Hook zprávu je totiž uloženo do fronty, ale použije jej následující Keyboard Hook událost, pro kterou je určeno až další uložené rozhodnutí ve frontě. Tento posun by se pak projevil pro každou další událost. Možným řešením tohoto problému je ukládat do fronty ne pouze samotné rozhodnutí, ale také virtuální kód klávesy (a případně i příznak stisku nebo uvolnění klávesy) události, pro kterou je rozhodnutí určeno. Pro příchozí zprávy Keyboard Hook procedury je pak vždy použito rozhodnutí pro odpovídající virtuální kód klávesy. Když je při výběru z fronty nějaké rozhodnutí přeskočeno, je z fronty rovnou odstraněno, aby nebylo později použito pro nesprávnou klávesovou událost. Lze totiž předpokládat, že pro toto přeskočené rozhodnutí bude Keyboard Hook zpráva chybět. Během testování jsem se nesetkal s případem, že by bylo pořadí zpráv prohozeno (tedy například že by program obdržel zprávy Raw Input rozhraní pro klávesy v pořadí A a B a zprávy Keyboard Hook v pořadí B a A). Tento předpoklad by neplatil také pro situaci, kdy by chyběla zpráva pro Raw Input rozhraní. To je však samo o sobě závažný problém, o kterém budu psát podrobněji níž v části 4.3.2.4. // --- ( H o ok i ng R a wI n pu t D em o . h ) --struct DecisionRecord
31
4. LiteKeys { USHORT virtualKeyCode ; BOOL decision ; DecisionRecord ( USHORT _virtualKeyCode , BOOL _decision ) : virtualKeyCode ( _virtualKeyCode ) , decision ( _decision ) {} }; // --- WndProc ( Ho o k in g Ra w I np u tD e mo . cpp ) --// Message from Hooking DLL case WM_HOOK : { // ... // Check the buffer if this Hook message is supposed to // be blocked ; return 1 if it is BOOL blockThisHook = FALSE ; BOOL recordFound = FALSE ; UINT index = 1; if (! decisionBuffer . empty ()) { // Search the buffer for the matching record std :: deque < decisionrecord >:: iterator iterator = decisionBuffer . begin (); while ( iterator != decisionBuffer . end ()) { if ( iterator - > virtualKeyCode == virtualKeyCode ) { blockThisHook = iterator - > decision ; recordFound = TRUE ; // Remove this and all preceding messages from // the buffer for ( int i = 0; i < index ; ++ i ) { decisionBuffer . pop_front (); } // Stop looking break ; } ++ iterator ; ++ index ; } } // ... }
32
4. LiteKeys K nepřesnému zpracování vlivem chybějící Keyboard Hook zprávy stále může dojít, když po sobě následují dvě klávesové události stejné klávesy, z nichž jedna má být blokována a druhá ne. Tuto situaci se mi nepodařilo nijak uspokojivě řešit, nicméně se jedná o velmi okrajový případ. 4.3.2.3 Čekání na Raw Input zprávu Většinou platí, že řídící program obdrží pro danou klávesovou událost nejprve zprávu Raw Input rozhraní a poté zprávu od Keyboard Hook procedury. To znamená, že při zpracování Keyboard Hook zprávy byla již Raw Input zpráva zpracována a rozhodnutí pro danou klávesovou událost je již připraveno ve frontě a může být okamžitě použito. Může se však stát, že programu přijde jako první zpráva Keyboard Hook. V takovém případě nebude při jejím zpracování ve frontě nalezeno odpovídající rozhodnutí. Program tak musí čekat s odpovědí na Keyboard Hook zprávu, než mu odpovídající zpráva Raw Input přijde a vyhodnotí ji. Pro kontrolování příchozích zpráv je možné použít funkci PeekMessage. // --- WndProc ( Ho o k in g Ra w I np u tD e mo . cpp ) --// Message from Hooking DLL case WM_HOOK : { // ... // The decision hasn ’ t been found in the buffer if (! recordFound ) { MSG rawMessage ; // Waiting for the next Raw Input message while (! PeekMessage (& rawMessage , mainHwnd , WM_INPUT , WM_INPUT , PM_REMOVE )) { } // The Raw Input message has arrived ; // decide whether to block the input // ... } // ... }
33
4. LiteKeys 4.3.2.4 Chybějící Raw Input zpráva Vzhledem k tomu, že je možné, že pro některé události obdrží řídící program pouze zprávu Keyboard Hook a nikoliv zprávu od Raw Input rozhraní, je nutné omezit dobu, po kterou řídící aplikace čeká na odpovídající Raw Input událost. Po uplynutí této doby je čekání ukončeno s tím, že pro danou klávesovou událost není možné získat patřičné rozhodnutí. K tomuto dochází například při stisku klávesy Windows (s aktivním českým QWERTZ rozložením klávesnice), kdy program obdrží navíc událost Keyboard Hook pro klávesu Ctrl. // --- WndProc ( Ho o k in g Ra w I np u tD e mo . cpp ) --// Message from Hooking DLL case WM_HOOK : { // ... // Wait for the matching Raw Input message if the // decision buffer was empty or the matching record // wasn ’ t there DWORD currentTime , startTime ; startTime = GetTickCount (); while (! recordFound ) { MSG rawMessage ; while (! PeekMessage (& rawMessage , mainHwnd , WM_INPUT , WM_INPUT , PM_REMOVE )) { // Test for the maxWaitingTime currentTime = GetTickCount (); // If current time is less than start , // the time rolled over to 0 if (( currentTime < startTime ? ULONG_MAX startTime + currentTime : currentTime startTime ) > maxWaitingTime ) { // Ignore the Hook message , if the limit exceeded // ... return 0; } } // ... } // ... }
34
4. LiteKeys Chybějící nebo opožděné Raw Input zprávy považuji za největší problém tohoto řešení, neboť čekání na odpovídající Raw Input zprávu se projeví zdržením zpracování klávesového vstupu, což může být pro uživatele citelné. Je proto vhodné volit maximální dobu čekání na Raw Input zprávu nejvýše v řádu desítek milisekund. Naštěstí je možné některým situacím, které se projevují chybějící Raw Input zprávou, předcházet (viz následující podkapitola 4.3.3). 4.3.3
Předcházení problémům
Je několik situací, při kterých dochází k výše zmíněnému problému s chybějící zprávou Raw Input. V některých případech, které se chovají předvídatelně, je však možné potencionálním problémům předcházet. Tyto pokročilejší techniky již nepovažuji za nezbytné pro pochopení celého principu, proto již nejsou obsaženy v jednoduchém demo programu, který by se kvůli nim stal méně přehledným. 4.3.3.1 Klávesa AltGr Pro některá rozložení klávesnice je klávesa AltGr interpretována systémem jako kombinace kláves Ctrl + Alt. To se projeví tak, že řídícímu programu přijdou zprávy od Keyboard Hook procedury pro klávesy Ctrl a Alt. Zprávu pro Raw Input obdrží program však pouze jednu a to pro klávesu Alt. Tuto situaci je možné řešit při zpracovávání této Alt Raw Input zprávy tím, že program vloží rozhodnutí do fronty nejen pro onu klávesu Alt, ale také stejné rozhodnutí pro klávesu Ctrl. Tak bude při zpracování Keyboard Hook zpráv nalezeno rozhodnutí pro obě klávesy. 4.3.3.2 Nesmyslné Keyboard Hook události Při stisku některých kláves zaznamenává Keyboard Hook mechanismus jisté nadbytečné události. Například při stisku již zmíněné klávesy Windows dostane řídící program navíc Keyboard Hook zprávu pro klávesu Ctrl. Při prozkoumání této události je možné zjistit, že má nastavené příznaky, které říkají, že klávesa je uvolňována (TransitionState Flag) a že před touto událostí byla klávesa nestisknutá (Previous Key-State Flag). Tato kombinace příznaků je pro skutečnou kláveso35
4. LiteKeys vou událost nesmyslná. Je proto možné nastavit, aby zpracovávání Keyboard Hook zpráv tyto události ignorovalo a nečekalo tak zbytečně na zprávu Raw Input, která by nepřišla. Jediná klávesa, která se během mého testování takto nesmyslně objevovala, byla právě klávesa Ctrl.
4.3.3.3 Opakované Keyboard Hook události V některých situacích se stává, že Keyboard Hook mechanismus dostává několik stejných událostí po sobě pro jediný skutečný klávesový vstup. Například k tomu může dojít, když aplikace přejde do menu. V některých aplikacích k tomu dochází i méně předvídatelně. Každá takto opakovaná událost se snaží čekat na příchozí zprávu Raw Input, kterou však program obdrží pouze jednu pro každý skutečný klávesový vstup. Tomu se dá předejít tak, že si řídící program bude zaznamenávat poslední zpracovanou Keyboard Hook zprávu a pokud následně obdrží další stejnou zprávu, použije pro ni i stejné rozhodnutí za předpokladu, že není žádné rozhodnutí pro tuto událost uloženo ve frontě (opakované Keyboard Hook zprávy mohou být i žádoucí, například při držení klávesy stisknuté).
4.3.4
Speciální klávesy
Určité klávesy, které mají nějakou speciální funkci, jako například klávesa Kalkulačka, není možné zablokovat pomocí mechanismu Keyboard Hook. Pro jejich blokování je třeba použít Low Level Keyboard Hook, důsledkem čehož není možné rozpoznat klávesnici, na které byla klávesa zmáčknuta, jak jsem vysvětloval při představení tohoto principu v podkapitole 4.3.1. Pro mnou navržený program je tedy možné tyto klávesy použít ke spouštění klávesových zkratek pouze jednotně pro všechny klávesnice. Funkci některých kláves však není možné zablokovat ani pomocí Low Level Keyboard Hook mechanismu. Příkladem jsou klávesové události, které spouští nějakou systémovou zkratku, nebo třeba klávesa Num Lock. 36
4. LiteKeys
4.4
Realizace LiteKeys
Pro implementaci nástroje LiteKeys jsem se rozhodl použít jazyk C++, protože s ním mám největší zkušenosti a navíc nabízí pohodlnou práci s aplikačním rozhraním Windows, ať už pro Raw Input nebo Keyboard Hook mechanismus. Chtěl jsem, aby byl nástroj v praxi co možná nejméně náročný, rozhodl jsem se ho proto rozdělit do dvou aplikací. Program LiteKeys řídí zpracování klávesových událostí a spouštění klávesových zkratek. Dal by se přirovnat ke službě, která běží na pozadí systému. Má proto pouze minimální uživatelské rozhraní v podobě ikony v oznamovací oblasti (pravá část hlavního panelu). Oproti tomu program LiteKeys Nastavení nabízí plně grafické uživatelské rozhraní, které slouží pro pohodlné nastavování klávesových zkratek a všech dalších funkcí nástroje. Tento program jsem vytvořil pomocí knihovny pro tvorbu uživatelských rozhraní Qt [L-18], kterou mohu doporučit. Obě komponenty využívají pro ukládání a načítání nastavení XML soubory, které zpracovávám pomocí knihovny pugixml Arsenyho Kapoulkineho [L-10].
4.5
Použití LiteKeys v praxi
Abych mohl vyhodnotit, zda LiteKeys přináší nějaké efektivní výsledky, analyzoval jsem dva záznamy z jeho praktického užívání. Ze záznamů získám následující údaje. Celkem stisknutých kláves Celkový počet kláves, které byly fyzicky zmáčknuty po dobu měření. Tento údaj získávám na základě počtu událostí uvolnění klávesy, protože v záznamu jsou opakovaně vypsány všechny klávesové události, tedy i pokud je klávesa držena stisknutá. Události uvolnění klávesy se neopakují a tak lépe vypovídají o celkovém počtu skutečně zmáčknutých kláves. Počet akcí LiteKeys Celkový počet akcí, které LiteKeys spustil. Tento počet určuje, kolik bylo maximálně stisknuto kláves pro vygenerování veškerého výstupu LiteKeys. Tento údaj je pouze horní hranice, 37
4. LiteKeys protože velmi často jedna klávesová zkratka použije víc než jednu akci. Počet vygenerovaných klávesových událostí Celkový počet klávesových událostí simulovaných LiteKeys pomocí akce Keys. Pro odhad, kolik fyzických stisků kláves jimi LiteKeys nahradil, je třeba toto číslo vydělit dvěma, protože většinou jsou simulovány události pro stisk i uvolnění klávesy. Počet znaků vygenerovaného textu Celkový počet znaků, které LiteKeys vypsal pomocí některé z textových akcí. U tohoto údaje většinou platí, že LiteKeys nahradil právě takový počet fyzických stisknutí kláves. V případě, že jsou v textu symboly, které by vyžadovaly více stisků fyzických kláves (velká písmena, speciální znaky), je počet nahrazených stisknutí ještě větší. Z těchto údajů poté vypočítám následující hodnoty, které by měly popisovat efektivitu LiteKeys. Odhad počtu ušetřených stisků kláves Určeno jako: počet vygenerovaných klávesových událostí / 2 + počet znaků vygenerovaného textu - celkový počet akcí LiteKeys. Předpokládané procento ušetřených stisků kláves Udává kolik procent stisků kláves bylo ušetřeno díky LiteKeys (oproti případu bez použití LiteKeys). Vypočítáno jako: odhad počtu ušetřených stisků / (celkový počet stisknutých kláves + odhad počtu ušetřených stisků) (převedeno na procenta). Počet ušetřených stisků kláves za minutu Udává počet odhadnutých ušetřených stisků kláves na jednu minutu práce. 4.5.1
Test — Mudbox
Prvním programem, se kterým jsem LiteKeys testoval je 3D aplikace Autodesk Mudbox. Při práci s touto aplikací většinou využívám grafický tablet, LiteKeys proto plnil svoji původně zamýšlenou úlohu. 38
4. LiteKeys Celkem stisknutých kláves Počet akcí LiteKeys Počet vygenerovaných klávesových událostí Počet znaků vygenerovaného textu Odhad počtu ušetřených stisků kláves Předpokládané procento ušetřených stisků kláves Počet ušetřených stisků kláves za minutu
306 300 774 0 87 22,14% 1,43
Z tabulky vyplývá, že počet ušetřených stisků kláves není nějak obrovský, zvlášť v přepočtu na minutu práce. Tento výsledek se dal předpokládat, neboť doplňková klávesnice v podstatě slouží pouze pro přesunutí klávesových zkratek. Co tato čísla neukazují je komfort, který zapojení doplňkové klávesnice přineslo. Ovládání programu je díky ní výrazně pohodlnější a velmi rychle jsem si na druhou klávesnici zvykl. 4.5.2
Test — LaTeX
Pro druhý test jsem zvolil práci zcela odlišnou od původního plánovaného záměru aplikace. Tou je značkování LaTeX dokumentu, konkrétně této diplomové práce. Práci jsem psal v běžném textovém editoru, nastavil jsem si proto na doplňkovou klávesnici zkratky pro výpis různých značek a prostředí. Celkem stisknutých kláves Počet akcí LiteKeys Počet vygenerovaných klávesových událostí Počet znaků vygenerovaného textu Odhad počtu ušetřených stisků kláves Předpokládané procento ušetřených stisků kláves Počet ušetřených stisků kláves za minutu
2 865 151 340 2 260 2 279 44,3% 26,19
Zde jsou číselné výsledky zajímavější. Díky LiteKeys se mi podařilo ušetřit téměř polovinu zmáčknutých kláves, které bych potřeboval k danému označkování dokumentu. Přičemž používání doplňkové klávesnice je stále poměrně pohodlné i při práci s hlavní klávesnicí počítače. Mohu proto LiteKeys doporučit i jako doplněk běžného pracovního prostředí, které nezahrnuje grafický tablet.
39
5 Závěr V rámci umělecké části svojí diplomové práce jsem se věnoval tvorbě videoherního charakteru. Pro charakter jsem vytvořil v rámci hry Zaklínač 3: Divoký hon [H-8] vedlejší dějovou linii, přičemž jsem kladl důraz na její příběhovou kvalitu. Poté jsem vytvořil 3D model tohoto charakteru metodou 3D sochání. Neboť takový model není přímo použitelný v rámci hry, převedl jsem jej na model, který nároky jádra zvolené hry splňuje. Dále jsem modelu vytvořil UV koordináty, potřebné pro jeho texturování. V této fázi práce mi však již docházel čas, neboť jsem přecenil svoje schopnosti. Přesto jsem ještě zvládl modelu vytvořit texturu hlavy a šaty. Pro jeho dokončení tak zbývá vytvořit mu vlasy a dodělat textury. Z tohoto důvodu je model prezentován pouze provizorně. A rovněž z tohoto důvodu jsem nestihl popsat celou tvorbu postavy v textové části práce, jak jsem měl v plánu. V rámci informatické části svojí práce jsem zdokumentoval postup, jakým je možné při zpracování klávesových událostí identifikovat klávesnici daného vstupu a zároveň mít možnost tento vstup zablokovat. Abych tento princip představil co nejširšímu počtu vývojářů, které by mohl zajímat, sepsal jsem jej v rámci svojí diplomové práce také v angličtině. Článek, včetně ukázek kódu a přiloženého demo projektu, jsem vystavil na serveru Code Project [L-4]. Článek již shlédlo přes patnáct tisíc lidí a dostává poměrně vysoké hodnocení. Na základě uvedeného postupu jsem vytvořil nástroj LiteKeys, který umožňuje přiřazovat klávesové zkratky několika současně připojeným klávesnicím. Z mojí osobní zkušenosti mohu říct, že nástroj plní svoji funkci velmi dobře, ovládání klávesových zkratek při používání grafického tabletu mi přijde výrazně pohodlnější. Nástroj je však užitečný i při jiných činnostech, jak jsem ukázal v podkapitole 4.5. Celkově si zatím nástroj vyzkoušelo kolem sto padesáti uživatelů, což nepovažuji za velké číslo. Možné příčiny mě napadají dvě. Jedna je skupina uživatelů, převážně 2D grafiků, která by o tento program měla zájem, ale pracují na operačních systémech firmy Apple, pro které není nástroj programován. Druhou, řekl bych zásadnější příčinou, jsou nedostatečně exponovaná místa, kde je nástroj vystaven. Umístil jsem nástroj na fóra, která se zaměřují na 3D grafiku, avšak do 40
5. Závěr technické sekce, jejíž návštěvnost není tak vysoká. Pro lepší rozšíření LiteKeys se tedy pokusím oslovit nějaké webové stránky, které se 3D grafikou zabývají, a prezentovat tam LiteKeys formou článku.
41
Seznam literatury [L-1] About Raw Input. Microsoft. url: http://msdn.microsoft. com/en-us/library/windows/desktop/ms645543.aspx (cit. 24. 05. 2015). [L-2] AutoHotkey. url: http://www.autohotkey.com/ (cit. 24. 05. 2015). [L-3]
Krzysztof Krzyscin Balázs Török. REDengine 3 Character Pipeline. 2013. url: http : / / advances . realtimerendering . com/s2013/ppt_Sig2013_CDPR_Characters_v10.ppt (cit. 24. 05. 2015).
[L-4]
Vít Blecha. Combining Raw Input and keyboard Hook to selectively block input from multiple keyboards. 2014. url: http : / / www.codeproject.com/Articles/716591/Combining-RawInput-and-keyboard-Hook-to-selective (cit. 24. 05. 2015).
[L-5]
Nic Carpenter. Guard: Update — Re-topology. 2011. url: https: / / hejiraproject . wordpress . com / 2011 / 04 / 20 / guard update-re-topology/ (cit. 24. 05. 2015).
[L-6]
Nikolay Grebennikov. Keyloggers: Implementing keyloggers in Windows. Part Two. 2011. url: http : / / securelist . com / analysis/publications/36358/keyloggers-implementingkeyloggers-in-windows-part-two/ (cit. 24. 05. 2015).
[L-7]
H. A. Guerber. Myths of the Norsemen. From the Eddas and Sagas. Project Gutenberg, 2009. url: http://www.gutenberg. org/files/28497/28497-h/28497-h.htm (cit. 24. 05. 2015).
[L-8] Hooks Overview. Microsoft. url: http : / / msdn . microsoft . com/en-us/library/ms644959.aspx#wh_keyboardhook (cit. 24. 05. 2015). [L-9] How to sit correctly. NHS. url: http://www.nhs.uk/Livewell/ workplacehealth/Pages/howtositcorrectly.aspx (cit. 24. 05. 2015). [L-10]
Arseny Kapoulkine. pugixml. url: http://pugixml.org/ (cit. 24. 05. 2015).
[L-11]
Francisco Lopes. Interception. url: http://www.oblita.com/ interception.html (cit. 24. 05. 2015).
[L-12]
Tomáš Mádr. Tvorba herního charakteru. 2009. 42
SEZNAM LITERATURY [L-13]
Niko Mäkelä. Modeling for animation —- Body. 2010. url: http: //www.cgmascot.com/design/modeling- for- animationbody/ (cit. 24. 05. 2015).
[L-14]
Lars Martinsson. Character Creation and Pipeline in Ryse: Son of Rome. 2014. url: http://www.crytek.com/download/Ryse_ SIGGRAPH_2014_Lars%20Martinsson_Character%20Creation% 20and%20Pipeline.pdf (cit. 24. 05. 2015).
[L-15]
Petr Medek. HID macros. url: http://www.hidmacros.eu/ (cit. 24. 05. 2015).
[L-16]
Joseph M. Newcomer. Hooks and DLLs. 2001. url: http : / / www . codeproject . com / Articles / 1037 / Hooks - and - DLLs (cit. 24. 05. 2015).
[L-17]
Usman Pirzada. Ryse Polygon Count Comparison with Other AAA Titles. 2013. url: http : / / wccftech . com / ryse - polygon count- comparision- aaa- titles- crysis- star- citizen/ (cit. 24. 05. 2015).
[L-18] Qt. Digia Plc. url: http://www.qt.io/ (cit. 24. 05. 2015). [L-19] Quick Macros. url: http://www.quickmacros.com/ (cit. 24. 05. 2015). [L-20]
Wayne Robson. Human Skeleton Anatomy Reference and Model. url: http : / / waynerobsondash . blogspot . cz / 2013 / 09 / human - skeleton - anatomy - reference - and . html (cit. 24. 05. 2015).
[L-21]
Jan Zelený Roman Hladík. Trendy v grafice počítačových her. Game Developers Session. 2014.
[L-22]
Andrzej Sapkowski. Zaklínač I. Poslední přání. Ostrava: Leonardo, 1999, s. 274. isbn: 80-85951-14-2.
[L-23]
Andrzej Sapkowski. Zaklínač II. Meč osudu. Ostrava: Leonardo, 2000, s. 348. isbn: 80-85951-23-1.
[L-24]
Andrzej Sapkowski. Krev elfů. Sága o zaklínači 1. Ostrava: Leonardo, 1995, s. 306. isbn: 80-85951-00-2.
[L-25]
Andrzej Sapkowski. Čas opovržení. Sága o zaklínači 2. Ostrava: Leonardo, 1996, s. 330. isbn: 80-85951-01-0.
[L-26]
Andrzej Sapkowski. Křest ohněm. Sága o zaklínači 3. Ostrava: Leonardo, 1997, s. 342. isbn: 80-85951-03-7. 43
SEZNAM LITERATURY [L-27]
Andrzej Sapkowski. Věž vlaštovky. Sága o zaklínači 4. Ostrava: Leonardo, 1998, s. 428. isbn: 80-85951-07-X.
[L-28]
Andrzej Sapkowski. Paní jezera. Sága o zaklínači 5. Ostrava: Leonardo, 2000, s. 562. isbn: 80-85951-19-3.
[L-29]
Jesse Schell. The Art of Game Design. A Book of Lenses. Elsevier, 2008, s. 489. isbn: 978-0-12-369496-6.
[L-30]
Scott Spencer. Zbrush Digital Sculpting Human Anatomy. Wiley Publishing, 2010. isbn: 978-0-470-45026-0.
[L-31]
Bryan Tillman. Creative Character Design. Focal Press, 2011, s. 224. isbn: 978-0-240-81495-7.
[L-32]
Brian Tindall. Modeling for Articulation. 2013. url: http : / / www.hippydrome.com/MeshDesignFace.html (cit. 24. 05. 2015).
[L-33]
Antony Ward. Game Character Creation Series: Kila Chapter 3 –– UV Mapping. 2013. url: http : / / cgi . tutsplus . com / tutorials/game-character-creation-series-kila-chapter3-uv-mapping--cg-26754 (cit. 24. 05. 2015).
[L-34]
Ethel Mary Wilmot-Buxton. Told by the Northmen: Stories from the Eddas and Sagas. Project Gutenberg, 2009. url: http : / / www.gutenberg.org/files/29551/29551- h/29551- h.htm (cit. 24. 05. 2015).
44
Seznam her [H-1]
BioWare. Dragon Age II. [PC, PlayStation 3, Xbox 360]. Dragon Age II. 2011.
[H-2]
Naughty Dog. The Last of Us. [PlayStation 3, PlayStation 4]. The Last of Us. 2013.
[H-3]
Crytek Frankfurt. Ryse: Son of Rome. [PC, Xbox One]. Ryse: Son of Rome. 2013.
[H-4]
PopCap Games. Bejeweled. [PC, Online]. Bejeweled. 2001.
[H-5]
Michael S. Gentry. Anchorhead. [Z-machine]. Anchorhead. 1998.
[H-6]
CD Projekt RED. Zaklínač. [PC]. The Witcher. 2007.
[H-7]
CD Projekt RED. Zaklínač 2: Vrahové králů. [PC, Xbox 360]. The Witcher 2: Assassins of Kings. 2011.
[H-8]
CD Projekt RED. Zaklínač 3: Divoký hon. [PC, PlayStation 4, Xbox One]. The Witcher 3: Wild Hunt. 2015.
45
Seznam převzatých obrázků [O-1]
3D snímek obličeje. url: http://www.fxguide.com/wp-content/ uploads/2014/03/agisoft_john_neutral_shaded.jpg (cit. 24. 05. 2015).
[O-2]
Infinite Realities studio. url: http://www.3dtotal.com/admin/ new_cropper/interview_content_images/24_tid_02.JPG (cit. 24. 05. 2015).
[O-3]
Obočí. url: http://jennbizzle.com/wp-content/uploads/ 2014/01/eyebrow.jpg (cit. 24. 05. 2015).
[O-4]
Oko. url: http : / / i . dleno . de / destatic / topic - 2549 setting-up-eye-posing-in-source.html (cit. 24. 05. 2015).
[O-5]
Ryse: Son of Rome — obličej získaný pomocí 3D snímání. url: http : / / www . fxguide . com / wp - content / uploads / 2014 / 03/mariusHead_v1.jpg (cit. 24. 05. 2015).
[O-6]
The Last of Us. url: http://media.aintitcool.com/media/ uploads/2013/nordling/thelastofus.jpg (cit. 14. 05. 2015).
[O-7]
Zaklínač 3: Divoký hon. url: http : / / www . dualshockers . com/wp- content/uploads/2014/01/Witcher3- 3.png (cit. 14. 05. 2015).
46
A Přiložené soubory A.1
Píseň za soumraku — příběh o Aylie
PisenZaSoumraku.zip Zpracovaný příběh o Aylie prezentovaný formou interaktivního vyprávění.
A.2
Lidská kostra
HumanSkeleton.zip 3D model kostry, který jsem přezval a upravil z [L-20].
A.3
3D model Aylie
AylieModel.zip Veškeré materiály související s tvorbou 3D modelu charakteru Aylie.
A.4
Raw Input a Keyboard Hook demo program
HookingRawInputDemo.zip Zdrojové kódy jednoduchého programu ilustrujícího popisovaný princip kombinace rozhraní Raw Input a Keyboard Hook.
A.5
LiteKeys zdrojové kódy
LiteKeysSourceCode.zip Zdrojové kódy vytvořené aplikace LiteKeys.
A.6
Program LiteKeys verze 1.0
LiteKeysVersion1.0.zip Zkompilovaný vytvořený program LiteKeys připravený k používání. 47
A. Přiložené soubory
A.7
Uživatelská příručka LiteKeys
LiteKeysUsersGuide.zip Uživatelská příručka programu LiteKeys.
48