}w !"#$%&'()+,-./012345
Masarykova univerzita Fakulta informatiky
Interaktivní silové cvičení se zařízením Kinect
Bakalářská práce
Matěj Mrázek
Brno, jaro 2012
Prohlášení Prohlašuji, že tato bakalářská 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.
Matěj Mrázek
Vedoucí práce: Mgr. Igor Chalás ii
Poděkování Předně bych chtěl poděkovat vedoucímu bakalářské práce Mgr. Igoru Chalásovi za odbornou pomoc a čas, který mi věnoval. Dále děkuji Mgr. Adamu Jurčíkovi za odborné rady, které mi k bakalářské práci poskytl. Velké díky také patří mým rodičům a prarodičům za psychickou a finanční podporu během studia.
iii
Shrnutí Tato bakalářská práce se zaobírá problematikou snímání pohybu uživatele cvičícího s jednoručními činkami prostřednictvím zařízení Kinect. To poskytuje prostorová data pro animaci trojrozměrného modelu, který kopíruje pohyb cvičence. Aplikace kontroluje kvalitu techniky prováděného cviku a na případné nedostatky upozorňuje uživatele. Výsledky cvičení jsou uchovávány pro pozdější účely. Ovládání aplikace je zajištěno pomocí hlasových příkazů a klávesnice.
iv
Klíčová slova počítačová animace, Kinect, snímání pohybu, tvorba kostry, skinning, cvičení, rozpoznávání řeči
v
Obsah Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Použité technologie . . . . . . . . . . . . . . . 1.1 Použité technologie a důvody jejich výběru . 1.1.1 C# . . . . . . . . . . . . . . . . . . . 1.1.2 XNA . . . . . . . . . . . . . . . . . . 1.1.3 Blender . . . . . . . . . . . . . . . . 1.1.4 Kinect . . . . . . . . . . . . . . . . . 1.1.5 Adobe Photoshop . . . . . . . . . . . 2 Příprava modelu . . . . . . . . . . . . . . . . . 2.1 Mesh modelu . . . . . . . . . . . . . . . . . 2.2 Aplikace materiálu a textur . . . . . . . . . 2.3 Stavba kostry . . . . . . . . . . . . . . . . . 2.4 Skinning . . . . . . . . . . . . . . . . . . . . 2.5 Export modelu . . . . . . . . . . . . . . . . 3 Práce s modelem . . . . . . . . . . . . . . . . . 3.1 Způsoby počítačové animace . . . . . . . . . 3.2 Předdefinovaná animace versus volný pohyb 3.3 Snímání pohybu (Motion capture) . . . . . . 3.3.1 Mechanická zařízeníi . . . . . . . . . 3.3.2 Magnetická zařízení . . . . . . . . . . 3.3.3 Optické snímací systémy . . . . . . . 3.3.4 Snímání pohybu zařízením Kinect . . 3.4 Získání prostorových dat ze zařízení Kinect . 3.5 Využití dat pro animaci modelu . . . . . . . 4 Cvičení (trénink) . . . . . . . . . . . . . . . . . 4.1 Důležité pojmy . . . . . . . . . . . . . . . . 4.2 Volba cviků . . . . . . . . . . . . . . . . . . 4.3 Implementace cviků, omezující podmínky . . 5 Uživatelské rozhraní . . . . . . . . . . . . . . . 5.1 Návrh rozhraní . . . . . . . . . . . . . . . . 5.2 Hlasové příkazy, vstup z klávesnice . . . . . Závěr . . . . . . . . . . . . . . . . . . . . . . . . . . Literatura . . . . . . . . . . . . . . . . . . . . . . . . Přílohy . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 2 2 3 3 4 4 5 6 6 7 9 11 12 14 14 16 17 17 17 18 18 20 21 24 24 25 26 29 29 30 32 33 34
vi
Úvod Spolu s rozvojem informačních technologií vznikají i nová zařízení, která v mnoha směrech usnadňují lidem život. Tato zařízení lze v dnešní době využít například v oblasti zdravého životního stylu. Udržovat si krásnou postavu pravidelným cvičením není nic jednoduchého, nicméně existují přístroje, jež mohou posloužit k dosažení lepších cvičebních výsledků. Příkladem takové pomůcky je aparát zvaný Kinect. Kinect umožňuje snímat pohyb v trojrozměrném prostoru, zaznamenávat hlasové povely a s těmito daty dále pracovat. Primárně byl určen jako ovladač pro herní konzoli Xbox 360, ale díky pořizovací ceně a potenciálu, který skrývá, se stal oblastí zájmu mnoha nadšenců z oblasti informatiky, a začal být využíván jak pro počítačové hry tak i pro aplikace. Hlavním smyslem bakalářské práce bylo navrhnout aplikaci, která bude využívána pro zefektivnění domácího silového cvičení. Mým dalším, neméně důležitým cílem, byla možnost přirozené a pohodlné interakce s programem. Uživatelské prostředí jsem proto zcela uzpůsobil k ovládání hlasem. Cvičenec si vybere jeden z předchystaných cviků. Po jeho zvolení zadá váhu, se kterou cvičí, a pustí se do tréninku. Kinect sleduje, jak uživatel cvičí s činkami a tato data předává k dalšímu zpracování aplikaci. Ta kontroluje, jestli není technika provádění daného cviku nesprávná. V případě, že tomu tak je, o tom informuje a poradí, jak cvik provádět správně. Dále zaznamenává počet sérií a opakování. Tato data jsou následně ukládána do databáze a zároveň jsou z nich sestaveny statistiky pro uživatele. Protože je většina populace příliš pohodlná a jejich zájem o cvičení po čase opadne, je motivace v tomto směru klíčová. Aplikace byla proto navržena tak, aby obsahovala co nejvíce prvků, jež donutí uživatele k opětovnému tréninku a zároveň jej činila zábavnějším a efektivnějším. Příkladem mohou být statistiky cvičení, kde má uživatel možnost procházet výsledky všech dosavadních tréninků, sledovat svůj rozvoj a zlepšení a vidět tak přímou odezvu na jeho snahu.
1
1 Použité technologie V této kapitole nejprve obecně zmíním jednotlivé technologie, které ve své aplikaci použivám a rozeberu důvody, jenž mě vedly k jejich výběru. Následně z nich podrobněji rozeberu ty méně známé a vysvětlím, k čemu je ve své práci používám.
1.1 Použité technologie a důvody jejich výběru Aplikace byla navržena a implementována v programovacím jazyce C# [1]. Důvodem výběru tohoto jazyka byl fakt, že Kinect stejně jako C# pochází z dílny společnosti Microsoft, který v červnu roku 2011 uvolnil oficiální SDK (Software development kit – sada nástrojů umožňujících tvorbu programů pro konkrétní systém či zařízení) pro C# umožňující psát aplikace v tomto jazyce, a tudíž je zaručena správná funkcionalita algoritmu napsaného pro toto zařízení. Jazyk je také široce rozšířený, a tudíž k němu existuje spousta literatury včetně kvalitní dokumentace. Grafické uživatelské rozhraní bylo navrženo na vývojářské platformě XNA [6], která umožňuje vývoj her a kterou lze doinstalovat do Microsoft Visual Studia. XNA též pochází od vývojářů ze společnosti Microsoft a je tak zaručena kompatibilita se zařízením Kinect a C#, což bylo jedním z hlavních důvodů výběru. Trojrozměrný model postavy, který je použit v mé aplikaci byl namodelován v grafickém editoru Blender [8], [4]. Ten jsem vybral z toho důvodu, že je to bezplatný a hlavně kvalitní nástroj s početnou uživatelskou základnou, která se stará o jeho pravidelné aktualizace a vylepšení. Pro účely snímání pohybu jsem použil zařízení Kinect, protože je široce rozšířené mezi uživateli PC a herní konzole Xbox 360, což zvětšuje oblast potencionálního zájmu o mou aplikaci. Přístroj lze pořídit za cenu nepřesahující 3000 korun, což z něho dělá cenově dostupný nástroj pro získávání prostorových dat. Na tvorbu grafického uživatelského rozhraní jsem zvolil program Photoshop od společnosti Adobe, protože s ním mám pozitivní před2
1. Použité technologie chozí zkušenosti a považuji ho za jeden z nejlepších nástrojů pro tvorbu a úpravu dvojrozměrné bitmapové grafiky.
1.1.1 C# Tento programovací jazyk je v implementační části mé práce použit jako hlavní prvek, na kterém je postaveno nejen jádro programu. Jako vývojové prostředí používám Microsoft Visual Studio, které je pro tento jazyk přímo určené. Některé další technologie, které používám, jako je vývojářská platforma XNA a zařízení Kinect, jsou na tomto jazyku plně funkcionálně závislé.
1.1.2 XNA XNA je vývojářská platforma vyvíjená společností Microsoft určená pro tvorbu grafických aplikací, primárně však her, v programovacím jazyce C#. Programy napsané v tomto prostředí lze jednoduše distribuovat pro PC, Xbox 360 nebo mobilní telefony s operačním systémem Windows Phone. Vývoj takovýchto aplikací probíhá v programu Microsoft Visual Studio, do kterého je však nutné doinstalovat XNA Game Studio, které je nyní dostupné ve verzi 4.0 Refresh. Ať už se jedná o vývoj ve dvou nebo třech dimenzích, XNA obsahuje knihovny tříd, které poskytují programátorovi účinné nástroje pro efektivní tvorbu. Tyto třídy mimo jiné umožňují zpracovávat vstup od uživatele, ať už přichází z klávesnice, myši, nebo Xbox ovladače, obsahují užitečné funkce pro manipulaci s vektory, obdélníky, maticemi, ale i funkce pro nejrůznější matematické výpočty. Zajímavou vlastností XNA je tzv. Content Pipeline, což je technologie, která zajišťuje optimální a jednoduchou obsluhu herního obsahu, jako jsou například 3D modely, písma, zvukové soubory a obrázky. V mé práci jsem XNA využil jako rozšíření vývojového prostředí Microsoft Visual Studio. Používám ho pro jeho možnosti v oblasti grafických operací, konkrétně pro vykreslení prvků uživatelského prostředí, trojrozměrných modelů, efektů scény, ale i pro jeho matematické funkce na výpočty úhlů, manipulaci s vektory a transformačními maticemi. 3
1. Použité technologie 1.1.3 Blender Blender je všestranný grafický editor určen pro modelování 3D objektů, úpravu videa, tvorbu speciálních efektů, animací, částicových efektů apod. V současné době spadá do kategorie open-source programů pod licenci GNU GPL (General public license – veřejná licence), která umožnila, že je vyvíjen a rozšiřován veřejnou komunitou. Na poli bezplatných grafických nástrojů je považován za jeden z nejlepších, ne-li nejlepší. Vyjma standardních funkcí, které jsou běžné pro většinu grafických editorů, obsahuje také konzoli, díky které můžou zkušenější vývojáři doprogramovávat užitečné skripty v programovacím jazyce Python a zlepšovat tak Blender jako celek. Obsahuje také zabudované herní jádro (engine), který například umožňuje pracovat s detekcemi kolizí objektů, simulovat dynamiku těles, nebo vytvářet hry. Já jsem Blender použil pro tvorbu trojrozměrného modelu postavy, jenž reprezentuje pohyb uživatele při cvičení. Při tomto procesu byly použity některé pokročilé techniky jako texturování, tvorba kostry a přizpůsobení deformací kůže vůči kostem.
1.1.4 Kinect Kinect je unikátní přístroj z dílny společnosti Microsoft, jenž měl za cíl definovat nový způsob interakce mezi hráčem a herní konzolí Xbox 360, pro kterou byl původně určen. Nintendo Wii a Playstation 3 spolu se zařízením Move využívají k ovládání her pohyb herního ovladače. Microsoft zvolil trochu jinou cestu a na rozdíl od konkurence nechává ruce hráče volné. Kinect obsahuje RGB kameru, dva hloubkové senzory, které snímají pohyb v trojrozměrném prostoru a umožňují interakci s konzolí prostřednictvím pohybových gest. Je také vybaven čtyřmi směrovými mikrofony, které poskytují možnost hlasového ovládání. Mnoho počítačových nadšenců si bylo vědomo potenciálu, který kinect skýtá, a tak začalo vyvíjet využívajíc jeho unikátních vlastností různé aplikace, nejen hry, pro PC, i když byl primárně určen pro Xbox. Postupem času byl společností Microsoft uvolněn balík nástrojů (SDK – Software Development Kit), které programátorům poskytuje oficiální 4
1. Použité technologie ovladače a nástroje pro vývoj. Dlouhou dobu byly ve verzi beta, ale v únoru letošního roku došlo k uvolnění jejich finální verze. Přes již zmíněné výhody má kinect i pár nevýhod, které v mnoha směrech limitují jeho využitelnost. Jako největší nedostatek bych zmínil znatelnou odezvu mezi pohybem hráče a jeho vyhodnocením, což je omezující faktor, kvůli kterému není zařízení vhodné použít pro aplikace, kde rozhodují rychlé a správně načasované reakce. Další nevýhodou je doručování nesprávných prostorových dat skeletu v případě, že se snímaná osoba nachází v polohách, kdy není Kinect schopen sestavit armaturu uživatele. V této práci je Kinect využit pro shromažďování informací o pohybu uživatele při cvičení prostřednictvím hloubkových kamer a také pro zaznamenávání hlasových povelů prostřednictvím mikrofonů. Veškerá tato data jsou dále zpracována uvnitř zdrojového kódu aplikace. 1.1.5 Adobe Photoshop V této práci je Photoshop použit pro návrh a tvorbu veškeré dvojrozměrné grafiky, kterou má aplikace obsahuje. Celé uživatelské prostředí, jako jsou položky v menu, obrázky cviků, ale i grafické notifikace, které se zobrazují uživateli při cvičení byly zhotoveny za pomoci tohoto programu.
5
2 Příprava modelu V této kapitole nejprve objasním důvody, které mě vedly ke grafické reprezentaci pohybů cvičence pomocí 3D modelu. Poté popíšu, co je to mesh. Dále podrobněji vysvětlím techniky jako je aplikace textur, tvorba kostry a proces zvaný skinování (z anglického skinning, oficiální český překlad se neuvádí). Všechny tyto metody mají za úkol připravit model pro účely animace. Nakonec rozeberu možnosti exportu modelu a chyby s tím spjaté. V této kapitole jsem čerpal informace převážně z odborné literatury [8], [4] a oficiální dokumentace programu Blender. Během svého cvičení by měl být uživatel dostatečně informován o tom, jestli daný cvik provádí správně, nebo ne. Pokud není dodržena správná technika, nejen, že trénink ztrácí na efektivitě, ale také je vysoká šance přivození si zranění. Jako vhodný způsob grafické interpretace uživatele při cvičení jsem vybral reprezentaci pomocí trojrozměrného modelu, který zrcadlově kopíruje pohyb cvičence. Na tomto modelu je uživateli nejsrozumitelněji ukázáno, kde dělá při tréninku chybu a jak se ji vyvarovat.
2.1 Mesh modelu První věcí, která se musí při vývoji modelu provést je vytvořit jeho mesh (obr. 2.1). Mesh lze definovat jako síť polygonů, nebo také slupku objektu, která ho svým tvarem vizuálně reprezentuje. Je složena z vrcholů, které tvoří hrany a z hran jsou složeny polygony. Polygony jsou dvojrozměrné grafické útvary, nejčastěji trojúhelníky, čtyřúhelníky, nebo pětiúhelníky. Existuje mnoho internetových stránek, kde vývojářská komunita zveřejňuje své modely. Někdy je to za účelem chlouby, jindy pro účely ostatních. Toho jsem v mém případě využil a ve své aplikaci jsem použil model dostupný na následující adrese http://www.3dxtras.com/3dxtras-free-3d-models-details. asp?prodid=6176 (dostupný ke květnu 2012). Tato uživatelská díla v mnoha případech obsahují jen to nejzákladnější, mesh. Aby však model mohl být použit pro účely mé aplikace, zbývala ještě řada věcí, které bylo třeba udělat. 6
2. Příprava modelu
Obrázek 2.1: Polygonální síť, neboli mesh
2.2 Aplikace materiálu a textur Dalším krokem při tvorbě modelu je jeho rozdělení a rozřezání na jednotlivé části a přiřazení příslušné textury, nebo materiálu. Ten definuje vzhled objektu, uchovává informace o tom, jakou má barvu, lesk, průhlednost a specifikuje, jak těleso reaguje na světlo. Obsahuje také informace o texturách, které jsou k danému materiálu přidruženy. Materiál i texturu lze aplikovat buď na celou mesh, nebo její části. V mém případě měl model rozdílné sítě polygonů pro oblast vlasů, nehtů, očí, rtů a kůže. Na poslední zmíněnou oblast jsem však potřeboval aplikovat rozdílné textury pro oblast těla a oblast plavek. Proto jsem tuto mesh rozdělit, abych toho snadněji docílil. Nejprve je potřeba vybrat cestu, kterou bude řez veden. K jejímu vyznačení se nejčastěji užívá nástroj pro výběr hran. Jejich postupnou selekcí je sestavena křivka. Ta je po jejím dokončení prohlášena za místo řezu (obr. 2.2). Tato funkce se v programu Blender nazývá „mark seam“, což lze volně přeložit jako „označ šev“. Tento proces je opakován tolikrát, kolik cest řezů je potřeba provést. Když má model tolik částí, 7
2. Příprava modelu že není potřeba ani na jednu z nich aplikovat více než jednu texturu, je možné přejít k jejich nanášení.
Obrázek 2.2: Vyznačená křivka řezu
Prvním krokem je výběr příslušné oblasti, kam bude textura nanesena (obr. 2.3 vlevo). Po její selekci je zavolána funkce „unwrap“, která transformuje trojrozměrnou část sítě polygonů na dvojrozměrný útvar (obr. 2.3 vpravo). Na ten je poté buď nanesena textura z externího souboru, který je obvykle ve formátu obrázku, nebo je obarven přímo v grafickém editoru. Když je na každou mesh společně se všemi jejími částmi aplikována příslušná textura nebo materiál, je možné přejít k další technice, kterou je nezbytné provést, chceme-li model efektivně animovat. Tento proces se nazývá rigování, což je proces tvorby kostry.
8
2. Příprava modelu
Obrázek 2.3: Označená část polygonální sítě (vlevo) a stejná část po transformaci na dvojrozměrné těleso a aplikaci textury (vpravo)
2.3 Stavba kostry Pokud od svého modelu očekáváme vysokoúrovňovou animaci či pohyb, je stavba kostry nezbytnou fází při procesu jeho tvorby. Abychom mohli manipulovat jednotlivými částmi modelu, kostmi, musí obsahovat skelet. Ke každé jeho části je pak přidružena určitá skupina polygonů, která dovoluje, aby se mesh deformovala společně s kostí. Skelet je složen z několika částí, které mají nadefinovaná jistá pravidla, jak se chovat vůči sobě, skeletu, ale i celému modelu. Aby pohyb postavy vypadal přirozeně a nemohlo docházet k takovým deformacím kostí, které jsou pro lidské tělo neproveditelné, používají se jistá omezení. Ty například zabraňují ohybu loktu nebo kolene do nevhodného směru. Poněvadž můj model kopíruje pohyb uživatele, který je limitován možnostmi lidského těla, nemůže tato situace nastat a tyto restrikce tak nebylo potřeba zavádět. Jelikož je mezi kostmi zaveden systém předků a potomků, prvním krokem při sestavování skeletu je tvorba rodičovské kosti (obr. 2.4). Ta se podle všeobecné konvence nejčastěji umísťuje do spodní oblasti trupu pro některou část páteře. Poté, co je kost na svém místě, může být z je9
2. Příprava modelu jího konce extrudován potomek. Když je sestavena vertikální část kostry pro oblast trupu a hlavy, přichází na řadu tvorba armatury pro ruce a nohy. Zde je nejvýhodnější využít možnosti zrcadlení ve směru osy X, která zajistí symetrické rozmístění kostí na levé a pravé straně modelu (obr. 2.4). Tímto způsobem je postupně zkonstruován celý skelet. Ten by neměl být příliš komplikovaný, aby s ním bylo možné intuitivně vytvářet animace, ani moc jednoduchý, což by limitovalo možnosti animace postavy.
Obrázek 2.4: Vybraná rodičovská kost, pro kosti směřující do ramen použita funkce zrcadlení
10
2. Příprava modelu Při pózování postavy se pak využívá dvou základních technik pro manipulace s kostmi a to přímá a inverzní kinematika. Ty zmíním v kapitole 3.1, a tak se tu jimi nebudu dále podrobněji zabývat. Já ve své práci používám techniku přímé kinematiky. Je to z toho důvodu, že postavu animuji prostřednictvím rotací kostí v kloubech a nikoli jejich translací.
2.4 Skinning Aby bylo možné provádět přirozeně vypadající animace postavy, je nutné vhodně deformovat mesh modelu. Ta je složena z mnoha polygonů. Jako jedna možnost by se mohla jevit manuální manipulace s jednotlivými polygony. Z funkčního hlediska se jedná o korektní postup, nicméně silně neefektivní. Pro příklad uvedu, že můj model má přes 10000 polygonů. Nastavovat pro každý pohyb jinou oblast deformace sítě polygonů by byl nadlidský výkon. Grafické editory, Blender není výjimkou, naštěstí podporují techniku zvanou skinování. Skinování je proces, při kterém je každá skupina polygonů, ze kterých je mesh složena, přiřazena k některé kosti. Když se pak provádí manipulace s některou částí skeletu, přidružené polygony jsou náležitě deformovány. Ke skinování lze v programu Blender přistupovat dvěma způsoby. V prvním případě se přepne armatura do režimu pózování a následně se vybere mesh v módu, který se nazývá „weight painting“. Tím je umožněno, aby byla na mesh pomocí štětce nanesena barva, která udává sílu deformace. Pokud není skelet v režimu pózování, není možný výběr kostí a tím i přidružení požadovaných polygonů. Štětec, kterým se barva nanáší, má jisté parametry, které si lze uzpůsobit pro své potřeby. Je možné nastavit sílu nanášené barvy, rádius obarvení, rozptyl a další. Barva udávající sílu deformace se pohybuje od světle modré, nejslabší, přes zelenou, žlutou, oranžovou, až po červenou (obr. 2.5). Druhý způsob barvení je o něco jednodušší a rychlejší. Nejprve se zvolí objekt armatury a k němu se do výběru přidá mesh. Poté se zavolá funkce, která prohlásí mesh za potomka skeletu v hierarchii objektů. U této techniky je však možnost využití funkce, která provede automatické obarvení sítě polygonů vzhledem k nejbližším kostem. Tím je ušet11
2. Příprava modelu
Obrázek 2.5: Barvení sítě polygonů, stupně síly obarvení řena spousta práce s manuálním obarvováním a v mnoha případech je i docíleno lepšího výsledku. Nicméně tento postup není bezchybný a obvykle se stane, že některé polygony zůstanou obarvením nedotknuty, což má při animaci za následek chyby v deformaci sítě polygonů (obr. 2.6 vlevo). Je však rychlejší použít tuto metodu i přes tento její nedostatek a zbývající polygony pak příslušným kostem manuálně přiřadit, jako je tomu v prvním případě. Korektním výstupem by pak měla být postava, kterou je možné pozicovat bez jakýchkoli defektů (obr. 2.6 vpravo).
2.5 Export modelu Blender poskytuje možnosti exportu výsledného modelu do několika různých nejčastěji užívaných formátů. Vzhledem k vzájemné kompatibilitě XNA a mého modelu jsem byl však nucen využít formátu FBX. Skript v programu Blender, který tuto funkcionalitu zajišťuje, nabízí různé parametry exportu. Jedním z nejdůležitějších je nastavení orientace os. Souřadnicový systém zařízení Kinect a XNA má osu Z ve směru dopředu, zatímco v programu Blender má tuto orientaci osa Y. Dalším důležitým parametrem je možnost „XNA Rotate Animation Hack“. Pokud není při exportu vybrána, dochází v aplikaci k problému, že kosti nerotují ve svém počátku, ale kolem pivota celého objektu. Jejím vý12
2. Příprava modelu
Obrázek 2.6: Chyby skinování (vlevo), správně naskinovaný model (vpravo) běrem však dochází k problému, že Blender při exportu není schopen vzít potaz nastavení prohození os. Tento problém jsem byl tedy nucen vyřešit v implementační části své práce. XNA má několik požadavků, které musí model splňovat, aby ho bylo možné předat do Content Pipeline, jenž se stará o import souborů. Pokuď nejsou všechny importované objekty potažené texturami, model je zamítnut a není možné s ním pracovat. Dále musí být všechny polygony naskinované. Jestliže alespoň jeden nemá přiřazenou kost, podle které se má deformovat, výsledkem je též chyba při importu. Další nepříjemnou situací, která může nastat, v mém případě se tak i stalo, jsou zdvojené polygony modelu. Skinováním modelu je obarvena jen jedna jejich vrstva, což má za následek polygony, které nejsou přiřazeny žádné kosti. Tento problém je však možné v programu Blender vyřešit pomocí funkce „Remove doubles“, kterou lze zavolat po výběru sítě polygonů. Její aplikací jsou všechny duplikované polygony odstraněny. Pokud je tento problém odhalen až po doskinování modelu, musí se tento proces provést znova.
13
3 Práce s modelem V této části práce nejprve popíšu, jaké jsou druhy animace [3]. Dále zmíním, jaké způsoby se nabízely pro použití v mé aplikaci a odůvodním výběr konkrétního. Pro manipulaci s modelem bylo zapotřebí využití pohybu uživatele, proto poté vysvětlím jednotlivé techniky snímání pohybu, které jsou rozděleny dle fyzikálního principu. Následně na ukázkách zdrojového kódu vysvětlím, jak byla prostorová data získána a jak byla použita pro manipulaci modelu.
3.1 Způsoby počítačové animace Animaci lze popsat jako sled statických obrázků, které jsou přehrány tak rychle za sebou, že pro lidské oko vytváří iluzi pohybu. Počítačovou animaci lze rozdělit do dvou hlavních kategorií, na nízkoúrovňovou a vysokoúrovňovou. V mé bakalářské práci využívám animaci vysokoúrovňovou, proto se zaměřím spíše na ni a nízkoúrovňovou animaci popíšu jen stručně. Nízkoúrovňová animace přistupuje k problému animace na základě teorie křivek. Řeší reprezentaci pohybu objektů po spojitých drahách, jejich rychlost, natočení atd. Využívá techniku zvanou klíčování (keyframing). Ta je založena na principu umísťování snímků do klíčových pozic animace, přičemž zbývající mezisnímky jsou pak dopočítávány počítačem. Z více nízkoúrovňových animací lze skládat vysokoúrovňové. To má za výhodu možnost tvorby knihoven gest, pohybů, kolizí a dalších věcí. Vysokoúrovňové animace se nejčastěji používají pro animaci lidí. Využívají posloupností pevných částí, které lze označit jako segmentové struktury (articulated structures). Tyto části jsou, stejně jako lidské kosti, mezi sebou propojeny a v každém spoji, kloubu, je možné oběma segmenty rotovat. Tato struktura bývá obvykle ukotvena na obou, nebo jednom konci. Pokud je uchycena pouze na jednom, označuje se jako otevřená struktura a jejímu volnému konci se říká koncový efektor. V závislosti na zmíněném ukotvení a úhlech, které lze v tělesu nastavit, je možné určit stupně volnosti. Přidáním dalších objektů do systému 14
3. Práce s modelem lze stupně volnosti zvýšit, svazováním těles pevnými linkami a tvorbou segmentové struktury zase snížit. S vysokoúrovňovou animací jsou úzce spjaty dvě techniky, které se používají pro animaci postav. Tyto techniky se nazývají přímá a inverzní kinematika. V přímé kinematice se modifikace vrchní části ruky projeví na umístění a směru všech potomků transformované kosti. To znamená, že změní-li se natočení ruky v rameni, pozice loktu, zápěstí i celé dlaně se přizpůsobí tomuto pohybu. Použije-li se metoda inverzní kinematiky, modifikací konce řetězce kostí ovlivníme všechny předchozí kosti v tomto řetězci. Pohneme-li teda například dlaní, počítač nám vhodně přepočítá rotace a pozice pro všechny její předky (obr. 3.1 vlevo). Důležitou věcí, kterou je třeba zohlednit, je odpojení příslušné části armatury od jejího zbytku, aby nebyl ovlivněn nežádoucí řetězec kostí. Pro oblast rukou a nohou se odpojení provádí v ramenech a kyčlích (obr. 3.1 vpravo).
Obrázek 3.1: Inverzní kinematika bez odpojení řetězce kostí (vlevo), Inverzní kinematika s odpojeným řetězcem kostí (vpravo)
15
3. Práce s modelem
3.2 Předdefinovaná animace versus volný pohyb Před touto fází vývoje jsem se musel rozhodnout mezi dvěmi možnostmi, které se mi nabízely. Uživateli jsem chtěl poskytnou co nejlepší grafickou odezvu, jenž mu bude jednoduše a srozumitelně podávat informace o tréninku. Naskýtaly se mi dvě animační techniky, které by byly pro tyto účely aplikace použitelné. První metodou, která připadala v úvahu, bylo vytvoření animace přímo v programu Blender. Tento proces spočívá v manipulaci s modelem, jako je nastavování rotací a translací kostí pro různé okamžiky animace a umisťování klíčových snímků v těchto pozicích. Po importu modelu do XNA je pak zavolána konkrétní animace s naklíčovanými pózami a ta je pak prostřednictvím příslušných metod snímek po snímku vykreslována. Tento přístup s sebou nese jisté výhody i nevýhody. Jednou z výhod je fakt, že napsaný zdrojový kód pro zpracování a vykreslování by byl univerzálně použitelný pro všechny animace. Na druhou stranu by každý cvik vyžadoval tvorbu své vlastní. Tyto aspekty však neměly velký vliv na rozhodování, jakou techniku animace použít. Majoritní problém spočíval v samotném jádru tohoto přístupu. Uživatel při cvičení vidí model kopírující jeho pohyb pouze za předpokladu, že provádí přesné pohyby, které jsou pro daný cvik považovány za správné a podle kterých je přehrávána příslušná animace. Vybočí-li cvičenec ze správné osy pohybu, na model to nebude mít vliv a jemu bude těžké vysvětlit, co provedl špatně. Nemožnost svobodného pohybu uživatele s grafickou zpětnou vazbou, jež ho bude v každém okamžiku tréninku zahrnovat všemi potřebnými a srozumitelně podanými informacemi, se ukázala jako rozhodující. Druhý způsob animace, který se nabízel, spočíval ve svobodném pohybu uživatele, jehož bude model, nehledě na prováděný cvik, v každém momentu cvičení přesně kopírovat. Tím mu bude umožněna stejná zpětná vazba, jako kdyby cvičil před zrcadlem. Navíc bude snadněji obeznámen o chybách, kterých se dopouští, než u předchozí techniky. Algoritmus bude také moct být použít pro jakýkoli cvik. Nevýhodou tohoto přístupu je složitější implementace, než u použití předdefinované animace. To je ale věc, která nevyvrátí všechna pozitiva, která jsou s touto technikou spjata, a kvůli kterým jsem se rozhodl pro právě tento přístup. 16
3. Práce s modelem
3.3 Snímání pohybu (Motion capture) Tento pojem označuje techniku, při které jsou na objekt ve skutečném světě umístěny senzory a následně je sledována a vyhodnocována jejich pozice. Nejčastějším objektem, na který jsou senzory umisťovány je člověk. Důvodem je to, že v mnoha odvětvích zábavného průmyslu, jako jsou například počítačové hry nebo filmy, je největší pozornost upřena na pohyb modelů postav. Umístění senzorů na skutečného člověka je tak nejrychlejší a nejsnazší cestou, jak docílit kvalitní a věrohodné animace. Techniky, jenž se pro snímání pohybu využívají, lze rozdělit podle fyzikálního principu, na němž jsou založeny [3].
3.3.1 Mechanická zařízeníi Při této metodě jsou na tělo herce umístěny senzory takovým způsobem, že ve výsledku tvoří jakýsi exoskelet. Výhodou tohoto přístupu je, že data ze senzorů jsou získávána rychle a že ho lze aplikovat i ve venkovním prostředí, kde by jiné techniky selhaly. Nevýhodou je fakt, že je herec omezován nesenými senzory.
3.3.2 Magnetická zařízení Princip této metody snímání tkví v generování nízkofrekvenčního magnetického pole vnějším zdrojem a jeho měření pomocí senzorů umístěných na těle herce. Emitující zdroj a senzory musí být propojeny s řídící jednotkou, jenž koreluje získaná data a vyhodnocuje polohu senzorů v magnetickém poli. K propojení se používají poměrně tlusté stíněné kabely, což do značné míry omezuje pohyb herce. Senzorů se obvykle používá 6 až 11. Některé z nich jsou použity jako báze kinematických řetězců a některé jako koncové efektory. Z tohoto důvodu je nutné použít algoritmy inverzní kinematiky pro výpočet rotací kloubů mezi těmito dvěma body. Další nevýhodou je, že tyto systémy jsou citlivé na kovy. Výhodou je možnost zákrytu. 17
3. Práce s modelem 3.3.3 Optické snímací systémy Tyto systémy jsou založeny na principu přesného rozmístění více kamer ve scéně a jejich následným snímáním jednotlivých bodů. Následně je hledána korespondence mezi snímanými body jednotlivými kamerami a výpočet jejich souřadnic v prostoru. Z těchto dat lze dále zjistit rotace v jednotlivých kloubech. Tento princip snímání má ty výhody, že k samotnému procesu získávání dat touto technikou, není potřeba žádné drahé vybavení, postačí i dvě zkalibrované kamery, a také že pohyb herce není nijak omezován. Dříve byla také nutnost volby přiléhavého jednobarevného oblečení s kontrastními značkami na něm. Některá dnešní zařízení už tuto podmínku nekladou. Příkladem takového přístroje je Kinect.
3.3.4 Snímání pohybu zařízením Kinect Aby bylo možné manipulovat s modelem v závislosti na tom, co provádí uživatel, musí být získávána prostorová data, ze kterých bude možné určit, v jaké pozici se cvičenec nachází. Pro tento účel je potřeba použít zařízení, spadající do některé z výše zmíněných kategorií. V mém případě je to Kinect. Ten je schopen tyto informace poskytnou prostřednictvím jedné barevné a dvou hloubkových kamer. Tato obrazová data se dají rozdělit do dvou skupin. První skupinou dat, kterou je nám Kinect schopen dodat, je přesný obraz scény. To zahrnuje informace o každém pixelu, ze kterého je získaný obraz složen. Parametry pixelů jsou barva, hloubka a jeho pozice. Pro účely mé aplikace jsou však tato data nepoužitelná a jako mnohem vhodnější řešení se tedy ukázalo získání a použití druhé skupiny informací, které jsou prostřednictvím zařízení Kinect dostupné. Kinect je schopen za podmínky, že jsou před něho postaveni jeden až dva lidé, sestavit jejich virtuální skelet, ze kterého je následně možné extrahovat informace o jednotlivých kloubech. Počet kloubů, které je možné získávat a uchovávat pro potřeby aplikace je dvacet, čtyři pro každou končetinu a čtyři pro oblast hlavy a páteře (obr. 3.2). 18
3. Práce s modelem
Obrázek 3.2: Dvacet kloubů, jejichž souřadnice je Kinect schopen dodat
19
3. Práce s modelem
3.4 Získání prostorových dat ze zařízení Kinect Proces získávání těchto dat je v mé aplikaci řešen následujícím způsobem (obr. 3.3). Nejprve je deklarována proměnná, která bude uchovávat prostorová data o skeletu uživatele. Následně je vždy, kdy je Kinect schopen ze získaných obrazových dat složit uživatelův skelet, zavolána událost, která aktualizuje data o kostře. V té je však nejprve potřeba prohledávat pole armatur a podmínkou zjišťovat, která z nich je ve stavu, kdy je aktivně snímána. V případě, že uživatel stojí před zařízením Kinect a je jím sledován, podmínka je splněna a do dřivé deklarované proměnné jsou uložena data o jeho skeletu. V případě, že je cvičencova kostra sestavena poprvé, je vytvořena instance třídy AnimationPlayer, která se stará o práci s trojrozměrným modelem postavy. Když jsou data o skeletu úspěšně uložena do proměnné, je možné se dotázat na pozici konkrétního kloubu. Ta může být vrácena jako souřadnice konkrétní dimenze, popřípadě jako trojrozměrný vektor. Oba případy jsou ukázány na zdrojovém kódu, konkrétně na proměnných headCoordinateX a headCoordinates, které uchovávají informace o pozici hlavy. Tyto proměnné jsou však zavedeny čistě pro demonstrativní účel a v aplikaci nejsou použity.
Obrázek 3.3: Ukázka zdrojového kódu pro získání souřadnic jednotlivých kloubů 20
3. Práce s modelem
3.5 Využití dat pro animaci modelu První způsob, který se zdál být vhodný pro animaci modelu, byl založen na translaci pozic kostí. Z dat, které Kinect dodal, byly vyextrahovány souřadnice pro každý kloub a následně byla upravena pozice všem částem skeletu modelu v závislosti na získaných informacích. Tento přístup však nezahrnoval možnost, že vzdálenosti mezi jednotlivými klouby uživatele budou v jiných mírách, než vzdálenosti mezi klouby modelu. To mělo v mém případě za následek nežádoucí deformaci modelu a byl jsem tedy nucen zvolit jiný přístup. Jako správná možnost se nakonec ukázala být animace založená na principu rotací kostí v jednotlivých kloubech. Tato logika je v implementační části řešena následujícím způsobem (obr. 3.4, 3.6).
Obrázek 3.4: První část demonstračního kódu pro rotaci kostí
Do dvou proměnných jsou v každém okamžiku běhu aplikace, kdy je snímán skelet uživatele, uloženy všechny tři souřadnice ramenního a loketního kloubu. Subtrakce dat těchto proměnných je pak vložena konstruktoru a je z nich vypočítán vektor, jenž určuje směr z ramene do loktu, a následně uložen do další proměnné. V tomto bodě je důležité poznamenat, že v této části kódu jsem byl nucen vyřešit problém, který jsem již popsal v kapitole 3.4. Kinect má osu Z ve směru dopředu, zatímco v programu Blender tam směřuje osa Y. Z tohoto důvodu je do konstruktoru na pozici Y dosazena souřadnice Z. Do následující pro21
3. Práce s modelem měnné je uložen vektor, který určuje směr vrchní části ruky modelu. Data potřebná pro jeho výpočet jsou získána z proměnné skinningDataValue, která mimo jiné uchovává informace o absolutních souřadnicích kostech modelu. Ty jsou v orientaci os programu Blender, takže není třeba prohazovat souřadnice Y a Z. Teď když jsou oba dva vektory sestaveny, je potřeba vypočítat úhel mezi nimi, o který bude rotace v kloubu provedena. Pro tento účel jsem zavedl funkci AngleBetweenTwoVectors (obr. 3.5), která bere jako parametry dva vektory a vrací výsledný úhel. Násobení dvou vektorů je definováno vztahem 𝑎·𝑏=
𝑛 ∑︁
𝑎𝑖 𝑏 𝑖 = 𝑎1 𝑏 1 + 𝑎2 𝑏 2 + . . . + 𝑎𝑛 𝑏 𝑛 .
(3.1)
𝑖=1
XNA však poskytuje funkci, která tento výpočet provede za nás. Ve zdrojovém kódu jí jsou jako argumenty předány dva normované vektory a výsledný výpočet je uložen do proměnné. Na tu je následně aplikována funkce arccos, která vrací výsledný úhel. Ten je nejprve konvertován na číslo s jedním desetinným místem a poté uložen do proměnné a vrácen na výstup.
Obrázek 3.5: Funkce pro výpočet úhlu mezi vektory
K rotacím kostí je využit systém kvaternionů, proto poté, co je získán výsledný úhel, je potřeba vypočítat vektor osy, podle které bude rotace provedena. Proces tohoto výpočtu je veden následujícím způsobem (obr. 3.6). Součinem vektoru pro horní část ruky modelu a uživatele je vypočítán normálový vektor, který je kolmý na rovinu, kterou předchozí dva vektory tvoří. Tento výsledný vektor je normován a uložen do pro22
3. Práce s modelem
Obrázek 3.6: Druhá část demonstračního kódu pro rotaci kostí měnné. Poslední věcí před aplikací rotace je zjištění matice pro kost, kterou se bude otáčet. Tato matice obsahuje absolutní souřadnice kosti a její rotaci v globálním prostoru. Posun se nastaví na nulu. Pole matic boneTransforms uchovává data o všech kostech v jejich lokálních prostorách. Vložením číselné proměnné do indexu pole se odkážeme na konkrétní kost. Rotace se pak provede vynásobením matic zobrazených na ukázce zdrojového kódu. První matice transformuje model do globálních souřadnic. Následně je vynásobena maticí, jenž je definována pomocí osy, podle které má být rotace provedena, a úhlu. Aplikací inverze na první matici a jejím vynásobením je model převeden zpět do lokálních souřadnic. Nakonec je vynásoben maticí, která obsahuje lokální informace o kosti v její předchozí pozici. Tímto celým postupem je kost modelu rotována v požadovaném směru o požadovaný úhel. Z názvu proměnné upperArmLeft lze vyčíst, že se jedná o rotaci levé ruky modelu, i když bylo počítáno s daty pro uživatelovu pravou ruku. Pointa je v tom, že uživatel vidí model zrcadlově otočený vůči němu, což je pro něho mnohem přirozenější. Z tohoto důvodu byla získaná data z pravé ruku uživatele aplikována na levou ruku modelu.
23
4 Cvičení (trénink) V této kapitole nejprve vysvětlím nejdůležitější aspekty, které se samotného tréninku týkají. Poté na ukázce zdrojového kódu popíšu, jakým způsobem jsem řešil samotnou implementaci cviků a jakým způsobem jsou uchovávány informace o cvičení.
4.1 Důležité pojmy S posilováním je spjato několik pojmů, které by měl cvičenec dobře znát, aby byl schopen samostatného a kvalitního tréninku. Některé tyto aspekty mají natolik velký vliv na cvičení, že kdyby na ně cvičenec nebral zřetel, mohl by si přivodit zranění. Při jejich popisu jsem čerpal informace z odborné literatury [7]. Prvním z těchto pojmů je opakování. Je to cyklus, ve kterém cvičenec zvedne těžké závaží, dochází ke kontrakci svalstva, a následně ho položí, dochází k extenzi svalstva. Zkušenosti lidí, kteří se věnují kulturistice na profesionální úrovni, a výzkum ukázal, že nejlepšího možného výsledku při cvičení je docíleno volbou závaží, jež odpovídá 70 až 75 procentům maximální váhy, se kterou by byl cvičenec schopen udělat jedno opakování. Dalším důležitým pojmem je série. Ta je složena z několika opakování. Obvykle se považuje za standard provádět čtyři série pro každý cvik a tři cviky pro každý sval. První série slouží k zahřátí a prokrvení svalstva. Proto se používá závaží, se kterým je cvičenec schopen udělat 15 nebo trochu více opakování. V druhé sérii se závaží zvýší, aby se maximum opakování pohybovalo v rozmezí 10 a 12. U třetí série se opět přidá váha, která sníží počet opakování na 8 až 10. Čtvrtá série slouží pro maximální zatížení svalstva a doporučuje se volit závaží, se kterým je počet opakování pouze 6. Pátá série je čistě dobrovolná a zátěž se používá stejná jako v případě série čtvrté. Důležitou součástí tréninku, na kterou by se nemělo zapomínat, je pauza mezi jednotlivýma sériemi. Ta by neměla být moc krátká, aby si svalstvo stihlo odpočinout, a zároveň ani moc dlouhá, aby se svalstvo neodkrvilo a nevystydlo. Za ideální čas je považována minuta, 24
4. Cvičení (trénink) za kterou cvičenec obnoví 72 procent své síly. Za tři minuty obnoví všechnu. Smyslel cvičení je ale držet tělo v zátěži a zapojit co nejvíce svalových vláken. Tím, že mu není umožněna stoprocentní obnova svalu, je docíleno toho, že jsou při dalším cvičení zapojena další svalová vlákna a trénink se tak stává účinnějším. Další technikou, která by neměla být opomíjena, je správné dýchání. Princip spočívá v nádechu při extenzi svalstva a výdechu při kontrakci. Technika je to prostá, ale mnoho lidí ji opomíjí, nebo o ní dokonce ani neví. Špatné dýchání, nebo zadržení dechu při kontrakci svalstva přitom může způsobit vážná zranění. Poslední neméně důležitou věcí je strečink. Protahováním svalstva se zvětšuje rozsah pohybu, který je sval schopen udělat, a počet zapojených svalových vláken. Tím, že jsou před samotným cvičením svaly protaženy, se zmenšuje šance na přivození zranění, sval není hnán těžkým závažím za možnosti svého roztažení, a zvyšuje se účinek tréninku.
4.2 Volba cviků Při výběru cviků jsem byl dost limitován. Prvním faktorem, který mě omezoval, byly možnosti zařízení Kinect. Ten je schopen sestavovat skelet uživatele jen v určitých pozicích. Velké množství cviků tak bylo vyřazeno, protože by při jejich provádění Kinect nebyl schopen zasílat správná prostorová data o uživateli a nebylo by tak možné zaručit správnou manipulaci modelem, ani kontrolu techniky cvičení. Druhou věcí, která mě při výběru omezovala, byl fakt, že většina cviků vyžaduje použití speciálního zařízení, jako jsou lavice, tvarované osy na závaží, nebo přímo cvičební stroje. Já jsem ve své aplikaci předpokládal, že běžný uživatel, kterému je aplikace cílena, má doma pouze standardní jednoruční činky. S ohledem na tyto fakta jsem vybíral cviky pro horní část těla, konkrétně pro ruce a ramena. Cviky pro hlavní zapojení svalstva v oblasti hrudníku, zad a nohou vyžadují použití právě zmíněného speciálního vybavení, kterým obvykle disponují posilovny. Na posílení břišního svalstva jsou vhodné sed-lehy či kondiční běh. 25
4. Cvičení (trénink)
4.3 Implementace cviků, omezující podmínky
Implementační část vyžadovala zavedení vhodného systému podmínek, který by zajišťoval správnou techniku prováděného cviku. Tento systém by se lišil pro každý cvik, nicméně princip, na kterém by byl založen by zůstal stejný. Jádro tohoto přístupu jsem postavil na rozdělení každého cviku na dvě jeho klíčové pozice. První je póza, kdy má uživatel povolený sval a připravuje se ke kontrakci. Druhá je cílová poloha, kam se pomocí zatnutí svalu snaží činku dostat. Aby bylo možné opakování započítat, nesmí se během pohybu ze základní do cílové pozice vyskytnout chyba. V případě, že tomu tak je, je uživatel nucen se vrátit do základní polohy a opakování provést znova. Vysvětlení implementační části provedu na cviku upažování nad hlavou. První věcí, po vybrání příslušného cviku z menu, je vytvoření instance třídy Workout, která se stará o podmínky pro jednotlivé cviky, s parametrem, jež určuje, o jaký cvik se jedná. Následně je v každém okamžiku tréninku volána funkce, která kontroluje parametry příslušející tomuto cviku a zajišťuje tak správnou techniku jeho exekuce. V našem případě je to metoda CheckDeltoidSidewayRaise (obr. 4.1, 4.2). V této funkci jsou nejprve deklarovány dva dvojrozměrné statické vektory. Následně jsou z informací o pozicích kloubů sestaveny vektory pro pravou a levou ruku. Použitím pomocné funkce je zjištěn úhel mezi statickými vektory a vektory rukou. Následující podmínkou je hlídáno, jestli jsou končetiny v základní poloze, čemuž odpovídá úhel v rozmezí 30 až 40 stupňů. Poněvadž je ale vypočtený úhel vždy kladný, je důležité rozlišit, jestli vektor ruky míří výš či níž, než vektor statický. Z tohoto důvodu se kontrolují výškové souřadnice rukou oproti bodu uprostřed páteře. Tím je zajištěno, že se uživatel nachází v základní pozici a je možné uložit do proměnné, která uchovává logickou informaci o tom, že se v této pozici skutečně nachází, kladnou hodnotu. Do proměnné jež uchovává informaci o chybě během opakování je uložena hodnota záporná. Poté uživatel může začít provádět daný cvik a mířit svým pohybem do cílové polohy. Během jeho cvičení je však kontrolován, jestli nevybočuje ze správné osy pohybu (obr. 4.2). 26
4. Cvičení (trénink)
Obrázek 4.1: První část demonstračního kódu pro kontrolu prováděného cviku
Obrázek 4.2: Druhá část demonstračního kódu pro kontrolu prováděného cviku
27
4. Cvičení (trénink) V případě, že cvičenec provede chybu v technice daného cviku, to znamená, že vybočí pohybem ve směru dopředu nebo dozadu, nastaví se stavová proměnná, jež uchovává informaci o vzniklé chybě, a uživatel je nucen se vrátit do iniciální pozice. Pokud však chybu neudělá a daný cvik provede do cílové polohy, je provedena další kontrola. V tomto bodě je totiž nutné ověřit, zdali se skutečně nachází v cílové poloze, jestli se během pohybu nevyskytla chyba a také jestli je jeho pohyb skutečně z počáteční polohy. Pokud jsou všechny tyto podmínky splněny, uživateli je započítáno opakování a logická proměnná, uchovávající informaci o splnění iniciální pozice, je nastavena na hodnotu false, aby bylo nutné před dalším opakováním jít do této pozice. Když uživatel provede určitý počet opakování, hlasovým povelem, nebo vstupem z klávesnice, oznámí, že skončil sérii, je inkrementován počet sérií, vynulován počet opakování a je spuštěn odpočet, jenž uživatele informuje o délce pauzy mezi jeho sériemi.
28
5 Uživatelské rozhraní V této kapitole se nejprve zaměřím na návrh grafického uživatelského prostředí. Popíšu, jak jsem při návrhu postupoval, z čeho jsem čerpal inspiraci a proč jsem zvolil právě takové rozmístění grafických prvků, jaké jsem zvolil. Dále vysvětlím, jak je implementován systém hlasových příkazů a jak je zpracován vstup od uživatele z klávesnice.
5.1 Návrh rozhraní Jedna z nejdůležitějších věcí, na kterou je třeba při návrh myslet, je přátelské a srozumitelné grafické uživatelské prostředí (GUI – Graphical user interface). Uživatel by se měl být schopen zcela intuitivně orientovat v aplikaci, procházet položkami menu přirozenou cestou a očekávat od nich tu akci, jenž se skutečně při jejich výběru provede. Toto jsem si při návrhu kladl za cíl, udělat grafické rozhraní co možná nejvíc uživatelsky přátelské (user-friendly). Při jeho vývoji jsem vycházel z dovedností, které jsem si osvojil v předmětu Komunikace člověka s počítačem, konkrétně pak techniku zvanou CRAP [2]. CRAP lze vyjádřit jako kontrast (contrast), opakování (repetition), uspořádání (alignment) a seskupení (proximity). Kontrast v tomto případě znamená, že odlišné prvky by měli být řádně graficky rozlišeny a důležité prvky zdůrazněny. Opakování vyjadřuje, že by měl být použit jednotný grafický styl pro celý systém. Uspořádání definuje vizuální propojení prvků a také vytváří vizuální tok. Seskupení pak slučuje vztažné elementy, v případě mé aplikace to jsou možnosti menu, a odděluje nesouvisející. První věcí, kterou jsem od rozhraní očekával, je jeho jednoduchost. Chtěl jsem, aby obsahovalo jen ty nejnutnější základní informace a možnosti. Přespříliš informací může uživatele mást a negativně tak ovlivňovat jeho názor na aplikaci. Jedinou věcí, co se zobrazí po spuštění aplikace je menu obsahující pět možností a nápis informující o tom, jestli jsou zapnuté hlasové povely, aby uživatel věděl, zdali může aplikaci ovládat klávesnicí, nebo i řečí. Jednotlivé možnosti menu jsou situovány doprostřed obrazovky, nehledě na rozlišení monitoru, a jsou barevně odděleny, aby bylo zřejmé, 29
5. Uživatelské rozhraní která možnost je aktivní, zelená, a která ne, modrá. Menu obsahuje položky jako je vytvoření nového tréninku, prohlídku tréninků předešlých, nastavení aplikace, informace o aplikaci a ukončení aplikace. Při výběru konkrétní možnosti, vyjma ukončení aplikace, je celé menu vizuálně odsunuto do levé části obrazovky a v pravé jsou zobrazeny dodatečné informace. Při výběru nového tréninku se zobrazí obrázek cviku se znázorněním nejvíce zapojených svalů a písemný popis správné techniky jeho provádění. Mezi těmito cviky lze pak jednoduše přepínat a jeden z nich si vybrat. Výběrem možnosti předešlých tréninků, jsou v pravé části obrazovky zobrazeny informace o datu tréninku, váze, se kterou uživatel cvičil, počtu opakování a počtu sérií. Pokud je vybrána volba nastavení aplikace, pak je možné upravit nějaké základní parametry, jako je rozlišení obrazovky, hlasové ovládání, jestli je aplikace spuštěna v režimu celé obrazovky a další. Volbou možnosti o aplikaci, jsou uživateli zobrazeny informace o nástrojích použitých při tvorbě, o licenci, pod kterou software spadá, kdo se podílel na jeho tvorbě a také poděkování. Výběrem možnosti ukončení aplikace je uživatel dotázán, jestli si je svým záměrem jistý a v kladném případě je program ukončen.
5.2 Hlasové příkazy, vstup z klávesnice Kinect je vyjma prostorových obrazových dat schopen přijímat i zvuková data z okolí prostřednictvím 4 směrových mikrofonů. Tato data je pak schopen zpracovat a použít buď jako hlasové příkazy, nebo je uchovat pro pozdější použití, například ve formě zvukového souboru. Já ve své práci mikrofony zařízení Kinect využívám pro možnost hlasového ovládání. Tento přístup jsem zvolil z toho důvodu, že hlavní část aplikace je proces samotného cvičení, při kterém má uživatel v rukou činky a není tak schopen interakce s aplikací prostřednictvím klávesnice. První věcí, kterou je při implementaci hlasových povelů nutné provést, je sestavení slovníku. Ten musí obsahovat všechny příkazy, jenž budou v aplikaci použity. Nejprve se proto zkonstruuje seznam těchto příkazů a inicializuje se slovník. Tomu musí být také nastaven jazyk, ve kterém budou tyto povely zadávány. Tyto příkazy jsou následně předány do slovníku. V programu je poté spuštěno samostatné vlákno, které bude v každém okamžiku běhu aplikace naslouchat okolí a porov30
5. Uživatelské rozhraní návat zvukové signály s jednotlivými položkami slovníku. V aplikaci jsou použity tři události, které jsou volány v závislosti na tom, jestli Kinect povel rozpoznal, nebo ne. Třetí událost je volána, když Kinect povel poznal, ale není si jistý přesnou shodou se záznamem ve slovníku. Míra jistoty je vyjádřena reálným číslem v rozmezí od nuly do jedné a je možné ji použít například pro určení hranice, kdy bude shoda akceptována, a kdy bude zamítnuta. V případě, že je povel akceptován, je nutné použít podmínku, která zjistí, o jaký příkaz se jedná. Nakonec už zbývá jen zavolat požadovaný kód v závislosti na rozpoznaném příkazu. Hlasové povely ve své aplikaci používám pro vybírání jednotlivých položek menu, výběr cviků, zadávání váhy, se kterou uživatel cvičí, přechod mezi jednotlivými sériemi cvičení, ukončení tréninku a ukončení aplikace. Ovládání aplikace může být prováděno i prostřednictvím klávesnice. V tomto případě jsou pro intuitivní navigaci v menu použity směrové klávesy, pro volbu konkrétní možnosti klávesa enter, pro návrat v aplikaci o úroveň výš a pro ukončení aplikace klávesa escape.
31
Závěr Výsledkem bakalářské práce bylo vytvoření užitečného programu, který osloví a přiláká širokou paletu lidí, pro něž by jinak posilování nebylo zajímavé, a umožní jim zkrášlovat tělo zábavnější a účinnější metodou. V textové práci jsem popsal teoretické základy o počítačové animaci a snímání pohybu. Dále jsem vysvětlil techniky, které jsem použil pro přípravu modelu k animaci, jako je texturování, tvorba kostry a skinning. Zmínil jsem také, jak je možné ze zařízení Kinect získávat prostorová data a jak je použít pro animaci. Rozebral jsem možný způsob manipulace s modelem prostřednictvím rotací pomocí kvaternionů a na svém kódu vysvětlil implementaci této logiky. Popsal jsem, na jakém principu jsem založil systém kontroly techniky provádění cviků a na zdrojovém kódu ukázal možnou implementaci. Nakonec jsem zmínil, jak je řešené grafické uživatelské rozhraní aplikace a jak je použito rozpoznávání řeči a vstup z klávesnice k interakci s programem. V implementační části jsem nejprve vytvořil model použitelný pro animaci užitím výše zmíněných metod. Naprogramoval jsem funkce, které získávají data ze zařízení Kinect a ty jsem dále zpracoval a použil pro animaci modelu, jenž kopíruje pohyb cvičence. Implementoval jsem systém podmínek, který informuje uživatele o průběhu tréninku a v závislosti na prováděném cviku upozorňuje na případné nedostatky. Ovládání aplikace jsem zajistil pomocí klávesnice a hlasových povelů. Jako možné způsoby rozšíření bych viděl vytvoření malé sociální sítě, kde by se scházela komunita uživatelů využívajících tuto aplikaci. Tito lidé by sdíleli výsledky tréninků, cvičební plány, komentovali a hodnotili plány druhých a předávali si zkušenosti z oblasti posilování. To by mohlo vyústit ve vznik přátelské rivality mezi uživateli a vzájemného překonávání se, což považuji za velké pozitivum, neboť to je věc, která razantně zvyšuje motivaci k lepším výsledkům.
32
Literatura [1] P. J. Deitel a H. M. Deitel. C# 2010 for Programmers. Prentice Hall, Saddle River, New Jersey, 2010. [2] H. S. D. B. S. H. T. C. J. Preece, Y. Rogers. Human-Computer Interaction: Concepts And Design. Addison Wesley, Boston, Massachusetts, first edition, 1994. [3] J. S. P. F. Jiří Žára, Bedřich Beneš. Moderní počítačová grafika. Computer Press, Brno, 2004. [4] T. Mullen. Introducing Character Animation with Blender. Wiley Publishing, Inc., Indianapolis, Indiana, second edition, 2011. [5] MUSCLE&FITNESS. Zásobník cviků. Fit plus international publishing, Bratislava, 2005. [6] A. Reed. Learning XNA 4.0. O’Reilly Media, Sebastopol, CA, 2010. [7] A. Schwarzenegger. The New Encyclopedia Of Modern Bodybuilding. Simon & Schuster, 1230 Avenue of the Americas, New York, 1998. [8] V. Vasconcelos. Blender 2.5 Character Animation Cookbook. Packt Publishing, 32 Lincoln Road, Birmingham, 2011.
33
Přílohy Obsah CD Součástí této práce je CD s následujícím obsahem: ∙
text práce ve formátu PDF
∙
zdrojové kódy vytvořené aplikace
∙
trojrozměrný model postavy použitý v aplikaci
∙
spustitelná verze aplikace
34
Přílohy
Použité cviky
Prvním cvikem, který aplikace obsahuje, jsou kladivové zdvihy (obrázek 5.1). U tohoto cviku je důležitá volba vhodné váhy. Při přetížení může docházet k nežádoucímu pohybu kyčlí směrem vpřed, což ulehčuje způsob provádění a má negativní vliv na účinek tréninku. Aplikace však obsahuje kontrolu, jestli si uživatel nenaložil moc velké zatížení a v případě, že tomu tak je, ho upozorní. U tohoto cviku je také možnou rotací v zápěstí docílit přenesení zatížení buď na dvojhlavý sval pažní, činka uchopena podhmatem, nebo na sval vřetení, činka uchopena nadhmatem. Toto je jeden z nejlepších cviků pro rozvoj svalstva v oblasti bicepsu a předloktí.
Obrázek 5.1: Kladivové zdvihy se znázorněním zapojeného svalstva
Dalším cvikem je tlak s jednoručními činkami (obrázek 5.2). Při této technice může cvičenec sedět, nebo vzpřímeně stát. Při poloze v sedě je důležité dbát na plynulost pohybu rukou. Trhavé pohyby mohou deformovat páteř a způsobit tak zranění. Díky základnímu pohybu v celém 35
Přílohy rozsahu je tento cvik výborný pro rozvoj deltových svalů a svalstva ve střední části zad.
Obrázek 5.2: Tlak s jednoručními činkami se znázorněním zapojeného svalstva
Další cvik, který jsem vybral, se nazývá upažování nad hlavu (obrázek 5.3). Tento úkon je často prováděn tak, že je pohyb paží s činkami veden jen do úrovně ramen. Umožňuje to zvedat těžší závaží, ale zmenšuje rozsah pohybu ramen a zmenšuje to jejich pohyblivost. Z tohoto důvodu je důležité provádět cvik správně a zvedat paže úplně nad hlavu. Důležité je také správné dýchání. Nádech a zadržení dechu by se u tohoto cviku mělo provádět během zvedání zátěže vzhůru, vydechnutí pak s pohybem dolů. Pokud by se vydechovalo s pohybem vzhůru, docházelo by k oslabení svalového tahu. To by mohlo mít negativní vliv na schopnost zvednout danou zátěž až do polohy nad hlavu, ale také by to mohlo přivodit zranění páteře nebo ramen. Do aplikace je tato skutečnost zavedena a tak je uživatel v zájmu jeho zdraví o tomto problému při cvičení tohoto cviku dostatečně informován. Tento cvik je důležitý pro rozvoj bočních stran ramen a střední části zad.
36
Přílohy
Obrázek 5.3: Upažování nad hlavu se znázorněním zapojeného svalstva Posledním cvikem je předpažování s jednoručními činkami (obrázek 5.4). I zde je důležitá volba vhodné váhy. Přetížení může vést k zaklánění, prohybu zad, nebo vysunutí kyčlí. Proto je lepší volil lehčí váhu a dbát na správnou techniku. Aplikace uživatele hlídá, jestli k chybám techniky nedochází a v případě, že tomu tak je, ho vhodně informuje. Pro docílení větší zátěže deltového svalstva je možné zvedat činky mírně nad vodorovnou hranici ramen. Při vhodné volbě těžší zátěže je více zapojena oblast hrudníku. Tento cvik primárně rozvíjí přední hlavu deltového svalu a horní část hrudníku. Obrázky použité v příloze jsou převzaty a upraveny z [5].
37
Přílohy
Obrázek 5.4: Předpažování s jednoručními činkami se znázorněním zapojeného svalstva
38