MASARYKOVA UNIVERZITA FAKULTA INFORMATIKY
Motivační hra se silovou zpětnou vazbou BAKALÁŘSKÁ PRÁCE
Vilém Šustr
Brno, jaro 2007
Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypraco val 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.
Vedoucí práce: doc. Ing. Jiří Sochor, CSc. 11
Poděkování Chtěl bych poděkovat doc. Ing. Jiřímu Sochorovi, CSc, vedoucímu mé práce, za spousty cenných rad a nápadů. Dále bych rád poděkoval svým přátelům a kolegům Vaškovi a Martě za ochotu a pomoc a v neposlední řadě také celému kolektivu laboratoře HCl za vstřícnost a zájem.
m
Shrnutí Cílem této práce bylo prostudovat zařízení Reachin Display a jeho součásti a navrhnout a implementovat jednoduchou motivační hru využívající virtuální realitu se silovou zpětnou vazbou. Dalším úkolem bylo navrhnout potřebné funkce či knihovny pro haptické a grafické vykreslování a stereoprojekci za použití programovacího jazyka C++, knihoven OpenGL a GLUT, modelů ve formátu 3ds a především balíku knihoven OpenHaptics - alternativy k Reachin API. Tato bakalářská práce společně s přiloženými zdrojovými kódy tedy může sloužit jako výchozí studijní materiál pro studenty, kteří chtějí vyvíjet aplikace se silovou zpětnou vazbou pomocí knihoven OpenHaptics. Úvod je věnován problematice virtuální reality a jejím jednotlivým disciplínám. Jsou zde popsána zařízení pro práci ve virtuálně reálném prostředí se silovou zpětnou vazbou. Druhá kapitola vysvětluje princip a funkce balíku knihoven OpenHaptics a stručně komentuje jeho součásti. Programováním aplikací s virtuální realitou se silovou zpětnou vazbou se zabývá třetí kapitola. Dále se věnuje praktickému využití knihoven OpenHaptics společně s C++, OpenGL, GLUT. Krátká čtvrtá pasáž pojednává o zobrazení modelů ve formátu 3ds. Pátá část popisuje navrženou motivační hru, její účel, princip a další možná rozšíření. Šestá kapitola je zaměřena na implementační detaily vybraných problematických oblastí aplikace - hry. Závěr bakalářské práce obsahuje shrnutí získaných poznatků a dosažených výsledků.
IV
Klíčová slova Sensable Phantom, Reachin Display, CrystalEyes 3, Stereo view, OpenHaptics, OpenGL, GLUT, 3ds, virtuální realita, motivační hra
Obsah 1
2
3
4 5
6
7 A
Úvod 1.1 Virtuální realita se silovou zpětnou vazbou 1.1.1 Vizuální vjem 1.1.2 Hmatový vjem 1.1.3 Užití virtuální reality se silovou zpětnou vazbou 1.2 Zařízení Reachin Display 1.2.1 SensAble Phantom 1.2.2 StereoGraphics CrystalEyes Balík knihoven OpenHaptics 2.1 Charakteristika balíku knihoven OpenHaptics 2.2 Součásti balíku knihoven OpenHaptics 2.2.1 HDAPI 2.2.2 HLAPI 2.2.3 Utility Programování aplikací se silovou zpětnou vazbou 3.1 Struktura aplikace se silovou zpětnou vazbou 3.2 Inicializace haptického zařízení 3.3 Grafícký vs. haptický rendering 3.4 Vykreslení kurzoru 3.5 Stereoskopické zobrazení Knihovna L3DS Motivační hra Bludiště 5.1 Účelhry 5.2 Princip a ovládání hry 5.3 Možnosti rozšíření, nápady Implementace 6.1 Kontakt kurzoru s bludištěm a koulí 6.2 Bludiště 6.3 Fyzikální model Závěr Obsah přiloženého CD
1 1 1 2 2 2 3 4 5 5 6 6 7 9 11 11 12 13 14 15 19 20 20 20 21 22 22 22 23 24 26
VI
Seznam obrázků 1.1 1.2 1.3
Reachin Display 3 SensAble Phantom Desktop 3 Stereoskopické brýle StereoGraphics CrystalEyes 3 4
2.1 2.2 2.3
Schéma balíku knihoven OpenHaptics Schéma knihovny HDAPI 7 Schéma knihovny HLAPI 9
3.1
Haptický kurzor
3.2
Vizuální výstup stereoprojekce
5.1
Ovládání hry
6.1
Bludiště
6
16 18
21
23
Vil
Kapitola 1
Úvod Virtuální realita je technologie, která umožňuje uživateli interakci s počítačem simulovaným prostředím, působí na jeho smysly zdánlivě reálnými vjemy S virtuální realitou se v dnešní době dostává běžný uživatel do styku čím dál častěji. Výkonné počítače, schopné základní virtuální realitu zpracovat, jsou dnes víceméně bez obtíží dostupné. Úvodní kapitola po jednává o principech virtuální reality, zvláště pak o virtuální realitě se silovou zpětnou vazbou a stereoskopickým zobrazováním.
1.1
Virtuální realita se silovou zpětnou vazbou
Většina dnešních typů virtuální reality poskytuje primárně vizuální informace, aí už se jedná o počítačovou obrazovku, speciální stereoskopické displeje, či brýle. Simulace běžně nabízejí další smyslové vjemy, například zvuk skrze reproduktory nebo sluchátka. Pokročilé virtuální simulace navíc umožňují uživateli vnímat např. hmatové informace, obecně známé jako silová zpětná vazba. V praxi může být obtížné vytvořit vysoce kvalitní vícesmyslový virtuální zážitek hlavně z důvodu technických omezení týkajících se výkonnosti počítačů. Uživatel může pracovat s virtuálním prostředím pomocí standardních vstupních zařízení nebo užitím zvláštních ukazovacích zařízení, například rukavic a přístrojů silové zpětné vazby.
1.1.1 Vizuální vjem Základním výstupem virtuální simulace je zpravidla obraz. Virtuální realita se stává ještě skutečnější, pokud se jedná o obraz prostorový. Člověk vnímá svět okolo sebe prostorově a dokáže rozpoznat vzdálenost a pohyb v prostoru díky svým dvěma očím, které jsou od sebe vzdálené a které se na scénu dívají pod různým úhlem. Lidský mozek je pak schopen tyto dvě rozdílné informace zpracovat do jednoho trojrozměrného vjemu. S virtuálními sim ulacemi se silovou zpětnou vazbou se zpravidla pracuje pomocí kurzoru pohybujícího se v prostoru podle toho, jak uživatel hýbe ramenem haptického zařízení. Zde je nasazení stere oskopického zobrazení prakticky nezbytné, neboť uživatel ke své práci potřebuje vnímat polohu haptického kurzoru v prostoru, aby mohl správně a přirozeně interagovat s různě vzdálenými objekty ve scéně. Prostorového obrazu je docíleno střídavým zobrazováním scény zvlášt pro pravé a zvláší pro levé oko. Lidskému oku se pohyb jeví plynulý již při 24 snímcích za sekundu. Pro kvalitní prostorové zobrazení je tedy nezbytné, aby frekvence zobrazení byla minimálně dvojnásobná, jinak virtuální zážitek trpí nepříjemným blikáním. 1
1. ÚVOD
1.1.2 Hmatový vjem Na rozdíl od virtuální reality obrazové hmatová virtuální realita nepatří mezi běžné sim ulace. Oklamání lidského hmatu je mnohem složitější než oklamání lidského oka. Hma tový vjem nabývá zdání plynulosti až při 1000 „hmatových snímcích" za sekundu. Dosažení takovéto vysoké obnovovací frekvenci může být v praxi značně výpočetně náročné, zvláště u složitějších modelů těles. Pokud by frekvence haptického renderování byla nižší, dotyk a pohyb po povrchu objektu by se jevil neplynulý a trhavý. Navíc by se mohlo přihodit i to, že by se haptický kurzor dostal pod povrch virtuálního tělesa a uživatel by pak pocítil nepříjemý zpětný ráz, kterým by haptické zařízení vrátilo kurzor zpět na povrch. Při vývoji hmatových simulací je nezbytné také správné nastavení vlastností těles, při příliš velké tuhosti povrchů může dojít např. k nežádoucím vibracím ramena haptického zařízení. V kombinaci s prostorovým zobrazením je vhodné využít promítání obrazu na polopropustné zrcadlo tak, aby fyzická poloha ramene haptického zařízení byla totožná s polo hou zobrazovaného virtuálního kurzoru. Dosažený výsledný efekt je pak velice působivý, uživatel se nedotýká objektů na počítačové obrazovce, ale přímo v místě, kde je vidí (pod zrcadlem). 1.1.3 Užití virtuální reality se silovou zpětnou vazbou Virtuální simulace se silovou zpětnou vazbou nabízí vůbec nejintuitivnější způsob inter akce člověka s počítačem - práci a řešení problémů pomocí dotyku. Objekty generované počítačem mohou být vytvářeny, manipulovány a deformovány stejně jako jejich protějšky v reálném světě. Simulace se silovou zpětnou vazbou mají v moderní vědě, průmyslu i jiných disciplínách široké uplatnění. Používají se k průmyslovému a uměleckému designu, tvorbě virtuálních modelů a soch z hlíny, modelování pomocí deformace těles. Velice užitečná je virtuální re alita v oblasti medicíny a zubařství, kde se osvědčila u chemických a chirurgických simulací a lékařského výcviku díky nezbytnému dotykovému vjemu. V neposlední řadě je virtuální realita často nasazována u realistických počítačových her. 1.2
Zařízení Reachin Display
V laboratoři HCl (Human Computer Interaction) na FI MU je dostupný přístroj pro virtuální re alitu se silovou zpětnou vazbou s názvem Reachin Display vyrobený firmou Reachin Technolo gies (obr. 1.1). Je složen s několika oddělených zařízení umístěných na speciálním stojanu: CRT monitor připojený k PC, polopropustné zrcadlo, haptické zařízení Sensable Phantom Desktop a brýle Crystal Eyes. Monitor je upevněn na speciální šikmé plošině tak, aby se jeho obraz promítal pod úhlem 60 stupňů na horizontální polopropustné zrcadlo. Pod zrcadlem je umístěno rameno a držadlo přístroje pro silovou zpětnou vazbu - Phantomu. Uživatel se při práci dívá skrze brýle svrchu na zrcadlo a operuje ramenem umístěným pod ním. Nabývá tak dojmu, že pracuje se skutečnými objekty. Obraz musí být samozřejmě správně transformován tak, aby odraz v zrcadle odpovídal dění pod zrcadlem. Více informací naleznete na internetových stránkách společnosti Reachin Technologies[l], výrobce zažízení Reachin Display[l] a balíku knihoven Reachin API[1].
2
1. ÚVOD
Obrázek 1.1: Reachin Display 1.2.1 SensAble Phantom SensAble Phantom Desktop je elektronické vstupně-výstupní zařízení pro zpracování silové zpětné vazby (obr. 1.2). Je schopné určit polohu a natočení kurzoru ve třídimenzionálním prostoru, dokáže vyvíjet silovou zpětnou vazbu v 6-ti osách. Jedná se o mechanické rameno opatřené třemi servomotory, které je zakončeno držadlem ve tvaru pera. Na držadle je také umístěno jedno ovládací tlačítko, které lze při vývoji aplikací využít podobně jako tlačítka u myši - můžeme mu přiřadit libovolnou funkci. Phantom umožňuje volný pohyb ve všech osách v rozsahu 160mm x 120mm x 120mm. Zařízení pracuje s velice slušnou přesností, poloha je vyhodnocena s maximální odchylkou 0,023mm.
Obrázek 1.2: SensAble Phantom Desktop Připojení Phantom Desktop k počítači je realizováno pomocí paralelního portu. Dražší 3
1. ÚVOD
zařízení využívají rozhraní IEEE1394. Je možné také spojit dohromady dvě zařízení typu Phantom Desktop, která budou pracovat souběžně. Další technické specifikace naleznete na internetových stránkách firmy SensAble Technologies[2], výrobce Phantom Desktop[2] a příbuzných zařízení. 1.2.2 StereoGraphics CrystalEyes Zařízení Reachin Display používá ke stereoskopickému zobrazování speciální brýle Stere oGraphics CrystalEyes 3, které jsou vyobrazeny na obrázku 1.3. Jedná se o brýle se dvěma bateriemi a dvěma skly s vrstvou tekutých krystalů. Díky krystalům jsou skla schopna se s vysokou frekvencí střídavě zatemnit a zprůhlednit. K brýlím náleží také zařízení pro syn chronizaci s obrazem (zajišťuje přepínání brýlí synchronizovane s obrazem pro levé/pravé oko a aby levé oko nedostalo obraz pro pravé), které je připojeno ke grafické kartě PC a s brýlemi komunikuje pomocí infračerveného záření. Když se uživatel podívá brýlemi směrem, kde je synchronizační zařízení umístěno (na stojanu mezi monitorem a zrcadlem), brýle se automaticky začnou korektně zprůhledňovat a zatemňovat.
Obrázek 1.3: Stereoskopické brýle StereoGraphics CrystalEyes 3
4
Kapitola 2
Balík knihoven OpenHaptics Tato bakalářská práce je především věnována principu vývoje aplikací pomocí knihoven OpenHaptics, Microsoft Visual C++, OpenGL a GLUT Kapitola o programování aplikací se silovou zpětnou vazbou popisuje balík knihoven OpenHaptics Academie Edition a jeho funkce, dále pak základní principy vývoje haptických simulací pomocí uvedených nástrojů. 2.1
Charakteristika balíku knihoven
OpenHaptics
Balík knihoven OpenHaptics od firmy SensAble Technologies[2] umožňuje vývojářům softwaru přidat hmatovou simulaci a reálnou 3D navigaci do široké škály aplikací, od designu, přes hry a zábavu až po simulace a zobrazování. Balík OpenHaptics je navržen podle vzoru OpenGL, čímž je snadno uchopitelný pro pro gramátory. Ovládá se tedy jako stavový automat. Při jeho použití mohou vývojáři využít existující OpenGL kód specifikující geometrii a doplnit jej o příkazy k simulaci vlastností haptických materiálů. Rozšiřitelná architektura umožňuje přidání funkcionality a je zkon struována k integraci podpůrných knihovnen, například nástrojů pro fyziku/dynamiku a detekci kolizí. Knihovny OpenHaptics podporují celou řadu zařízení SensAble Phantom od levných Phan tom Omni po nákladné Phantom Premium. Aktuální verze je schopna pracovat na platformách s operačními systémy Microsoft Windows XP a 2000, Red Hat Linux, Fedora nebo SuSE a Mac OS X. Pro aplikaci přiloženou k této bakalářské práci je použita verze OpenHaptics Academie Edi tion, která vychází z komerční OpenHaptics 2.0. Balík knihoven je možno bezplatně stáhnout z internetových stránek Developer Support Center[3] firmy Sensable Technologies. Je však k dis pozici pouze osobám příslušným k některé akademické instituci. Mezi komerční a aka demickou verzí údajně není žádný rozdíl ve funkcionalitě, akademická je však dostupná pouze pro operační systém Microsoft Windows XP/2000. Minimální požadavky pro běh aplikací využívajících balík OpenHaptics Academie Edition: •
Hardware: -
Intel Pentium 4 a vyšší. 100 MB volného místa na pevném disku. 256 MB RAM. Paralelní port/FireWire v závislosti na modelu Phantom.
•
Software: Microsoft Windows 2000 nebo XP.
•
Kompilátor: Microsoft Visual C++ 6.0 a vyšší.
•
Ovladače: Phantom Device Drivers v4.2.49. 5
2. BALÍK KNIHOVEN OpenHaptics 2.2
Součásti balíku knihoven
OpenHaptics
Balík OpenHaptics se skládá ze dvou hlavních částí - knihoven Haptic Device API (HDAPI) a Haptic Library API (HLAPI). Dále balík obsahuje utility, ovladače haptického zařízení pod porující všechna zařízení nesoucí označení Phantom, jednoduché příklady se zdrojovými kódy a programátorskou a referenční příručku. Knihovny HDAPI a HLAPI se od sebe vzájemně liší úrovní přístupu, je však možné použít HDAPI a HLAPI ve spojení a využít výhod obou najednou.
Obrázek 2.1: Schéma balíku knihoven OpenHaptics
2.2.1 HDAPI Haptic Device API (HDAPI) dovoluje programátorům přistupovat k haptickému zařízení na nízké úrovni, umožňuje přímé renderovaání síly, nabízí konfiguraci a řízení běhu ovladačů a skýtá pohodlné ladící prostředky. Je to základní vrstva pro haptiku, vhodná pro vývojáře znalé haptických zákonitostí a přímého zpracování síly. Přímé renderování síly v HDAPI vyžaduje efektivní algoritmy pro renderování síly a detekci kolizí a užití vhodných datových struktur. To je nutné kvůli zajištění vysoké obnovovací frekvence „haptických snímků". HDAPI umožňuje přístup k nízkoúrovňovému ovládání zařízení, jako například DAC hod noty motoru. Schéma knihovny HDAPI je vyobrazeno na obrázku 2.2. Knihovna HDAPI disponuje následující funkcionalitou: •
Zjištění stavu zařízení: Zjištění pozice, orientace, rychlosti a stavu tlačítek.
•
Zjištění charakteristik zařízení: Zjištění typu modelu, verze, sériového čísla, rozměrů pracovní plochy, teploty motoru, maximální tuhosti, síly a rychlosti, kalibrační schopnosti apod.
•
Zadání stavu zařízení: Nastavení síly/kroutícího momentu, DAC motoru.
•
Plánovač (Scheduler): Použití synchronních a asynchronních zpětných volání definovaných uživatelem, nas tavení plánování zpětných volání, nástroje pro synchronizaci haptického a grafického vlákna, obnovovací frekvence (servo loop rate) definovaná uživatelem. 6
2. BALÍK KNIHOVEN OpenHaptics Zapínání/vypínání (Enable/Disable): Zapínání/vypínání silového výstupu. Chybová hlášení: Varování při překročení maximální síly a rychlosti. Kalibrace:
Zjištění charakteristik
m
Automatická a manuální kalibrace. Nastavení stavu zařízení Ovládání Zapínání/vypínání
Haptické zařízení Fyzikální charakteristiky a kinematické transformace
Plánovač Synchronní aasynch ranní uživateská zpětná volání
Obsluha chyb
Haptické vlákno
Detekce chyba bezpečnost
Kalibrace I/O (liší se u jednotlivých platforem) Paralelní port, IEEE-1394 FireWire, PCI
Obrázek 2.2: Schéma knihovny HDAPI
2.2.2 HLAPI Haptic Library API (HLAPI) je založena na vysokoúrovňovém haptickém renderingu a je navržena pro programátory navyklé na OpenGL API. Je postavena nad HDAPI, vývojáři mo hou rozšířit HLAPI o funkcionalitu nižší úrovně HDAPI. HLAPI umožňuje ovládání haptiky na vyšší úrovni na úkor flexibility ve srovnání s HDAPI. Dovoluje znovupoužití hotových částí existujícího OpenGL kódu a do značné míry zjednodušuje synchronizaci haptického a grafického vlákna. Je zaměřena na vývojáře, kteří chtějí rychle a snadno přidat haptiku do existujících grafických aplikací. V HLAPI je renderování haptického výstupu založeno na výpočtech z geometrických primitiv (trojúhelníků, čar a bodů), transformacích a vlastnostech materiálů. Přidání haptiky objektu je triviální proces - model, který reprezentuje objekt graficky, jej bude reprezentovat i hapticky Dotykové vlastnosti, jako tuhost, tření a tlumení, jsou souhrnně definovány jako materiál. HLAPI pracuje s kartézským systémem souřadnic. Stejně jako OpenGL se HLAPI chová jako stavový automat. Většina příkazů knihovny HLAPI mění stav, který uchovává informace o aktuálním nastavení materiálu, transformaci a renderovacím módu. Navíc stav HLAPI obsahuje také aktuální stav haptického zařízení - pozici a orientaci. Pro snadnou integraci do aplikací, HLAPI podporuje také obsluhu událostí, zejména dotyk, stisknutí tlačítka nebo pohyb. API umožňuje nastavit obslužné funkce, které jsou volány, kdykoli patřičná událost nastane. 7
2. BALÍK KNIHOVEN OpenHaptics Na obrázku 2.3 lze vidět schéma HLAPI. Knihovna nabízí následující funkce: •
Tvary: OpenGL primitiva (polygony, čáry a body).
•
Silové efekty: Konstantní síla (gravitace), hustota, 3D tření a pružnost.
•
Dotykový model: Jednotlivé body, kontakt, omezení.
8
2. BALÍK KNIHOVEN OpenHaptics Nastavení vlastností materiálu povrchu: Dotyk přední/zadní strany, tuhost a tlumení, tření. Dynamika: Příprava pro integraci systému fyziky/dynamiky a detekce kolizí třetí strany, deformovatelné objekty. Události: Detekce událostí pro simulaci 2D myši, dotyk/konec dotyku, tlačítko, pohyb a kali braci.
Re n děrován í útvarů Geometrie OpenGL pol y g on y, bod y, čá ry
Vlastní geometrie
Materiály t řen í, tu host, ťi u m sn í
d 6 f o r
^Ä,
b J 6
kty
Přfmé ren děrování proxy Integrace systémů pro simulace a
Přímé sílové re n děrován í Standardní efekty
Řízení stavu a obsluha chyb
Vlastní efekty
Haptický rendering (pipeline)
HDAPI
Obrázek 2.3: Schéma knihovny HLAPI
2.2.3 Utility K balíku knihoven OpenHaptics je přiloženo několik utilit. Mnoho užitečných funkcí zahrnují knihovny HLU (hlu . h) a HDU (hdu. h). •
Vector/Matrix Math Hlavičkový soubor HDU/hduVector. h nabízí jednoduché API pro běžné vektorové operace v trojrozměrném prostoru. Dále zahrnuje základní maticové transformace a algebru.
•
Mapování pracovního prostoru na kameru Jedním z náročných aspektů programování grafických aplikací jsou transformace mezi souřadnicovými systémy. Haptické zařízení přináší ještě vlastní souřadnicový systém, kterému se říká Workspace System. Integrace haptiky a grafiky znamená sjednocení haptické pracovní plochy a perspektivy grafiky. To znamená nutnost definice vlastní haptické perspektivy, která například udává, jak moc vzdálených objektů je možné se ještě dotýkat. Toto je realizováno pomocí funkcí knihovny HLU. 9
2. BALÍK KNIHOVEN OpenHaptics •
Zábrany, prichytávaní Knihovna zábran a prichytávaní umožňuje implementovat jednoduchá omezení, jako například přichycení haptického kurzoru od určité vzdálenosti k bodu, přímce nebo povrchu, a dovoluje také zábrany kombinovat. Jedná se o hlavičkové soubory s názvy S n a p C o n s t r a i n t . h , C o m p o s i t e C o n s t r a i n t . h apod.
•
hduError Hlavičkový soubor h d u E r r o r . h poskytuje některé speciální funkce pro obsluhu chyb haptického zařízení.
•
hduRecord Pro vytváření souborů se záznamy (logy) lze využít utilitu hduRecord. Nasbírané informace za určitý počet haptických snímků (tzv. servo loop ticks) jsou uloženy do určeného souboru.
•
Haptic Mouse Nástroj Haptic Mouse emuluje 2D ukazovací zařízení pro aplikace, které vyžadují použití 2D myši. Kurzor haptického zařízení tedy může být používán ke stisku tlačítek, výběru položek z nabídek a k obecné interakci s grafickým uživatelským rozhraním.
10
Kapitola 3
Programování aplikací se silovou zpětnou vazbou Následující kapitola se zabývá praktickými úkoly integrace haptiky do standardní grafické aplikace využívající knihoven OpenGL a GLUT, dále implementací stereozobrazení. Kapitola také popisuje základní strukturu aplikace se silovou zpětnou vazbou. V příkladech bude postupně sestavena vzorová aplikace zobrazující kouli, jež je možné se dotýkat pomocí haptického zařízení. Procedury pro inicializaci a vykreslení se zdvojují, vše zvlášf pro grafiku a haptiku. Na jedné straně probíhá nastavení grafické knihovny, na druhé straně se inicializuje haptické zařízení. Obdobně se vykonává grafický a haptický rendering. Ze stejných geometrických primitiv se odděleně vytváří grafické a haptické snímky.
3.1
Struktura aplikace se silovou zpětnou vazbou
Hlavním tělem aplikace je dle zvyklostí funkce main ( ) , kde se pomocí volání knihovních funckí GLUT vytváří nové okno, nastavuje se režim zobrazení, provádí se inicializace, reg istrují se zpětná volání (callbacks), spouští se hlavní smyčka aplikace a nastavují se „úklidové funkce" prováděné po opuštění hlavní smyčky. Pro naši vzorovou aplikaci bude funkce main () vypadat následovně: void main(int arge,
char
**argv)
{
glutlnit(Sarge, argv); glutlnitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_STEREO); glutCreateWindow("Bludiště"); glutFullScreen (); // Celá obrazovka glutSetCursor(GLUT_CURSOR_NONE); // Vypnutí kurzoru Init () ; glutKeyboardFunc(Keyboard); glutldleFunc(Idle); glutDisplayFunc(Display); glutReshapeFunc(Reshape); atexit(ExitHandler);
// // // // // //
Společná inicializace Obsluha klávesnice Volání překreslení Společné vykreslení Mapování souřadnic Úklidová funkce
glutMainLoop();
// Hlavní smyčka
11
3. P R O G R A M O V Á N Í APLIKACÍ SE SILOVOU ZPĚTNOU VAZBOU
3.2
Inicializace haptického zařízení
Nezbytným základem všeho je korektní inicializace haptického zařízení. K inicializaci a kon figuraci haptického zařízení je nutné použít funkce knihovny HDAPI. Napřed se inicializuje handler zařízení HHD (Haptic Device Handle). HHD je používán haptickým renderovacím kontextem HHLRC (HL Haptic Rendering Context) jako rozhraní k haptickému zařízení. To dovoluje vývojářům ovládat chování haptického zařízení realizované pomocí haptické ren derovací knihovny. Například h d E n a b l e () a h d D i s a b l e () může být použito k zapnutí a vypnutí funkcí HD API. Funkce I n i t () spouští dvě oddělené funkce i n i t G L () a l n i t ( H L ) : v o i d I n i t () {
InitGL(); InitHLO;
// Inicializace grafické knihovny // Inicializace haptické knihovny
} Funkce I n i t H L má za úkol inicializovat handler haptického zařízení a vytvořit haptický renderovací kontext, nastavit parametry haptického renderování, registrovat haptická tělesa a zpětná volání pro haptické události a v případě neúspěchu vrátit patřičnou infor maci o chybě a skončit. Nejprve je třeba deklarovat tyto globální statické proměnné: s t a t i c HHD hHD = HD_INVALID_HANDLE; / / Handle h a p t . z a ř í z e n í s t a t i c HHLRC hHLRC = 0; / / Hapt. r e n d e r o v a c í k o n t e x t Pak je možné zavolat samotnou funkci I n i t H L ():
12
3. P R O G R A M O V Á N Í APLIKACÍ SE SILOVOU ZPĚTNOU VAZBOU
void InitHLO { HDErrorlnfo error; hHD = hdlnitDevice(HD_DEFAULT_DEVICE); // Inicializace if (HD_DEVICE_ERROR(error = hdGetError())) { hduPrintError(stderr, Serror, "Selhala inicializace haptického zařízení"); fprintf(stderr, "Stiskněte libovolnou klávesu"); getchar (); exit (-1); } hHLRC = hlCreateContext(hHD); hlMakeCurrent(hHLRC);
// Vytvoření kontextu
hlEnable(HL_HAPTIC_CAMERA_VIEW); hlTouchableFace(HL_FRONT);
// Dotyk přední stěny
gSphereShapeld = hlGenShapes(1);
// Vygenerování ID koule
hlAddEventCallback(HL_EVENT_TOUCH, gSphereShapeld, HL_CLIENT_THREAD, STouchSphereCallback, NULL); hlAddEventCallback(HL_EVENT_UNTOUCH, gSphereShapeld, HL_CLIENT_THREAD, SUntouchSphereCallback, NULL);
3.3
Grafický vs. haptický rendering
Grafický a haptický rendering probíhá v aplikacích se silovou zpětnou vazbou odděleně. HLAPI dovoluje využití grafické scény vykreslené pomocí OpenGL pro haptický render ing. Deklarujeme funkci Render ( ) , která bude sloužit jak pro grafické, tak pro haptické vykreslování.
13
3. PROGRAMOVÁNÍ APLIKACÍ SE SILOVOU ZPĚTNOU VAZBOU
void Render() // Vykreslení objektů { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glutSolidSphere(1, glPopMatrix();
20, 2 0 ) ; / / V y k r e s l e n í
koule
} Zmíněnou funkci Render () uplatníme ve funkci D r a w S c e n e H a p t i c s () i ve funcki D r a w S c e n e G r a p h i c s ( ) , která bude uvedena dále v podkapitole o stereoskopickém zo brazení. Funkce D r a w S c e n e H a p t i c s () provádí haptický rendering a nastavuje materiál jejich povrchů. Haptický snímek začíná funkcí h l B e g i n F r a m e (), končí hlEndFrame () . Geometrie haptického tělesa je deklarována v prostoru mezi funkcemi h l B e g i n S h a p e () a h l E n d S h a p e ( ) . Vlastosti materiálu povrchu se nastavují pomocí funkce h l M a t e r i a l f () . Funkce h l C h e c k E v e n t s () kontroluje, zdali nenastaly nějaké haptické události. void
DrawSceneHaptics()
{
hlBeginFrame(); hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK,
HL_STIFFNESS, 0 . 3 f ) ; HL_DAMPING, 0 . 4 f ) ; HL_STATIC_FRICTION, 0 . 2 f ) ; HL_DYNAMIC_FRICTION, 0 . 2 f ) ;
hlBeginShape(HL_SHAPE_FEEDBACK_BUFFER, Render () ; hlEndShape();
sphereShapeld);
hlEndFrame(); hlCheckEvents (); } Parametr HL_FRONT_AND_BACK u nastavení materiálu sděluje, že daná vlastnost bude ap likována na přední i zadní stranu tělesa. Dále pak konstanta HL_STIFFNESS značí tuhost, HL_DAMP ING modifikuje tlumení a statické a dynamické tření programátor nastavuje pomocí konstanty HL_STATIC_FRICT ION a HL_DYNAMIC_FRICT ION. Rozsah hodnot je u všech vari ant od 0 do 1. U funce h l B e g i n S h a p e () se jako parametr kromě typu bufferu uvádí i ID haptického tělesa. 3.4
Vykreslení kurzoru
Následující úsek kódu slouží k vykreslení haptického kurzoru. Aktuální matice kurzoru, která udává jeho pozici a rotaci se načte do pole p r o x y t r a n s f orm. Příslušná transfor-
14
3. P R O G R A M O V Á N Í APLIKACÍ SE SILOVOU ZPĚTNOU VAZBOU
mace se pak provede pomocí g l M u l t M a t r i x d ( p r o x y t r a n s f o r m ) a kurzor může být prostřednictvím kvadriky vykreslen a obarven. void DrawCursor() { HLdouble proxytransform[16]; GLUquadricObj *qobj = 0; glPushAttrib(GL_CURRENT_BIT
| GL_ENABLE_BIT | GL_LIGHTING_BIT);
glPushMatrix() ; hlGetDoublev(HL_PROXY_TRANSFORM, proxytransform); glMultMatrixd(proxytransform) ; glEnable(GL_COLOR_MATERIAL); glColor3f (0.5, 0.5, 0.5); qobj = gluNewQuadric(); g l u S p h e r e ( q o b j , 0.025, 15, gluDeleteQuadric(qobj);
15);
glDisable(GL_COLOR_MATERIAL); glPopMatrix(); glPopAttribO ; } Kurzor bude v našem případě vypadat jako šedá koule o průměru 0,25 a bude se ob jektů dotýkat pouze jediným bodem - svým středem. Funkce DrawCursor () bude posléze zahrnuta ve funknci D r a w S c e n e G r a p h i c s ( ) , která sprostredkováva veškeré operace pro grafickéhé vykreslení včetně stereoskopických transformací. Na obrázku 3.1 můžeme vidět kurzor tak, jak bude vypadat ve hře - koule, kterou se lze dotýkat objektů a průhledné kuličkové pero, načtené ze souboru 3ds, jenž objekty prochází. 3.5
Stereoskopické zobrazení
Grafické vykreslování zajištuje funkce D r a w S c e n e G r a p h i c s . Pro stereoskopické zobrazení pomocí brýlí Crystal Eyes 3 je nutné vykreslovat scénu střídavě z pohledu pro levé a pravé oko. Stereoprojekce tohoto typu vyžaduje, aby grafická karta podporovala Quad Buffering. To znamená, že pro zobrazování lze využít čtyřech bufferů, dvou pro levé a dvou pro pravé oko - Front Left, Front Right, Back Left a Back Right. Vykreslování probíhá vždy do back bufferů; buffer, do kterého se má právě vykreslovat, se nastavuje funkcí glDrawBuf f e r () s konstantou, například GL_BACK_RIGHT. Po vykreslení je back buffer pro obě oči překlopen pomocí funkce glutSwapBuf f e r s () do front bufferů, odkud je zobrazen.
15
3. P R O G R A M O V Á N Í APLIKACÍ SE SILOVOU ZPĚTNOU VAZBOU
Obrázek 3.1: Haptický kurzor
void
DrawSceneGraphics()
{
glDrawBuffer(GL_BACK); glClear(GL_COLOR_BUFFER_BIT); glDrawBuffer(GL_BACK_LEFT); glPushMatrix(); StereoProjection (-2.0, 2.0, - 1 . 6 , 6.0, -6.0, 0 . 0 , Render(); DrawCursor (); glPopMatrix ();
1.6, 14.5,
-0.31);
glDrawBuffer(GL_BACK_RIGHT); glPushMatrix(); StereoProjection (-2.0, 2.0, - 1 . 6 , 6.0, -6.0, 0 . 0 , Render(); DrawCursor (); glPopMatrix ();
1.6, 14.5,
0.31);
Funkce S t e r e o P r o j e c t i o n () počítá transformace obrazu odděleně pro levé a pravé oko. Je volána funkcí D r a w S c e n e G r a p h i c s pokaždé s jinými parametry. Funkce provádí také zrcadlové převrácení a otočení obrazu tak, aby se správně promítal v zrcadle zařízení Reachin Display a aby se zobrazované skutečnosti zdánlivě odehrávaly pod zrcadlem. 16
3. PROGRAMOVÁNÍ APLIKACÍ SE SILOVOU ZPĚTNOU VAZBOU
void StereoProjection(float left, float right, float bottom, float top, float nr, float fr, float zero_plane, float dist, float eye) { float xmid, ymid, clip_near, clip_far, topw, bottomw, leftw, rightw, dx, dy, n_over_d; // Rozsahy os x a y v cílové rovině dx = right - left; dy = top - bottom; // Středy rozsahů os x a y xmid = (right + left) / 2.0; ymid = (top + bottom) / 2.0; / / P ř e v e d e n í p o z i c e o ř e z . r o v i n y na v z d á l e n o s t p ř e d kamerou clip_near = d i s t + zero_plane - nr; clip_far = d i s t + zero_plane - fr; n_over_d = c l i p _ n e a r / d i s t ; / / Určení t v a r u projekce topw = n _ o v e r _ d * dy / 2 . 0 ; bottomw = - t o p w ; r i g h t w = n _ o v e r _ d * (dx / 2 . 0 - eye); leftw = n _ o v e r _ d * ( - d x / 2 . 0 - eye); glLoadldentity(); / / Nastavení perspektivy g l F r u s t u m ( l e f t w , r i g h t w , bottomw, / / Stereoskopická transformace g l T r a n s l a t e f ( - x m i d - eye, -ymid, g l R o t a t e f ( - 6 0 , 1, 0 , 0 ) ; glMultMatrixd(m);
topw, clip_near-6, clip_far+6); -4);
/ / Naklonění pro zrcadlo / / Z r c a d l e n í pomocí m a t i c e m
Funkce D i s p l a y je registrována jako zpětné volání knihovny GLUT pro vykreslení. Vykonává jak haptické, tak grafické vykreslení a překlopení bufferů.
void Display() { DrawSceneHaptics (); DrawSceneGraphics (); glutSwapBuffers (); } 17
3. P R O G R A M O V Á N Í APLIKACÍ SE SILOVOU ZPĚTNOU VAZBOU
Na obrázku 3.2 lze vidět vizuální výstup stereoprojekce tak, jak jej uživatel vidí bez brýlí.
Obrázek 3.2: Vizuální výstup stereoprojekce
18
Kapitola 4
Knihovna L3DS Haptický kurzor ve hře Bludiště má tvar kuličkového pera. Model pera je uložen ve formátu 3ds. Pro jeho načtení a zobrazení byla použita knihovna L3DS, stažená z internetových stránek Leva Povalaheva [4]. Knihovna je do aplikace začleněna prostřednictvím soborů 1 3 d s . h a 1 3 d s . cpp a umožňuje velice jednoduché načtení 3ds modelu ze souboru do struktury typu L 3D S a následné vykreslení. L3DS s c e n e ; void Display() { for (uint i= 0; Kscene. GetMeshCount () ; i + + ) { LMesh Smesh = scene.GetMesh(i); glVertexPointer(4, GL_FLOAT, 0, Smesh.GetVertex(0)); glNormalPointer(GL_FLOAT, 0, Smesh.GetNormal(0)); glColorPointer(3, GL_FLOAT, 0, Smesh.GetBinormal(0)); glDrawElements(GL_TRIANGLES, mesh.GetTriangleCount()*3, GL_UNSIGNED_SHORT, Smesh.GetTriangle(0)); } }
19
Kapitola 5
Motivační hra Bludiště 5.1
Účel hry
Motivační hra Bludiště je navržena jako experimentální rehabilitační metoda. Je vhodná pro cvičení a rehabilitaci jemné motoriky prstů a ruky, jakož i pohybového aparátu celé paže. Hra má za úkol motivovat především pacienty nízkého věku - děti. Sekundárně bude hra sloužit v laboratoři HCl pro prezentaci a experimenty. 5.2
Princip a ovládání hry
Jak již název hry napovídá, jedná se o plastické bludiště, ve kterém je umístěna koule. Po mocí haptického kurzoru se uživatel může dotýkat a prozkoumávat bludiště a může kutálet a vést kouli bludištěm. Cílem hry je přirozeně najít správnou cestu skrze bludiště a dokutálet kouli bludištěm od jednoho konce k druhému. Ovládání hry je velice intuitivní. Primárně jsou veškeré úkony prováděny pomocí hap tického kurzoru, protože zařízení Reachin Display může být od počítače vzdáleno. Uživatel tlakem kurzoru kutálí koulí, dotýká se scény a tlačítek rozmístěných okolo. Tlačítka pracují jedoduše - reagují na dotek o jakékoli silové intenzitě, akce je vyvolána teprve poté, co dotek skončí. Uživatel má možnost vybrat si ze tří bludiší o různé velikosti, může vrátit kouli do původní pozice tlačítkem Nová hra, nebo hru ukončit volbou Konec. Alternativně lze pro gram ukončit také stisknutím klávesy ESC na klávesnici. Na obrázku 5.1 lze vidět kompletní obrazovku hry se všemi ovládacími prvky. Po úspěšném nalezení cesty bludištěm se uživateli zobrazí hlášení o výhře. Všechna tlačítka zůstávají aktivní, takže může buď pokračovat ve hře s jiným bludištěm, nebo hru ukončit.
20
5. M O T I V A Č N Í H R A B L U D I Š T Ě
Obrázek 5.1: Ovládání hry 5.3
Možnosti rozšíření, nápady
Již samotný nápad bludiště v sobě skrývá mnoho možností, pro které se v této bakalářské práci nenachází dostatek prostoru. V rozšiřující verzi by bylo velice snadné implementovat nepřeberné množství drobných vylepšení, například pasti, tajné chodby, záklopky atd. Nebo v případě jiného pojetí hry by se hrací deska mohla otáčet či naklápět s tím, že koule by byla vystavena působení gravitace a unikala by hráči ve směru naklopení bludiště. Náhodný generátor bludišť, který by zároveň ověřoval, zdali cesta z jednoho konce bludiště na druhý je realizovatelná, by byl rovněž užitečný.
21
Kapitola 6
Implementace 6.1
Kontakt kurzoru s bludištěm a koulí
Balík knihoven OpenHaptics v sobě nemá zabudován kolizní systém, je schopen detekovat pokuze kolizi bodu (kurzoru) a tělesa. Haptický kurzor tvaru koule by tedy procházel tělesy a dotýkal se jich až svým středem. To je samozřejmě možné řešit počítáním kolizí a přímým renderováním síly. Vzhledem k jednoduchosti hry však byl použit trik, kdy se uživatel dotýká něčeho jiného, než vidí - všechny vykreslené objekty jsou haptický zobrazeny větší o poloměr koule kurzoru. Uživatel tak nabývá iluze, že se těles dotýká opravdu povrchem koule kurzoru. 6.2
Bludiště
Herní deska s bludištěm má vždy čtvercový tvar, je vytvořena ze základních segmentů v podobě krychlí. Struktura bludiště se načítá z textového souboru s velmi jednoduchým formátem. Na prvním řádku souboru se nachází číslo, které určuje rozměr bludiště/počet segmentů jedné strany. Na dalších řádcích pak následuje pole struktury bludiště sestavené z číslic 0, 1, 2, 3. Číslice 0 značí prázdný segment, 1 značí plný segment (stěnu), 2 udává výchozí pozici koule a 3 značí cílovou pozici koule. Pokud má tedy bludiště stranu o šířce 5 segmentů, bude se v souboru nacházet 5 řádků o 5-ti číslicích oddělených mezerami: 5
1 3 1 2 1
1 1 1 1 0 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1
Program nekontroluje správnost bludiště, tj. zdali je definován pouze jeden počáteční a cílový bod a jestli mezi nimi existuje cesta. Bludiště vykreslené v programu má vždy stejnou celkovou velikost, rozměr segmentů i koule je odvozen z pevného rozměru herní plochy a počtu segmentů. Bludiště je haptický i graficky vykreslováno pomocí předkompilovaněho displaylistu, pouze koeficient velikosti segmentů (krychlí) se liší. Jak lze vidět na obrázku 6.1, stěny bludiště jsou pro přehlednost obarveny tmavě modře, základna má světle modrou barvu, výchozí pozice koule je označena růžové a cílová zeleně. Samotná koule je obarvena červeně. 22
6. IMPLEMENTACE
Obrázek 6.1: Bludiště 6.3
Fyzikální model
Reprezentaci fyzikálních modelů v sobě skrývá hlavičkový soubor phy s i c s . h. Vektor nebo bod v trojrozměrném prostoru a operace s ním symbolizuje třída Vector3D, hmotný bod třída M a s s O b j e c t . Hmotný bod má v daném okamžiku svou pozici, hmotnost a rychlost a působí na něj v určitém směru síla o dané velikosti. Máme-li tedy například hmotný bod M a s s O b j e c t k o u l e a tlačíme-li na něj haptickým kurzorem, působíme na něj v daném okamžiku silou. Silové působení se na objekt aplikuje metodou a p p l y F o r c e ( ) , které po mocí parametru zadáme sílu v podobě vektoru typu Vector3D. Setrvačnost je implemen tována jako úbytek rychlosti v závislosti na čase. Jednoduchý kolizní systém nejdříve zjistí souřadnice segmentu, ve kterém se koule na hrací desce nachází. Pak testuje jeho 8-okolí, zdali koule nekoliduje se stěnami segmentů bludiště v některém z kolmých směrů, s hranami segmentů v některém z diagonálních směrů nebo zda se nenachází mimo hrací desku. V kladném případě vyvolá reakci - odraz s mírným útlumem rychlosti. K počáteční inicializaci fyzikálního modelu ve hře a průběžným výpočtům slouží funkce I n i t P h y c i c s () a C o m p u t e P h y s i c s ( ) .
23
Kapitola 7
Závěr Předně musím říci, že práce s haptickým zařízením pro mne byla naprostou novinkou. V předešlé době jsem se s podobným zařízením nesetkal a ani jsem netušil možnosti, které haptické simulace skýtají. Poznal jsem mnohé zákonitosti a pochopil obtížné pasáže prob lematiky virtuální reality vizuální i haptické. Prohloubil jsem své znalosti z oblasi vývoje grafických aplikací v OpenGL a GLUT. Výsledkem práce je komplexní aplikace/hra kom binující vizuální a haptickou virtuální realitu s fyzikálním modelem a kolizním systémem. Aplikace je snadno rozšiřitelná a většina kódu je znovupoužitelná. Za nejnáročnější úkol považuji průzkum knihoven OpenHaptics a následné uvedení do provozu aplikace se stereoprojekcí tak, aby byla kompatibilní se zařízením ReachinDisplay, sladění správného odrazu v zrcadle tak, aby poloha držadla haptického zařízení byla totožná s polohou zobrazovaného kurzoru. V průběhu práce jsem narazil na řadu problémů, z nichž většinu jsem úspěšně vyřešil, stále však některé zůstávají otevřené. Asi nejzávažnější z nich se týká kontaktu kurzoru s dy namickými tělesy. Přes všechna opatření dochází k tomu, že haptický kurzor neočekávaně pronikne dovnitř haptického objektu, zvláště v případě, kdy se uživatel dotýká dvou a více těles zároveň. Jelikož se toto stává i v originálních ukázkových aplikacích, přisuzuji tento nedostatek neschopnosti počítače zajistit požadovanou obnovovací frekvenci pro haptický rendering. Práce pro mne znamenala velký přínos ve formě informací i zkušeností, překonávání nesnází mě motivovalo k dalšímu úsilí. Doufám, že tato práce dobře poslouží jako odrazový můstek pro ty, kteří chtějí začít programovat aplikace se silovou zpětnou vazbou za použití balíku knihoven OpenHaptics.
24
Literatura [1] Reachin Technologies: www. r e a c h i n . s e [2] SensAble Technologies: www. s e n s a b l e . com [3] Sensable Developer Support Center: h t t p : / / d s c . s e n s a b l e . com [4] Lev Povalahev, knihovna L3DS h t t p : //www. l e v p . d e / 3 d / [5] OpenGL API Documentation h t t p : //www. o p e n g l . o r g / d o c u m e n t a t i o n /
25
Dodatek A
Obsah přiloženého CD Součástí této práce je také disk CD. Obsahuje •
zdrojový kód bakalářské práce ve formátu pro fflj+X a samotnou práci jako dokument pdf,
•
zdrojové kódy motivační hry Bludiště včetně knihovny L3DS,
•
balík knihoven OpenHaptics potřebných pro kompilaci výsledného grafického rozhraní včetně ovladačů zařízení a uživatelských příruček,
•
zkompilovanou verzi hry Bludiště pro operační systém Windows.
26