Mendelova zemědělská a lesnická univerzita v Brně Provozně ekonomická fakulta
Fraktální geometrie ve virtuální realitě Bakalářská práce
Vedoucí práce: Ing. David Procházka, Ph.D.
Martin Ventruba
Brno 2009
Tady je zadání práce
Rád bych poděkoval vedoucímu mé bakalářské práce Ing. Davidovi Procházkovi, Ph.D. za cenné rady a za podporu, kterou mi při tvorbě této práce poskytl.
Prohlašuji, že jsem tuto bakalářskou práci vypracoval samostatně, a že v ní uvádím veškerou použitou literaturu a jiné zdroje, ze kterých jsem čerpal.
Brno 14. 05. 2009
....................................................
5
Abstract Ventruba, M. The fractal geometry in virtual reality. Bachelor thesis. Brno, 2009. This thesis is focused on design and implementation of application, which ought to enable visualization of multi-dimensional fractal images in environment of virtual reality laboratory. It describes settings of stereographic projection and initialization of trackdAPI programmer interface. It also contains C++ source code samples using OpenGL graphical libraries. Keywords Fractal geometry, virtual reality, tracking device, OpenGL, C++
Abstrakt Ventruba, M. Fraktální geometrie ve virtuální realitě. Bakalářské práce. Brno, 2009. Práce se zabývá návrhem a implementací aplikace, která by umožnila vizualizaci vícerozměrných fraktálních obrazců v prostředí Laboratoře virtuální reality. Popisuje nastavení stereografické projekce a inicializaci programátorského rozhranní trackdAPI. Rovněž obsahuje ukázky kódu napsaného v programovacím jazyce C++ s využitím grafických knihoven OpenGL. Klíčová slova Fraktální geometrie, virtuální realita, snímací zařízení, OpenGL, C++
6
OBSAH
Obsah 1 Úvod a cíl práce 1.1 Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Cíl práce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Technologické řešení virtuální reality 2.1 Prostorové vidění . . . . . . . . . . . 2.2 Stereoskopie . . . . . . . . . . . . . . 2.3 Metody stereografické projekce . . . . 2.4 Snímání pohybu . . . . . . . . . . . . 2.5 Laboratoř virtuální reality . . . . . . 2.6 Virtuální realita v praxi . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
3 Grafická knihovna OpenGL 3.1 Double buffering . . . . . . . . . . . . . . . . . . . . 3.1.1 Implementance Double bufferingu v OpenGL . 3.2 Quad buffering . . . . . . . . . . . . . . . . . . . . . 3.2.1 Implementance Quad bufferingu v OpenGL . 3.3 Nastavení kamery . . . . . . . . . . . . . . . . . . . . 3.3.1 Nastavení kamer pro stereoskopickou projekci 4 Fraktální geometrie 4.1 Dělení fraktálních objektů do kategorií . . . . . . . 4.1.1 Dynamické systémy s fraktální strukturou . 4.1.2 L-systémy . . . . . . . . . . . . . . . . . . . 4.1.3 Systémy iterovaných funkcí IFS . . . . . . . 4.1.4 Stochastické fraktály (nepravidelné fraktály) 4.2 Charakteristika a implementace fraktálů . . . . . . 4.2.1 Mengerova houba . . . . . . . . . . . . . . . 4.2.2 Lorenzův atraktor . . . . . . . . . . . . . . . 4.2.3 Barnsleyho kapradina . . . . . . . . . . . . . 4.2.4 Kochova vločka . . . . . . . . . . . . . . . . 4.2.5 Sierpinského trojúhelník . . . . . . . . . . .
. . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . . . . . . .
7 7 8
. . . . . .
9 . 9 . 9 . 9 . 11 . 12 . 13
. . . . . .
. . . . . .
14 14 14 15 15 15 16
. . . . . . . . . . .
18 18 18 19 19 19 19 20 20 21 22 22
. . . . . . . . . . .
5 Metodika
24
6 Implementace 6.1 Návrh tříd . . . . . . . . . . . . . . . . . 6.2 Nastavení kamer v modelové aplikaci . . 6.3 Trackery . . . . . . . . . . . . . . . . . . 6.4 Připojení knihovny trackdAPI MT . . . 6.5 Inicializace trackeru . . . . . . . . . . . . 6.6 Nastavení ovládání Wandy (controlleru)
25 25 25 27 27 28 29
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
OBSAH
7
6.7 6.8
GlutTimerFunc() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Texturování . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7 Závěr
34
8 Literatura
35
Přílohy
36
A Diagram tříd
37
B Ukázky fraktálních obrazců z modelové aplikace
39
C Fotografie z laboratoře virtuální reality
42
1
ÚVOD A CÍL PRÁCE
1 1.1
8
Úvod a cíl práce Úvod
Fraktální geometrie je samostatnou vědní disciplínou, jejíž historie se datuje zhruba od šedesátých let dvacátého století. U jejího zrodu stál původem polský vědec a matematik Benoit B. Mandelbrot, který jako první matematicky definoval pojem fraktál. Termín fraktál je odvozen z latinského fractus, příčestí minulého slovesa frangere, což v překladu znamená rozlámat, vytvořit nepravidelné zlomky. V přírodě se můžeme setkat s fraktálními motivy takřka na každém kroku, tudíž není žádným překvapením, že se vědci a umělci pokoušeli o definici fraktálu i před Mandelbrotem. Nikdo z nich však fraktál matematicky obecně nedefinoval, a tak je prvenství po právu připisováno tomuto varšavskému rodákovi. Fraktál lze definovat jako geometrický útvar, který můžeme rozdělit na části, přičemž tyto části jsou alespoň přibližně zmenšenými kopiemi celého útvaru. Fraktál je soběpodobný a nezávislý na měřítku. B. Mandelbrot uvedl ve své definici, že fraktál je množinou, jejíž Hausdorffova dimenze je větší než dimenze topologická. Topologická dimenze udává počet parametrů, nutných pro popis polohy bodu v tělese. Hausdorffova dimenze, zvaná též fraktální dimenze, udává úroveň členitosti objektu. Je-li Hausdorffova dimenze ostře větší než dimenze topologická, bude objekt velmi členitý. A naopak, liší-li se Hausdorffova a topologická dimenze velmi málo, pak bude objekt málo členitý. Je nutné poznamenat, že zdaleka ne všichni matematikové se ztotožňují s touto definicí. Ve skutečnosti zatím neexistuje žádná všeobecně platná definice fraktálu. Fraktální geometrie se uplatňuje v širokém spektru rozličných oblastí. Používá se k modelaci chemických a fyzikálních procesů. Poslední dobou se využívá v biologii a medicíně. Například při zkoumání vlastností krve se měří Hausdorffova dimenze jejich částeček. Dokonce někteří odborníci zkoumají, zda neexistuje souvislost mezi Hausdorffovou dimenzí povrchu mozku a inteligencí člověka. Fraktály rovněž zasahují do umění, kde slouží nejen k vytváření krásných grafik, ale také k tvorbě vzorů na módní materiály či v architektuře. Pravděpodobně největší uplatnění má však fraktální geometrie v počítačové grafice. Fraktály se zde využívají ke generování přírodních útvarů jako jsou stromy, oblaka, říční toky, pohoří či blesky. V této oblasti patrně neexistuje věrohodnější způsob. Dále se fraktály používají při generování textur. Jejich obrovskou výhodou je jejich malá paměťová náročnost, řádově několik desítek bytů. Také je možno texturu zobrazit v různých velikostech, bez sebemenšího náznaku zkreslení. Tato paměťová nenáročnost je využita při fraktálové kompresi obrazů. Fraktály lze nalézt v predikci – Elliotovy vlny, zkoumá se i možné využití fraktální geometrie v šifrování (Fraktály v počítačové grafice IV, 2005). Je patrné, že spíše než vyjmenovat oblasti, kde se můžeme s fraktály setkat, je jednodušší uvést případy, kde fraktály nejsou.
1.2
1.2
Cíl práce
9
Cíl práce
Cílem této práce je vytvořit modelovou aplikaci, která by vykreslovala fraktální obrazce v prostředí laboratoře virtuální reality. Aby uživatel vnímal fraktály prostorově, bude nutné použít stereoskopickou projekci. Pro interakci s prostředím budou použity polohové trackery. Pomocí ovládacího zařízení a následným zpracováním pozičních údajů z těchto polohových senzorů, bude možné s objekty pracovat. To přispěje ke zvýšení věrohodnosti virtuálního prostředí. Text práce by měl sloužit jako průvodce pro začínající programátory, kteří by chtěli vytvořit aplikaci obdobného charakteru. Z toho důvodu bude psán srozumitelným jazykem, bude zde objasněna použitá terminologie a popsány stěžejní části kódu, včetně ukázek zdrojového kódu.
2
TECHNOLOGICKÉ ŘEŠENÍ VIRTUÁLNÍ REALITY
2 2.1
10
Technologické řešení virtuální reality Prostorové vidění
Lidský zrak zprostředkovává trojrozměrné vnímaní prostoru. Princip vnímání hloubky je založen především na skutečnosti, že máme dvě oči, přibližně 6,5 cm od sebe vzdálené, každé oko tak vidí danou skutečnost z jiného úhlu. V důsledku sloučení a vyhodnocení těchto dvou odlišných perspektivních zobrazení scény vzniká v mozku prostorový vjem. Stereoskopického vidění není schopen jen člověk, ale i mnoho zvířat, která mají obě oči umístěny na přední části hlavy.
2.2
Stereoskopie
Termín stereoskopie vznikl složením řeckých slov stereos (pevné, trojrozměrné) a skopien (vidět) (Stereoskopická projekce, 2006). Stereoskopie je tedy technologie, která umožňuje navodit prostorový dojem z obyčejných dvourozměrných obrazů. Na první pohled se stereoskopie může jevit jako složitá záležitost, přesto je založena na základních principech, viz kapitola 3.1 – Prostorové vidění. Obelstít lidské oko a mozek není nijak složitý úkol a díky tomu vzniklo hned několik technik, pomocí kterých můžeme vnímat hloubku obrazu na dvourozměrné ploše. Jednotlivé metody se liší jen málo a pracují na stejném principu. Na každou sítnici dopadá jiný obraz a prostorový dojem vytváří následně až mozek. Oba obrazy jsou snímány pomocí dvou kamer, jejichž vzdálenost se přibližně rovná rozptylu očí. Zásadní rozdíl mezi stereoskopickými technikami je v odpovědi na otázku: „Jak promítnout každému oku jiný obraz?ÿ Řešení této problematiky je uvedeno v následující kapitole 3.3 – Metody stereografické projekce.
2.3
Metody stereografické projekce
Anaglyf je patrně nejjednodušší a nejrozšířenější stereoskopickou metodou. Základem jsou brýle nejčastěji s jednou červenou a jednou modrou nebo zelenou očnicí. Sledovaná scéna je tvořena oběma obrazy, které jsou však složeny jen ze základní dvojice barev. Do každého oka se díky brýlím dostává separátní obraz, které mozek složí dohromady a rozdíly v obrazech vedou k pocitu hloubky. Bohužel dochází ke ztrátě barevné informace. Na druhou stranu se brýle dají snadno a levně pořídit. Obraz může být jen tištěn, promítán na počítači či přehráván v televizi. Ve virtuální realitě je stereoskopický displej často zabudován do helmy či speciálních brýlí. Tato zobrazovací zařízení, připojená na helmě či nošená na hlavě, se souhrnně označují jako head-mounted displays (HMD). Rozlišujeme monokulární HMD s jedním optickým displejem nebo binokulární HMD se dvěma displeji. U prvních HMD byly použity malé CRT obrazovky. V současnosti jsou nejrozšířenější zobrazovací jednotkou miniaturizované barevné LCD displeje, se speciální optikou před obrazovkou, pro široký zorný úhel, a systémem pro určení přesné polohy hlavy.
2.3
Metody stereografické projekce
11
HMD se liší v tom, zda jsou schopné zobrazit pouze počítačem generovaný obraz (CGI), nebo zda kombinují reálný svět s virtuálním. Při pasivní projekci jsou požívány dva projektory, kdy každý z nich promítá obraz určený pro jedno oko. Pasivní projekce užívá polarizace světla. Světlo z projektorů prochází polarizačními filtry, přičemž obraz pro každé oko je polarizován rozdílně. Oko pozorovatele pak prostřednictvím pasivních polarizačních brýlí vidí jen ten obraz, který je určen pro příslušné oko. Pro pasivní stereoskopickou projekci je zapotřebí speciálního plátna, které nesmí měnit polarizaci světla. Světlo se polarizuje dvěma základními způsoby – lineárně a kruhově. Nakloníme-li při lineární polarizaci hlavu byť jen o pár stupňů, dojde ke snížení kvality zobrazení, protože brýle propustí i obraz určený pouze druhému oku. Tento nedostatek odstraňuje kruhová polarizace, používané filtry jsou však méně efektivní. Relativně novou a zajímavou technologii pasivní stereoskopické projekce představuje technologie INFITEC založená na principu vlnového rozkladu obrazu. INFITEC má řadu vlastností, kterých není možné jinou technologií dosáhnout, například vynikající separace obrazu pro levé a pravé oko (míněno ve srovnání s ostatními pasivními stereoskopickými projekcemi), lze užívat běžných projekčních ploch a to za použití jednoduchých pasivních brýlí.
Obr. 1: Pasivní stereoskopická projekce. Zdroj: local.wasp.uwa.edu.au/ pbourke/miscellaneous/stereographics/
Při aktivní 3D projekci je obraz generován jen jedním projektorem, který střídavě promítá obraz určený pro levé oko a následně pro pravé. Obrazy se střídají s velkou frekvencí, která by měla dosahovat hodnoty 120 Hz. Takže pozorovatel vnímá výsledný obraz jako souvislou scénu. Pozorovatel musí být vybaven aktivními brýlemi, které jsou synchronizovány se zobrazovacím zařízením a střídavě propouš-
2.4
Snímání pohybu
12
tějí k příslušnému oku odpovídající obraz ve stejné frekvenci. Metoda velmi dobře funguje i s obyčejnými CRT monitory. Jedinou stereoskopickou metodu, která nevyžaduje použití speciálních brýlí, představují autostereoskopické displeje. Zobrazovacím zařízením je LCD. Na jeho povrchu je umístěna speciální folie, která má tu vlastnost, že láme směr obrazu. Liché sloupce pixelů jsou lámány jedním směrem, sudé pak druhým. Jedno oko tak získá liché sloupce obrazu, druhé sudé. Každé uvidí jiný obraz a mozek se už postará o dojem prostorového vidění. Pasivní displeje nereagují na polohu pozorovatele. Tento nedostatek částečně odstraňují aktivní displeje, které umí sledovat oči pozorovatele a upravit vlastnosti fólie, které reagují na změnu stanoviště uživatele (Stereoskopie – jak funguje 3D kino, 2009). Pro část zmíněných technik lze využít také zpětnou projekci, kdy projektory jsou na opačné straně než pozorovatel, výhodou pak může být vyšší jas. Ve vlastní aplikaci je užita pasivní stereoskopická projekce.
2.4
Snímání pohybu
Aby virtuální prostředí působilo na lidské smysly autenticky, musí být možnost se v něm pohybovat a vykonané pohyby musí mít reálnou souvislost s vnímáním okolí. Existuje 6 možných pohybů (translace podél tří os, rotace kolem tří os), nazývaných 6 stupňů volnosti. Ke snímání těchto stupňů volnosti se v současnosti užívají polohové senzory, tzv. trackery. Trackovací zařízení se liší zejména cenou, přesností, latencí a schopností reagovat na rušivé podněty. Ivan Sutherland, kterému je připisováno autorství přilbového displeje, navrhl a odzkoušel dvě metody mechanického snímání. První z nich, nazývaná Damoklův meč, je mechanickou konstrukcí na jednom konci připevněnou ke stropu a na druhém k přilbě. Údaje o pohybu uvnitř konstrukce jsou předány počítači a následně zakomponovány do prostředí. Druhé zařízení pracuje na totožném principu. Používá se u virtuálních systémů připevněných na rameni u stolu a uživatel do nich pouze nahlíží. Tím se šetří čas potřebný k nasazování a sundávání helmy. Mechanické snímání pohybu se typicky využívá v exoskeletonech ke sledování úhlů mezi klouby na těle, jejich nedostatkem však omezení pohybu uživatele (HARDWARE PRO VIRTUÁLNÍ REALITU – SNÍMÁNÍ POLOHY, 2007). U ultrazvukového snímání je na vrcholu displeje situován malý generátor ultrazvukových impulsů, které jsou zachycovány čtveřicí mikrofonů na stropě. Do každého vlny přichází s různou prodlevou. Porovnáním signálů lze vypočítat polohu a natočení přilby. Tento systém poskytuje uživateli velkou volnost, není však moc přesný a mezi vysílačem a mikrofony se nesmí vyskytovat žádné překážky (HARDWARE PRO VIRTUÁLNÍ REALITU – SNÍMÁNÍ POLOHY, 2007). Oba výše zmíněné systémy nelze použít ve stísněném či hlučném prostředí. Pro takové prostředí byly vyvinuty magnetické trackery, které patří k nejrozšířenějším polohovacím zařízením. Elektrický proud protékající cívkou vytváří magnetické pole ve směru cívky. V cívce nacházející se v magnetickém poli se indukuje proud,
2.5
Laboratoř virtuální reality
13
jehož velikost je závislá na intenzitě pole a na poloze os magnetického pole a cívky. Umístíme-li tři cívky, tak aby jejich osy byly vzájemně kolmé a jiné 3 cívky se budou pohybovat v jejich poli, bude se v těchto cívkách indukovat náboj, který závisí na poloze a natočení cívek. Z těchto údajů se dá přesně zjistit poloha obou soustav cívek a tím i vzájemná poloha uživatele a snímače. Nedostatkem je nepřesnost a setrvačnost (HARDWARE PRO VIRTUÁLNÍ REALITU – SNÍMÁNÍ POLOHY, 2007). Optické systémy používají odrazové značky osvětlené impulzy z kamery a triangulací jejich relativních poloh a vzdáleností vypočítávají polohu v prostoru. Rozlišujeme aktivní a pasivní značky. Pasivními značkami jsou malé balonky (řádově se pohybující od několika milimetrů až po centimetry) potažené odrazovou páskou z fólie poseté mikroskopickými skleněnými kuličkami. Aktivní značkou je pak obyčejná LED dioda (Motion capture – řešení pro zrychlení animace, 2006). Optické trackery byly původně řešeny, tak že na přilbě byla upevněna LED dioda a její pohyb byl snímán kamerami. U pozdějších systémů se užívá opačného postupu, na stěnách a stropě byly umístěny panely LED diod a k helmě byly připojeny 4 kamery. Nevýhodou je váha přilby a omezené použití na upravenou místnost. To je vykoupeno vysokou citlivostí, zaznamenává pohyb hlavy již při výchylce 2 cm a při otočení o 0,2 ◦ . Další výhodou je vysoká rychlost obnovení údajů, až 100krát za sekundu. Trackery založené na analýze obrazu jsou uživateli nejpřívětivější, nemusí nosit na hlavě žádné vysílače ani přijímače. Kamera, případně soustava kamer, sleduje pohyb člověka a výsledný záznam se analyzuje a vypočítává. Obdobný systém se používá ve sportu, např. při analýze skoků či hodů. Tato metoda je extrémně náročná na výpočet polohy (HARDWARE PRO VIRTUÁLNÍ REALITU – SNÍMÁNÍ POLOHY, 2007).
2.5
Laboratoř virtuální reality
Snímání pohybu je poměrně komplikovanou záležitostí. Je k němu zapotřebí specializovaného hardwarového vybavení a ve většině případů i vhodný řídící software. V současnosti se běžně dodávají řešení na principu vizuálního nebo elektromagnetického snímání pohybu. Univerzitní laboratoř je vybavena trackery Flock of Birds firmy Ascension Technology, založených na elektromagnetickém principu, doplněnými o navigační zařízení Wanda. Wanda, kromě joysticku a tří programovatelných tlačítek, obsahuje jak snímač pohybu, tak čidlo pro zaznamenávání náklonu. Druhý snímač pohybu je připojen k pasivním stereoskopickým brýlím. Každý snímač je napojen na samostatnou řídící jednotku. Data z těchto jednotek se přenáší prostřednictvím sériového portu do stanice s kontrolním softwarem TrackD. Tyto poziční údaje pak lze integrovat do libovolné aplikace prostřednictvím uživatelského rozhraní trackdAPI (Laboratoř virtuální reality, 2009). Řešení stereografické projekce je ve srovnání se snímáním pohybu triviální. K pasivní 3D projekci nám stačí de facto grafická karta podporující quad buffe-
2.6
Virtuální realita v praxi
14
ring a dva projektory s filtry. Projekce je v našem případě řešena dvěma stanicemi DELL OptiPlex 755 DT, které jsou rozšířeny o grafickou kartu nVidia Quadro FX 570. K hlavní stanici jsou připojeny dva projektory SXGA+ Projection Design doplněné o filtry Infitec. Promítáno je pomocí zpětné projekce. V našem případě není možné promítat ze zadní části přímo na plátno, proto bylo použito zrcadlo, které značně zkracuje vzdálenost nezbytnou k nasvícení celého plátna (Laboratoř virtuální reality, 2009).
2.6
Virtuální realita v praxi
Virtuální realitu je možné považovat za poměrně nové uživatelské rozhraní, jehož cílem je co nejvěrohodnějším způsobem přiblížit počítačové prostředí skutečnému, tak jak jej vnímají naše smysly. Uživatel by měl být do tohoto prostředí vtažen, čehož se v současných aplikacích virtuální reality dosahuje kombinovanou stimulací zraku, sluchu a hmatu. Experimentuje se s čichem a chutí. Většina z nás se s virtuální realitou setkala pravděpodobně jen v 3D kině či v jiné oblasti zábavního průmyslu. Ovšem oblastí nasazení systémů virtuální reality je nepřeberné množství. Virtuální realita nachází své uplatnění v oblasti výuky a vzdělávání, kde je možné studentům demonstrovat látku, co nejvěrohodnějším způsobem, což přispívá ke zvýšení efektivity učiva a nabyté informace jsou mnohem trvanlivějšího rázu. Díky virtuální realitě dobře zvládáme krizové situace. Piloti aerolinií pravidelně nacvičují s využitím VR nouzová přistání s různě poškozenými stroji. Rovněž žáci autoškoly nacvičují parkování či jízdu s pomocí těchto systémů. Velké uplatnění má i v běžné lékařské praxi. Lékařům pomáhá s osvojením chirurgických technik a s přípravou komplikovaných zákroků. To vše přispívá ke zvýšení zručnosti a odstranění stresového faktoru. Zařízení virtuální reality umožňují sdílení chirurgických zkušeností mimo operační sál. Virtuální realita se prosazuje i v architektuře, v automobilovém a leteckém průmyslu, v armádě při simulaci bojových podmínek či při napodobování kosmických letů. Je zřejmé, že tento prostředek napodobování reálného světa má velký potenciál, který naplno ukáže až budoucnost. Na závěr je nutné podotknout, že skutečný svět je mnohem zajímavější a důležitější, tak bychom se měli starat především o něj. Jinak krásy okolního světa budeme hledat už jen v prostředí virtuální reality.
3
GRAFICKÁ KNIHOVNA OPENGL
3
15
Grafická knihovna OpenGL
Knihovna OpenGL (OpenGraphics Library) patří v současnosti k nejpoužívanějším, nejvíce podporovaným a nejlépe zdokumentovaným standardům pro tvorbu 2D a zejména 3D grafických aplikací. OpenGL je nezávislá na typu grafického akcelerátoru a dokonce ji lze použít i v případě absence grafického akcelerátoru na platformě. Knihovna nespecifikuje, jaký operační systém, grafický ovladač nebo správce oken je nutno použít. Programová knihovna OpenGL je použitelná ve většině známých programovacích jazyků. Z programátorského hlediska se můžeme na OpenGL dívat jako na stavový automat. To znamená, že pokud zadáme nějakou vlastnost zůstane tato vlastnost nastavena až do té doby, než ji změníme. Při vykreslování pomocí OpenGL příkazů se barevné informace jednotlivých pixelů ukládají do tzv. framebufferu. Na druhou stranu má OpenGL i několik nepříjemných omezení. Postrádá příkazy pro práci s komplexními objekty, veškeré složité objekty se musí sestrojit z jednoduchých primitiv jako jsou body, úsečky, trojúhelníky či polygony. K OpenGL existuje řada rozšiřujících knihoven, které její funkcionalitu ještě zvyšují. Jednou z takových knihoven je programová knihovna GLUT.
3.1
Double buffering
Frame buffer je obrazová paměť, do které se ukládá obraz a ten je potom odeslán na obrazovku. Double buffering je způsob použití frame buffer. Tato metoda spočívá na principu, že aplikace dostane k dispozici dva barevné buffery, z nichž do jednoho se provádí vykreslování (tzv. zadní buffer – back buffer) a druhý je zobrazen na obrazovce (tzv. přední buffer – front buffer). Poté co procesor dokončí vykreslování snímku do prvního bufferu dojde k prohození role obou bufferů, tj. první bude zobrazen a do druhého se bude provádět vykreslování. Tento způsob zaručuje, že vykreslování je plynulé, bez nepříjemného problikávání. Double buffering však vyžaduje dvakrát více paměti než Single buffering, ale pořád ještě o třetinu méně než Triple buffering. 3.1.1
Implementance Double bufferingu v OpenGL
Double buffering je široce užívaná technika aktualizace dynamické scény, která zamezuje blikání obrazu. Rozumné řešení double bufferingu nabízejí jen grafické knihovny OpenGL a DirectX. V OpenGL se nejdříve musí povolit použití obou bufferů. Toho docílíme zavoláním funkce glutInitDisplayMode() z nadstavbové knihovny GLUT. Pro vytvoření dvou barvových bufferů musíme tuto funkci zavolat s parametry GLUT_RGB | GLUT_DOUBLE. Jedná se o bitové příznaky zřetězené pomocí logického operátoru or. Po vykreslení snímku je třeba provést prohození úloh obou barvových bufferů. K tomu využijeme opět funkci knihovny GLUT – glutSwapBuffers().
3.2
Quad buffering
3.2
16
Quad buffering
Z názvu samotného již poměrně jasně vyplývá, že se zde bude pracovat se čtyřmi buffery. Quad buffering je schopnost vykreslovat do levého a pravého předního bufferu a zadních bufferů nezávisle na sobě. Přední levý a přední pravý buffer zobrazující stereoskopické obrazy mohou být prohozeny v synchronizaci s brýlemi, zatímco levý a pravý zadní buffer je aktualizován – toto nám dává hladký stereoskopický obraz. 3.2.1
Implementance Quad bufferingu v OpenGL
Realizace quad bufferingu je obdobná jako u double bufferingu ovšem s tím rozdílem, že všechny barevné buffery jsou zdvojeny. Toho dosáhneme zavoláním příkazu glutInitDisplayMode() s parametrem GLUT_STEREO | GLUT_RGB | GLUT_DOUBLE, kde příznakem GLUT_STEREO zapneme stereo výstup. Vykreslujeme-li trojrozměrné obrazce, musíme ještě zakomponovat příznak GLUT_DEPTH. Pokud se kromě generování stereo obrázků používá i double buffering, což je případ modelové aplikace, máme k dispozici současně čtyři buffery označované jako GLUT_FRONT_LEFT, GLUT_FRONT_RIGHT, GLUT_BACK_LEFT a GLUT_BACK_RIGHT. Buffer, do kterého se má právě vykreslovat lze zadat příkazem glDrawBuffer() s parametrem GLUT_BACK_RIGHT pro pravé oko a GLUT_BACK_LEFT pro oko levé. Použitím Funkce glClear() s parametrem GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT vymažeme neaktuální barvový buffer s pamětí hloubky. Po zobrazení scény je zadní buffer pro obě oči překlopen pomocí funkce glutSwapBuffers() do předních bufferů. Ukázka práce s buffery je obsažena v kapitole 3.3.1 Nastavení kamer pro stereoskopickou projekci. Při inicializaci bufferů je rozumné umožnit použití pouze těch bufferů, které aplikace doopravdy vyžaduje. Použitím nadbytečných bufferů je pouze zabíráno místo v paměti počítače či grafické karty, což může zapříčinit zpomalení vykreslování.
3.3
Nastavení kamery
Při znázornění prostorové scény je třeba vyřešit dva elementární problémy. Prvním je zadání zrakových a geometrických údajů o scéně a druhou záležitostí je pak nastavení kamery. Nastavení kamery pozorující danou scénu, lze řešit několika způsoby. Jednou z možností je nastavení transformačních matic. Transformace jsou v OpenGL řešeny pomocí matic. V počítačové grafice představují transformační matice nástroj pro vyjádření lineárních transformací. Mezi lineární transformace patří posun, rotace, zkosení a změna měřítka. Transformační matice nám tedy umožňují konfigurovat scénu dle požadavků uživatele. Před zobrazením se v OpenGL na každý vrchol, vertex, popřípadě i normály vrcholů aplikují tři transformační matice. První maticí je ModelView matrix. Tato matice se používá jak pro nastavení pozice kamery, tak ke změně měřítka a otočení objektů vzhledem k pozorovateli. Druhou
3.3
Nastavení kamery
17
transformační maticí je Projection matrix, kterou se ovládá perspektivní projekce kamery. Poslední matice se jmenuje Viewport matrix, která mapuje objekty z abstraktních souřadnic do souřadnic okna. OpenGL neumožňuje plnohodnotné využití této transformace. Kromě výše zmíněných matic umožňuje OpenGL transformovat matici, která se používá při mapování textur na povrch objektů. Mluvíme o Texture matrix (Grafická knihovna OpenGL(5): transformační matice a lineární transformace, 2003). Popsané možnosti nastavení kamery nejsou moc uživatelsky přívětivé a ani přirozené. Tudíž se využívají další knihovní funkce pro manipulaci s kamerou. Ve skutečnosti tyto funkce nastavují transformační matice nepřímou cestou, takže celkový výsledek je totožný. K základním funkcím patří glOrtho() pro seřízení ortogonální kamery a glFrustrum() nastavující perspektivní pohled na scénu. Připojením rozšiřující grafické knihovny GLU získáme další funkce operující s kamerou. Práce s nimi je velmi jednoduchá a intuitivní. Jedná se o funkce gluLookAt(), gluOrtho2D() a gluPerspective() (Grafická knihovna OpenGL(13): Double buffering, 2003). 3.3.1
Nastavení kamer pro stereoskopickou projekci
Existují dvě varianty rozmístění a nastavení kamer pro snímání dvojice obrazů (pro stereo zobrazování). První z nich využívá řada aplikací. Jedná se o metodu toein, při které kamery pro dvě rozdílné pozice očí směřují do úplně stejného bodu. Tato varianta je sice matematicky jednodušší na implementaci a poskytuje vcelku přijatelný stereoskopický obraz, avšak tento obraz není přesný.
Obr. 2: Toe-in metoda (nevhodná pro stereoskopickou projekci) Zdroj: http://projects.ubic.fr/monkey3d/engine.php
3.3
Nastavení kamery
18
Správnou cestou pro vyobrazení prostorové scény je metoda off-axis, kde komolé jehlany kamer jsou asymetrické a jejich osy jsou rovnoběžné. Výsledný obraz působí mnohem přirozenějším dojmem. Právě tato metoda je použita v modelové aplikaci.
Obr. 3: Správné nastavení kamer při stereoprojekci (metoda off-axis) Zdroj: http://projects.ubic.fr/monkey3d/engine.php
V OpenGL lze umístění a nastavení kamery v prostoru zajistit například prostřednictvím intuitivní funkce gluLookAt(). Tento příkaz má devět parametrů, kde první tři parametry specifikují souřadnice, na kterých se kamera nachází. Následné tři parametry určují souřadnice bodu, na který se kamera dívá a pomocí posledních tří parametrů je stanoven vektor směřující „nahoruÿ. GluLookAt() je ekvivalentní k vložení vytvořené transformační matice do glMultMatrix*() a následnému zavolání glTranslate*() s parametry záporného souřadného systému kamery. K popisu perspektivní projekce lze využít i funkce glFrustum().
4
FRAKTÁLNÍ GEOMETRIE
4
19
Fraktální geometrie
V 60. letech se francouzský matematik Benoit Mandelbrot začal zabývat otázkou: „Jak dlouhé je pobřeží Velké Británie?ÿ Mandelbrot vycházel z poznatků Lewise Fry Richardsona, který se snažil změřit obvod ostrova Korsiky. Touto zdánlivě jednoduchou otázkou položil základy teorie fraktálů. Odpověď totiž zní, že délka je závislá na použitém měřidlu. Tedy čím přesněji měříme, tím se nám zvětšuje délka pobřeží. Jinými slovy řečeno, výsledné naměřené hodnoty se nepohybují v relativně podobných mezích, nýbrž jsou libovolně velké. Znamená to tedy, že pobřeží Velké Británie je nekonečné? Mandelbrot přichází s odpovědí, že přímou linií je něco jednorozměrného, plocha má dvě dimenze a pobřeží bude něco mezi, či-li zlomek. Z této skutečnosti jednoznačně vyplývá nedostatečnost klasické, euklidovské, geometrie k popisu reálného fyzikálního světa. V roce 1975 Mandelbrot definoval termín fraktál a stál u zrodu fraktální geometrie. Základem fraktální geometrie je složitost a členitost, na rozdíl od euklidovské geometrie využívající přímky, rovinné obrazce či tělesa. Fraktání geometrie reflektuje skutečnost, že řada přírodních objektů vypadá podobně, ať se na ně díváme v jakémkoliv měřítku. Nezávisle na fraktální geometrii, zhruba v polovině osmdesátých let, vzniká teorie chaosu.
4.1
Dělení fraktálních objektů do kategorií
S rozvojem a popularizací fraktální geometrie se začaly rozlišovat jednotlivé typy fraktálů. Toto členění se neprovádí jen kvůli systematičnosti, ale i z důvodu, že jednotlivé typy fraktálů se hodí pro řešení určitého okruhu otázek. Dle literatury (Fraktály v počítačové grafice IV, 2005) Rozeznáváme následující 4 skupiny fraktálů: • Dynamické systémy s fraktální strukturou • L-systémy • Systémy iterovaných funkcí IFS • Stochastické (nepravidelné) fraktály 4.1.1
Dynamické systémy s fraktální strukturou
Dynamický systém je matematický model závisející na určité proměnné (většinou na čase). Vychází z počátečních podmínek a jsou jimi v čase determinovány. Existuje i nemalá skupina dynamických systémů, které se po určité době neustálí v pevném stavu, avšak ani nedivergují. Daná skutečnost bývá označována pojmem deterministický chaos. Fraktály z této kategorie mají v praxi asi nejširší uplatnění. Typickým příkladem dynamického systému s fraktální strukturou je výpočet populačního růstu. Dynamické systémy se vyskytují i v komplexní rovině. U bodů v komplexní rovině se nejčastěji pozoruje únik od atraktoru v závislosti na počtu iterací. Pokud atraktor zřetelně směřuje do své oblasti přitažlivosti, výpočet ukončíme a bod obarvíme pří-
4.2
Charakteristika a implementace fraktálů
20
slušnou barvou podle počtu iterací. Takto jsou generovány známé Juliovy množiny či Mandelbrotova množina (Fraktály v počítačové grafice IV, 2005). 4.1.2
L-systémy
L-systémy, někdy nazývané graftály, byly poprvé použity botanikem Aristidem Lindenmayerem v roce 1968 pro simulaci vývoje mnohobuněčných organismů. Jsou tvořeny přepisováním řetězců dle určitých pravidel. Každému znaku v řetězci je přiřazen určitý geometrický význam, například transformace, který odpovídá příkazu pro želvu v programovacím jazyce LOGO. Zajímavé obrazce se začnou tvořit, jestliže v LOGU použijeme rekurzi, což odpovídá iteraci v gramatice. L-systémy se užívají v biologii, geologii a dalších přírodních vědách. Mnohé aplikace využívají tyto fraktály ke generování textur (Fraktály v počítačové grafice IV, 2005). 4.1.3
Systémy iterovaných funkcí IFS
Jedná se o generativní metodu vytváření fraktálů. Tato metoda je vhodná nejen ke generování fraktálů, ale i kompresi bitmapových obrazů, zavedeme-li tzv. inverzní úlohu. Za zmínku stojí skutečnost, že metoda generování fraktálů s využitím IFS může být deterministickou, tak i náhodnou. Paradoxem je, že pokud použijeme stejný počet iterací výsledkem bude totožný fraktál (Fraktály v počítačové grafice IV, 2005). 4.1.4
Stochastické fraktály (nepravidelné fraktály)
Stochastické fraktály se používají zejména pro zobrazování a modelaci přírodních dějů a objektů, neboť do výpočtu zavádí prvek náhody. Nepravidelné fraktály jsou soběpříbuzné. Soběpříbuznost znamená, že kterákoliv část je velice podobná s původním tělesem. Tyto fraktály mohou být vytvořeny třeba náhodným přesouváním bodu, který zanechává za sebou stopu (Brownův pohyb).
4.2
Charakteristika a implementace fraktálů
Následující text stručně charakterizuje vybrané fraktály použité v modelové aplikaci. Z důvodu, že práce má rovněž sloužit jako výukový a podpůrný materiál pro projekty podobného charakteru a ne každý je zběhlý v programovacím jazyce C++, budou ve všech podkapitolách vykreslovací algoritmy daných fraktálů uvedeny v pseudokódu. Budou však vycházet z odzkoušených metod užitých v programu. Jen s tím rozdílem, že pseudokód bude psán v češtině a bude tak jednodušší jej pochopit. Samotné zdrojové kódy pak budou uvedeny na konci dokumentu, na přiloženém kompaktním disku.
4.2
Charakteristika a implementace fraktálů
4.2.1
21
Mengerova houba
Mengerovu houbu poprvé popsal rakouský matematik Karl Mengere v roce 1926. Mengerova houba je příklad trojrozměrného IFS fraktálu. Výchozím prvkem tohoto fraktálního obrazce je krychle, tu rozdělíme na 27 menších krychlí a odstraníme sedm prostředních krychliček (ty které nesousedí s žádnou stranou). Množství krychlí tvořících Mengerovu houbu se při každé iteraci zvýší dvacetkrát oproti původnímu = 2, 727. stavu. Topologická dimenze je 2, Hausdorffova dimenze je pak D = log20 log3 Za povšimnutí stojí zejména skutečnost, že z původních stran zbyly Sierpinského koberce, ale zároveň i každá další nově vzniklá strana je Sierpinského kobercem. Mengerovu houbu lze definovat jako mřížku s nekonečně velkým povrchem, ale nekonečně malým objemem. Algoritmus vykreslení Mengerovy houby:
Nastav souřadnice x, y, z výchozího bodu. Nastav délku hrany d počáteční krychle. if (iterace ==1) { Vykresli 20 krychlí přičítáním a odečítáním d k souřadnicím výchozího bodu. } else { Nastav novou délku hrany nova_d na třetinu původní délky (nova_d = d/3.0). Sniž iteraci o jedna. Rekurzivně opakuj pro každou z 20 krychlí s velikost hrany nova_d. }
4.2.2
Lorenzův atraktor
Lorenzův atraktor je historicky první detailně zkoumaný a popsaný dynamický systém s podivným atraktorem. Podivný atraktor je fraktál s Hausdorffovou dimenzí mezi 2 a 3. V roce 1983 odhadl P. Grassberger dimenzi na 2, 06 ± 0, 01. Tento systém byl objeven v roce 1963 Edwardem Nortonem Lorenzem při pokusu vymyslet rovnice popisující chování atmosféry. V té době byly i jednoduché výpočetní operace na počítači pomalé a tak si jednou zkrátil čas výpočtem pouze poloviny grafu. Počáteční hodnoty zadal na základě předchozího výpočtu a nechal počítač vykreslit graf. Výsledek porovnal s dříve vypočteným grafem a zjistil, že se oba grafy po chvíli odlišují. Zprvu to považoval za chybu počítače, ale další grafy byly stejné. Po určité době zjistil, že počítač pracuje s osmi desetinnými místy, kdežto on jich zadal pouhých šest. Tehdy si uvědomil, že jakkoliv malá nepřesnost výchozích podmínek, znamená
4.2
Charakteristika a implementace fraktálů
22
velkou odchylku od skutečnosti (Deterministický chaos: Princip a aplikace, 2006). Vznikne zapsáním rovnic popisujících chování vodního kola, po úpravě lze zapsat takto: xn+1 = xn + (−a × xn × dt) + (a × yn × dt) yn+1 = yn + (b × xn × dt) − (yn × dt) − (zn × xn × dt) zn+1 = zn + (−c × zn × dt) + (xn × yn × dt) Vhodné počáteční podmínky pro vykreslení Lorenzova atraktoru jsou: • a = 5,0 • b = 15,0 • c = 1,0 • dt = 0,02 Lorenzův atraktor je společně s Ljapunovovým exponentem symbolem pro chaos. Algoritmus vykreslení Lorenzova atraktou:
Nastav počáteční hodnoty systému x, y, z. Vynuluj souřadnice dalšího bodu na orbitu xn, yn, zn = 0. while (iterace>0){ Nastav vhodné konstanty pro vykreslení atraktoru. Proveď výpočet druhého bodu na základě tří diferenciálních rovnic, uvedených výše. Přepiš nové souřadnice. Sniž iteraci o jedna. Vykresli úsečku. }
4.2.3
Barnsleyho kapradina
Fraktál objevil Michael Barnsley v osmdesátých létech minulého století na Georgia Institute of Technology v Atlantě. Vzhledem k tomu, že Barnsley měl rád kapradiny, vybral si pro některé své experimenty právě je. Tento geometrický útvar vzniká tak, že každý lístek kapradiny je kopií sebe samotného. Původní útvar je postupně doplňován dalšími útvary, které jsou zmenšenými kopiemi útvaru původního. Tyto menší kopie mohou překrývat původní objekt. Čím déle pak iterační proces trvá, tím detailnější se struktura stává. Barnsleyho kapradina představuje typického zástupce IFS fraktálů. Algoritmus vykreslení Barnsleyho kapradiny v 3D:
for (poc=0 to iterace) {
4.2
Charakteristika a implementace fraktálů
23
Náhodně vyber číslo od 0 do 100. Na základě takto získané náhodné proměnné získáme index pro výběr IFS sady. Sada je v našem případě definována jako vektor. Podle vzorce se provede výpočet bodu s danou sadou. Přepiš nové souřadnice. Vykresli bod. }
4.2.4
Kochova vločka
Kochova vločka je tvořena třemi spojenými Kochovými křivkami. Vločku definoval poprvé v roce 1904 švédský matematik Niels Fabian Helge von Koch. Princip je velmi jednoduchý, každá strana rovnostranného trojúhelníka je rozdělena na třetiny. Prostřední třetina se vyjme a na jejím místě se sestrojí ramena rovnostranného trojúhelník. Postup se rekurzivně opakuje pro každý takto vzniklý trojúhelník. Každým krokem dochází ke zvětšení plochy, nově přidané trojúhelníky jsou při tom stále menší a výsledkem je √konvergentní geometrická řada. Plocha ohraničená Kochovou 2 vločku má velikost 2s 5 3 . Kde s je délka strany počátečního trojúhelníku. Obsah Kochovy vločky je pak roven 8/5 obsahu základního trojúhelníku. U Kochovy vločky tedy nekonečně dlouhá křivka, které neprotne nikdy sebe sama, ohraničuje konečnou plochu. Existuje celá řada modifikací, např. Kochův ostrov (namísto s trojúhelníky se pracuje se čtverci) či Kochova antivločka. Eric Haines vytvořil trojrozměrnou verzi vločky, pracující s koulí. V navrhované aplikaci je základem Kochovy vločky čtyřstěn. Čtyřstěn je trojrozměrné těleso, jehož stěny tvoří čtyři stejné rovnostranné trojúhelníky. Pro každou hranu výchozího čtyřstěnu spočteme střed, spojením středů hran získáme podstavy pro přidání nových čtyřstěnů. Délka hrany tohoto čtyřstěnu bude poloviční oproti původní hraně. Popsaná procedura se opakovaně provádí pro všechny nově vygenerované čtyřstěny. Algoritmus pro vykreslení 3D Kochovu vločky vypadá následovně: Vykresli počáteční čtyřstěn. Vezmi souřadnice vrcholů každé stěny, navzájem je zprůměruj, tím získáš střed stěny. Získej středy hran dané stěny. Vypočti vektor od středu stěny čtyřstěnu k protilehlému vrcholu. Přičtením vektoru ke středu stěny získám vrchol nového čtyřstěnu. Tento postup opakuj pro nový, menší čtyřstěn. 4.2.5
Sierpinského trojúhelník
V roce 1915 jej poprvé popsal polský matematik Waclaw Franciszek Sierpinski. V počítačové grafice existuje množství způsobů jeho konstrukce, od využití systému iterovaných funkcí IFS, přes L-systémy až po speciálně navržené dynamické systémy
4.2
Charakteristika a implementace fraktálů
24
vytvářené v komplexní rovině. Samotný Sierpinského trojúhelník (nejčastěji rovnoramenný), je definován rekurzivním vyříznutím trojúhelníku tvořeného středními příčkami trojúhelníku původního. Tento postup se dále aplikuje na třech zbylých trojúhelnících. Při konstrukci trojrozměrného Sierpinského trojúhelníku platí stejná pravidla jako v případě dvourozměrného. Ovšem s tím rozdílem, že základním objektem není již trojúhelník, ale čtyřstěn případně jehlan. Sierpinského čtyřstěn má Hausdorffovu log5 = 2 a Sierpinského pyramida D = log2 = 2, 3219. Algoritmus dimenzi D = log4 log2 vykreslení Sierpinského čtyřstěnu:
if (iterace>0) { Vypočti středy všech 6 hran čtyřstěnu (S_AB, S_AC, S_AD, S_BC, S_BD, S_CD). Rozděl_čtyřstěn(A, S_AB, S_AC, S_AD, iterace-1). Rozděl_čtyřstěn(S_AB, B, S_BC, S_BD, iterace-1). Rozděl_čtyřstěn(S_AC, S_BC, C, S_CD, iterace-1). Rozděl_čtyřstěn(S_AD, S_BD, S_CD, D, iterace-1). } else { Vykresli čtyřstěn o vrcholech A, B, C, D. }
5
5
METODIKA
25
Metodika
Před samotným návrhem a implementací aplikace pro virtuální realitu je nutné zajistit potřebné technologické vybavení. Běžnou projekční technikou lze bez problému zobrazit geometrické a barevné informace, nikoliv však pocit hloubky. Způsobů zobrazení prostoru existuje hned několik. Jedná se o stereoskopické metody. Tyto stereo-zobrazovací metody se odlišují rozlišením obrazu, počtem možných diváků a samozřejmě finanční dostupností. Je tedy vhodné předem zvážit za jakým účelem bude aplikace vytvářena. Kromě projekce je třeba zajistit výkonný počítač či grafickou stanici s grafickou kartou mající výkonný 3D akcelerátor a v případě modelové aplikace i s podporou Quad bufferingu. Nezbytné pro virtuální realitu jsou pak stereoskopické brýle. Doposud zmíněné technologické vybavení by sice stačilo pro navození virtuální reality, avšak pro zvýšení věrohodnosti simulace je nutné, aby účastník virtuální reality byl s okolím v interakci. Toho lze docílit prostřednictvím zařízení pro snímání pohybu, tzv. trackeru a 3D grafického ovladače. Zpracování polohových informací z trackeru, jejich zaslání do řídící jednotky, přijetí řídící jednotkou a následné uložení informací do sdílené paměti je zajištěno na softwarové úrovni. V univerzitní laboratoři výše popsané činnosti obstarává TrackD software, který je kompatibilní se zde uživaným trackerem Flock of Birds od společnosti Ascension a 3D myší Wanda. Použití trackdAPI spolu s TrackD, umožní snadno zpřístupnit data z trackeru a Wandy, bez toho aniž by programátor musel psát řádky a řádky kódu. Pro zpřístupnění dat ze sdílené paměti je zapotřebí tzv. sdíleného paměťového klíče, jehož hodnotu je možné získat z konfiguračního souboru trackd.conf.
6
IMPLEMENTACE
6 6.1
26
Implementace Návrh tříd
Cílem objektového programování je rozdělení aplikace na větší množství malých problémů, které jsou snáze řešitelné. V objektově orientovaném programovacím jazyce C++ třída definuje atributy a metody. Samotná třída neobsahuje konkrétní hodnoty, jedná se pouze o vzor, data obsahují až objekty. Síla této metody vytváření programů spočívá právě v možnosti použít existující třídu a v té pouze upravit či přidat několik metod, zbytek však ponechat. Toto umožňuje dědičnost, jeden ze základních principů objektově orientovaného programování. Třída, ze které se dědí, bývá označována jako rodičovská. Naopak třída mající svého předchůdce se označuje jako potomek. V modelové aplikaci je rodičovskou třídou třída Fraktal, v níž jsou nadeklarovány atributy a metody společné všem potomkům. Jedná se například o vlastnosti iterace (určuje opakování určitých dějů) či xnew, udávající současnou pozici na ose x, ze které se počítá rotace a posuny. Jelikož třída Fraktal slouží jen pro definici společného rozhranní všech potomků, většina jejich metod je čistě virtuální. Tyto metody jsou bez těla a zapisují se pomocí = 0 za hlavičkou metody. Třída Fraktal je tedy abstraktní třídou, protože obsahuje více než jednu virtuální metodu. Nelze založit instanci abstraktní třídy Fraktal, každý potomek takové třídy zůstává rovněž abstraktním, dokud nebudou nadefinována těla všech čistě virtuálních metod. Za zmínku stojí čistě virtuální metoda vykresli(), která obstarává vykreslení příslušných fraktálů nebo další čistě virtuální metoda inicializaceProstredi(), řešící osvětlení a stínování objektu. Pro vypnutí nastaveného osvětlení je v třídě Fraktal zaveden virtuální destruktor ~Fraktal(). Potomci dědí z předka s různými příznaky viditelnosti. V případě modelové aplikace se dědí s modifikátorem public, existují ještě další dva modifikátory viditelnosti protected a private. Pomocí klíčového slova public dojde ke specifikaci přístupu k prvkům rodiče následným způsobem. Zděděné prvky je možné využít v metodách třídy potomka, navíc jsou přístupné i z vnějšku programu. Třída Fraktal má pět potomků, viz Přílohy – Diagram tříd. V těchto pěti odvozených třídách jsou rozvedeny zmíněné čistě virtuální metody dle charakteristik jednotlivých fraktálů. Vlastní atributy potomků jsou zapouzdřeny, z důvodu aby je nebylo možné libovolně měnit. Přístup k nim je možný pouze pomocí příslušných metod. Tento koncept výrazně přispívá ke zrychlení vývoje celé aplikace.
6.2
Nastavení kamer v modelové aplikaci
Vnímání prostorového obrazu je umožněno stereoskopickou projekcí. Pro stereoskopické zobrazení je nutné vykreslovat scénu střídavě z pohledu pro levé a pravé oko. K tomuto účelu je v aplikaci naimplementována třída StereoSettings. Pomocí metod StereoSettings::setRightBuffer() a StereoSettings::setLeftBuffer()
6.2
Nastavení kamer v modelové aplikaci
27
jsou nastaveny zadní buffery, tedy buffery, do kterých se vykresluje. V těchto metodách je rovněž volána funkce gluLookAt(), s jejíž pomocí se nastaví pozice a orientace kamery pro levé i pravé oko. Se zavoláním příkazu gluLookAt() dojde k vytvoření pomocné transformační matice, která se vynásobí s maticí stávající. Proto se ve většině případů musí před nastavením kamery ve scéně zavolat funkce glLoadIdentity(), která nahradí současnou matici maticí identity. Jinými slovy řečeno, glLoadIdentity() vrátí matici do jejího původního stavu.
void StereoSettings::setRightBuffer() { glDrawBuffer(GL_BACK_RIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(okox, 0.0, okoz, okox, 0.0, bodz, 0.0, 1.0, 0.0); } void StereoSettings::setLeftBuffer() { glDrawBuffer(GL_BACK_LEFT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(-okox, 0.0, okoz, -okox, 0.0, bodz, 0.0, 1.0, 0.0); }
Parametry funkce gluLookAt() jsou získány výpočty z atributů separation a vzdalenost třídy StereoSettings. Separation udává rozteč očí a vzdalenost určuje velikost vektoru mezi dvěma souhlasnými body, jedním promítnutým na levou (pravou) oční sítnicí a druhým na levém (pravém) obrazu na plátně. Výsledné hodnoty se ukládají do proměnných okox, okoz a bodz. Jejich změnou dojde ke změně paralaxy. Horizontální paralaxa je definována jako rozdíl snímkových souřadnic odpovídajícího si bodu na obou snímcích. V hlavním programu stačí již jen nadefinovat funkci, ve které dojde k nastavení zadních bufferů pro vykreslení, vykreslit levý i pravý snímek a provést prohození všech bufferů.
void onDisplay(void) { camera->setLeftBuffer();
6.3
Trackery
28
vykreslovanyFraktal->draw(); camera->setRightBuffer(); vykreslovanyFraktal->draw(); glutSwapBuffers(); }
6.3
Trackery
V popisované aplikaci je základem snímání pohybu zařízení Flock of Birds. Flock of Birds (Flock) je patentovaná metoda magnetického snímání, vyvinutá a vyráběná společností Ascension Technology pro interaktivní grafické aplikace. Překonává řadu provozních nedostatků dřívější generace elektromagnetických systémů užívajících střídavý proud, jakým byla třeba nutnost nekovového prostředí. Rovněž výborně zvládá šum a jiné externí vlivy. Flock of Birds běžně sleduje čtyři senzory, avšak umožňuje zvýšit počet přijímačů na desítky, za pomocí přídavných vysílačů. V modelovém případě sleduje pouze dva snímače pohybu. Jeden je umístěný na brýlích a druhý v ručním 3D ovladači Wanda. Wanda je kompatibilní s CavelibTM/TrackdTM softwarovými aplikacemi. Výstupem Flock of Birds jsou hodnoty určující pozici a orientaci senzoru, oba údaje jsou měřeny vzhledem k souřadnicovému systému vysílače. X, Y a Z jsou tři hodnoty určující pozici senzoru, které si uživatel může nechat vypsat v palcích, metrech nebo jiné jednotce. Orientaci snímače můžeme dostat na výstup buď v podobě devíti údajů, které jsou prvky 3 × 3 matice, nebo tří Eulerových úhlů (azimuth, elevation a roll) a nebo jako čtyři quaterniony. V laboratoři virtuální reality je tracker Flock of Birds podporován softwarem TrackD společnosti Mechdyne. TrackD je aplikací typu deamon (aplikace běžící na pozadí systému), která získává informace z trackeru a Wandy a následně tyto informace poskytuje ke zpracování. TrackD představuje multiplatformní software, jehož síťovací schopnosti umožňují různým grafickým strojům sdílet informace z trackovacích a vstupních zařízení bez ohledu na operační systém. Aplikace užívající TrackD nepotřebují znát typ použitého hardwarového zařízení. Aplikace obdrží data z trackeru a ovladače prostřednictvím volně dostupného rozhraní pro programování aplikací, nazývaného trackdAPI. Jedná se o sbírku funkcí, procedur či tříd určité knihovny, které může programátor pracující s danou knihovnou využít ve svém programu, namísto toho, aby je musel sám napsat.
6.4
Připojení knihovny trackdAPI MT
Před navázáním spojení s klientskou částí TrackD bychom si měli nejprve objasnit, jak správně připojit uživatelské rozhranní trackdAPI. Jedná se sice o velmi banální
6.5
Inicializace trackeru
29
krok, přesto se může stát, že jej opomeneme nebo neprovedeme korektně. Tím by pak nebylo možné získat potřebná data pro práci s trackery pohybu. Popisovaný program je psán v programovacím jazyce C++, kde se provádí vložení hlavičkového souboru knihovny pomocí příkazu #include,který má dvě varianty: #include„trackdAPI CC.hÿ nebo #include
. V prvním případě musí být hlavičkový soubor pro trackdAPI MT knihovnu umístěn v adresáři se zdrojovým kódem, ve druhém se pak soubor vezme z adresáře se standardními hlavičkovými soubory (ve Windows typicky C:\...\include). V obou způsobech mohou jména souborů obsahovat relativní cestu, adresáře se pak oddělují obyčejným lomítkem (Eckel, Allison, 2006). Pro spuštění programu je nutné říct kompileru, kde je umístěna trackdAPI MT knihovna. To se většinou nastaví ve vlastnostech projektu, v záložce linker, kam se napíše relativní cesta vedoucí ke knihovně nebo jen mínus a název knihovny, viz -trackdAPI MT. Vše potřebné pro překlad kódu pracujícího s daným API bylo již zmíněno, takže je možné se věnovat inicializaci trackerů a zpracování získaných pozičních dat.
6.5
Inicializace trackeru
Pro komunikaci s trackdAPI máme již předdeklarované třídy TrackerReader (pro zpracování pozičních údajů ze sdílené paměti) a ControllerReader (pro zpracování dat o ovladači ze sdílené paměti). Pro získání daných údajů ze sdílené paměti je třeba získat se souboru trackd.conf hodnoty sdílených paměťových klíčů. Tyto hodnoty jsou přiřazeny proměnným trackerKey a controllerKey. Vlastní inicializace probíhá následovně. V hlavičkovém souboru trackdAPI_CC.h je pro konstruktor ručně vytvořená vyjímka – TrackerReader(int) throw( TrackdError ). Pokud je splněna podmínka if, vytvoří se instance třídy TrackerReader, čímž se nasměruje ukazatel do části sdílené paměti trackeru. Zpracování výjimky se vztahuje právě k tomuto bloku programu. V bloku začínajícím příkazem catch je pak výjimka řešena. V našem případě tak, že nastane-li kdykoliv během zpracování těla příkazu try výjimka TrackdError, výpočet těla se ukončí a přejde se do odpovídajícího bloku catch. Tam se vypíše prostřednictvím metody what() důvod výjimky a běh programu se ukončí s návratovým kódem 0. Inicialize controlleru probíhá stejným způsobem.
int trackerKey = 4126; int controllerKey = 4127; if (trackerKey != 0) { try{ tracker = new TrackerReader(trackerKey); } catch(TrackdError te){
6.6
Nastavení ovládání Wandy (controlleru)
30
std::cout<
6.6
Nastavení ovládání Wandy (controlleru)
Wanda je navigační zařízení používané ve virtuální realitě k manipulaci s prostorovými objekty. Jedná se o navigační a ukazovací zařízení s joystickem, třemi programovatelnými tlačítky a vestavěným snímačem šesti stupňů volnosti. V implementované aplikaci se pomocí joysticku ovládá zoomování a pootočení vykresleného fraktálu doleva či doprava. Klíčovou úlohu zde hraje metoda trackdGetValuator(int id), kde parametr id představuje identifikátor „valuátoruÿ. Výchozí uspořádání „valuátorůÿ je x, y. Pokud tedy metodu trackdGetValuator() zavoláme s parametrem 0, z trackeru dostaneme návratovou hodnotu udávající aktuální pozici kuličky na ose x. S parametrem 1 získáme pozici na ypsilonové ose. Rozsah hodnot jak na ose x, tak na ose y je implicitně nastaven v intervalu od -1 do 1. Pokud je hodnota „valuátoruÿ rovna nule, tedy trackball se nachází přesně ve středu souřadnic, znamená to, že s kuličkou nebylo hnuto ve směru ani jedné osy. Proměnná speed ovlivňuje citlivost joysticku. V praxi se osvědčilo nastavit konstantu speed na hodnotu 5.
if (controller->trackdGetValuator(0) != 0) { vykreslovanyFraktal->ynew += controller->trackdGetValuator(0)*speed; vykreslovanyFraktal->yold = vykreslovanyFraktal->ynew; } if (controller->trackdGetValuator(1) != 0)
6.6
Nastavení ovládání Wandy (controlleru)
31
{ vykreslovanyFraktal->znew -= controller->trackdGetValuator(1)*speed; vykreslovanyFraktal->zold = vykreslovanyFraktal->znew; }
Jak bylo zmíněno již výše, Wanda obsahuje 3 programovatelná tlačítka. To znamená, že pro každé tlačítko lze naprogramovat libovolnou činnost, která bude spuštěna, jakmile bude příslušné tlačítko stištěno. Stejně jako při práci s joystickem, tak i při programování jednotlivých tlačítek bude hrát klíčovou roli metoda. Tentokrát však bude pro naši činnost nepostradatelná metoda trackdGetButton(int id). Parametr id v tomto případě udává o jaké tlačítko se jedná. Návratová hodnota metody je 1, pokud je tlačítko stlačeno nebo vrací 0 v případě opačném. Pomocí levého tlačítka je řešena poloha a náklon fraktálního obrazce ve vztahu k Wandě. Aby náklon a natočení obrazce odpovídaly náklonu a nasměrování ovladače je nutné zjistit hodnoty Eulerových úhlů. Eulerovy úhly určují orientaci v prostoru vzhledem k soustavě souřadnic. Existují tři Eulerovy úhly. Úhel mezi osami x a z se nazývá azimuth, elevation je úhel sevřený osami y a z , poslední úhel, který se nachází mezi osou x a y, je označován jako roll. Eulerovy úhly získáme ze sdílené paměti prostřednictvím metody trackdGetEulerAngles(). Výsledné hodnoty přiřadíme do proměnné orn[3]. Modelová aplikace pracuje jen se dvěma z nich. S azimuthem (orn[1]) pro odpovídající rotaci kolem osy y a pro rotaci okolo osy x využijeme úhel elevation (orn[0]). Samotná rotace je zajištěna následovně. Pomocné proměnné moty a motx jsou vynulovány již v konstruktorech jednotlivých fraktálů. Jestliže je stlačeno levé tlačítko, hledá se, která z if podmínek je splněna. Po nalezení vyhovující podmínky se do pomocné proměnné přiřadí výchozí úhel. Posléze se do pomocné proměnné přiřadí úhel, jaký svírá Wanda vzhledem ke kalibračnímu zařízení. Výchozí úhel je přepsán na nový a pomocná proměnná je opět vynulována pro další použití.
if (controller->trackdGetButton(0)==1) { if (orn[1] > 0 || orn[1] < 180) { vykreslovanyFraktal->moty = vykreslovanyFraktal->ynew; vykreslovanyFraktal->moty = orn[1]; vykreslovanyFraktal->ynew = vykreslovanyFraktal->moty; vykreslovanyFraktal->moty = 0; } if (orn[1] > -180 || orn[1] <0) {
6.6
32
Nastavení ovládání Wandy (controlleru)
vykreslovanyFraktal->moty vykreslovanyFraktal->moty vykreslovanyFraktal->ynew vykreslovanyFraktal->moty } if (orn[0]<0) { vykreslovanyFraktal->motx vykreslovanyFraktal->motx vykreslovanyFraktal->xnew vykreslovanyFraktal->motx } if (orn[0]>0) { vykreslovanyFraktal->motx vykreslovanyFraktal->motx vykreslovanyFraktal->xnew vykreslovanyFraktal->motx }
= = = =
vykreslovanyFraktal->ynew; orn[1]; vykreslovanyFraktal->moty; 0;
= = = =
vykreslovanyFraktal->xnew; -orn[0]; vykreslovanyFraktal->motx; 0;
= = = =
vykreslovanyFraktal->xnew; -orn[0]; vykreslovanyFraktal->motx; 0;
}
Stiskem prostředního tlačítka Wandy se přejde k vykreslení dalšího fraktálu v pořadí. Toho je dosaženo pomocí příkazu switch. Tento příkaz funguje v C++ jako směrovací zařízení, říkající počítači, který řádek kódu má provést. Rozhodování, která sekvence kódu se provede, vychází z celočíselné proměnné uvedené v kulatých závorkách za switch. Podle ní se provedou příkazy uvedené za návěstím case s odpovídající hodnotou. Pokud není nalezena odpovídající hodnota, skočí program na řádek začínající klíčovým slovem default, jeho užití však není povinné. Jelikož jsou tlačítka Wandy velmi citlivá i na sebemenší dotyk, není možné hodnotu uvedenou za switch, při každém stisku klávesy zvyšovat o jedna, protože by téměř vždy byl minimálně jeden fraktální obrazec přeskočen. Řešení spočívá v zavedení pomocné proměnné, která se při každém stisku prostředního tlačítka zvýší o 0.5. Aktuální hodnota této proměnné je přiřazena do proměnné, podle níž se řídí switch.
if (controller->trackdGetButton(1)==1) { poc+=0.5; pocitadlo = poc; delete (vykreslovanyFraktal); switch (pocitadlo) {
6.7
GlutTimerFunc()
33
case 1: vykreslovanyFraktal = new MengerovaHouba(0.0, 0.0, 0.0, 10, 2); vykreslovanyFraktal->inicializaceProstredi(); break; ... default: break; } if (pocitadlo==5) poc = 0.5; }
Zbývá už jen popsat poslední (pravé) tlačítko, které slouží ke zvyšování iterace. Jeho naprogramování bylo velmi jednoduché. V if podmínce se kontroluje, zda je tlačítko stištěno. Pokud ano, zavolá se pro příslušný fraktál metoda zvysIteraci().
6.7
GlutTimerFunc()
Výše popsané ovládání 3D myši Wanda by nebylo možné realizovat bez použití dvou funkcí knihovny GLUT. První z funkcí je příkaz glutPostRedisplay(), který zajistí překreslení scény voláním funkce registrované pomocí glutDisplayFunc(). Druhou funkcí, kterou se bude zabývat tato kapitola podrobněji, je funkce glutTimerFunc(). GlutTimerFunc() zavolá zaregistrovanou funkci po uplynutí časového intervalu. Tento časovač má tři parametry – glutTimerFunc(timerInterval, timer, 1). První udává dobu v milisekundách, po jejímž uplynutí dojde k zavolání registrované callback funkce. Ukazatel na tuto funkci je předán v druhém parametru příkazu. Třetí parametr je datového typu integer a může obsahovat libovolnou hodnotu. V praxi se však uvádí identifikátor časovače, který danou callback funkci vyvolal. Registrovaná funkce nesmí být metodou žádné třídy, musí mít pouze jeden parametr a tím je hodnota předaná příkazu glutTimerFunc() při registraci. V hlavní funkci aplikace dojde k zavolání callback funkce pouze jednou, pro periodické provádění vlastních operací je nutné spustit časovač ještě jednou na konci této funkce.
6.8
Texturování
Texturování (mapování textur) je technika přispívající k podstatnému zvýšení vizuální kvality objektu za cenu relativně malých nákladů. Nanesením textury na povrch modelu definujeme strukturu, barvu a kvalitu tohoto objektu. Před vykreslením textury na objekt je nutné texturu vytvořit v operační paměti počítače. Grafická knihovna OpenGL nepodporuje vytváření textur v paměti, protože byla primárně navržena pro vytváření prostorových scén, nikoliv pro ukládání a načítání dat. Proto si musíme funkci pro načítání textury vytvořit sami. Samozřejmě bychom mohli využít již hotových knihoven (libjpg, libpng či glbmp).
6.8
Texturování
34
V některý případech však není vhodné se spoléhat na dostupnost těchto knihoven (Grafická knihovna OpenGL (26): formáty rastrových souborů, 2003) a proto použijeme v tomto článku uvedenou funkci načítaní bitmapové textury, kterou si ovšem upravíme. Na internetu lze nalézt množství metod pro načítání textur, bohužel však téměř všechny využívají zastaralou knihovnu GLAUX, vytvořenou společností Silicon Graphics. Samotná společnost kvůli potížím s pamětí nedoporučuje tuto knihovnu používat. A tak Linux knihovnu GLAUX již nepodporuje a pod Windows je její použití nepřípustné. Přesto je však použita v celé řadě programů, což ale není případ modelové aplikace. Použitá mapovací metoda načítá rastrová data textury z grafického formátu BMP. BMP formát, není sice nejvhodnější, avšak díky své jednoduchosti, kompatibilitě s řadou Windows programů a možností ukládat data v režimu TrueColor je vhodnou volbou pro projekty výukového charakteru. Naimplementovaná metoda uvedená ve výše zmíněném zdroji je sice funkční, ale obsahuje pár nedostatků, které by stály za zmínku. Prvním problémem jsou prohozené barevné kanály. Problém spočívá v tom, že grafický formát BMP má pořadí pro ukládání barev RGB, kdežto OpenGL byl navržen pro big-endian systémy, které ukládají bity do paměti v obráceném pořadí, takže OpenGL s tímto pořadím pracuje, jakoby to bylo BGR. Řešení je velmi triviální, z hlavičkového souboru gl.h použijeme konstantu #defineGL_BGR 0x80E0 a ve funkci glTexImage2D() pro načtení textury do GPU, použijeme parametr GL_BGR. Další změny kódu byly spíše už jen z kategorie kosmetických úprav. Úpravy se týkaly zejména řešení podmínek if.Kdy při nesplnění požadavku, došlo k ukončení programu. To sice není žádná závažná chyba, ale u většího množství řádků kódu si těžko všimnete, že například zadáváte špatné jméno BMP souboru, ze kterého se má načíst bitmapa. Pro snazší odhalení chyb, byly příkazy pro okamžité ukončení programu nahrazeny vhodnými chybovými hláškami. A tak je uživatel informován, proč otevření souboru selhalo.
7
7
ZÁVĚR
35
Závěr
V souladu se zadáním závěrečné práce byla vytvořena funkční aplikace vykreslující fraktální obrazce ve virtuálním prostředí. Modelová aplikace je napsaná v jazyce C++ s využítím všech jeho vlastností. Řeší nastavení hlavního nástroje virtuální reality – stereografickou projekci. Samotná stereoskopická projekce sice navodí pocit hloubky, ale abychom byly do virtuálního prostředí vtaženi, bylo nutno do projektu zakomponovat elektromagnetické snímání pohybu s 3D myší Wandou. Práce s trackery pohybu je zajištěna řídícím softwarem TrackD. Pro zpřístupnění polohovacích dat získaných TrackD softwarem je třeba využít programátorské rozhranní trackdAPI. Veškerá práce s grafikou je pak zajištěna prostřednictvím knihovny OpenGL. Při návrhu a implementaci programu bylo využito množství nastudovaných poznatků, které jsou všechny zaznamenány v tomto dokumentu i s odkazem na dané zdroje. Samotný program je rozdělen do tématicky pojmenovaných modulů. Tato koncepce zvyšuje přehlednost kódu, což by ulehčilo možné rozšíření či doladění projektu. Text je psán takovou formou, aby jej bylo možné použít jako podklad pro tvorbu obdobného projektu. Aplikace by v současném stavu mohla být využita jako demonstrační nástroj v předmětu Laboratoř virtuální reality, resp. Pokročilá uživatelská rozhranní. Do budoucna by aplikace mohla být rožšířená o známé zástupce dynamických systémů – Mandelbrotovu množinu a Juliovy množiny. Tyto fraktály v rovině vypadají velmi působivě, tudíž se naskýtá otázka, jak by asi vypadaly v prostředí laboratoře virtuální reality.
8
8
LITERATURA
36
Literatura
Nieder, J., Woo, M., Shreiner, D. OpenGL - Průvodce programátora Brno: Computer Press, 2006. 679 s. ISBN 80-251-1275-6. Eckel, B., Allison, C. Myslíme v jazyku C++ : knihovna programátora 1. vyd. Praha: Grada, 2006. 608 s. ISBN 80-247-1015-3. Polášek, R. Stereoskopie – jak funguje 3D kino [on-line]. 2009. [cit. 28. 4. 2009]. Dokument ve formátu HTML. Dostupné na Internetu: . Laubr, D. Stereoskopická projekce [on-line]. 2006. [cit. 27. 4. 2009]. Dokument ve formátu PDF. Dostupné na Internetu: . Repka, M. Motion capture – řešení pro zrychlení animace [on-line]. 2006. [cit. 29. 4. 2009]. Dokument ve formátu HTML. Dostupné na Internetu: . Chromý, J. HARDWARE PRO VIRTUÁLNÍ REALITU – SNÍMÁNÍ POLOHY [on-line]. 2007. [cit. 30. 4. 2009]. Dokument ve formátu HTML. Dostupné na Internetu: . UI PEF, MZLU v Brně Laboratoř virtuální reality [on-line]. 2009. [cit. 30. 4. 2009]. Dokument ve formátu HTML. Dostupné na Internetu: . Tišnovský, P. Grafická knihovna OpenGL(5): transformační matice a lineární transformace [on-line]. 2003. [cit. 1. 5. 2009]. Dokument ve formátu HTML. Dostupné na Internetu: . Tišnovský, P. Grafická knihovna OpenGL(13): Double buffering [on-line]. 2003. [cit. 3. 5. 2009]. Dokument ve formátu HTML. Dostupné na Internetu: . Tišnovský, P. Fraktály v počítačové grafice IV [on-line]. 2005. [cit. 27. 4. 2009]. Dokument ve formátu HTML. Dostupné na Internetu: . Hladík, M. Deterministický chaos: Princip a aplikace [on-line]. 2006. [cit. 1. 5. 2009]. Dokument ve formátu HTML. Dostupné na Internetu: . Tišnovský, P. Grafická knihovna OpenGL (26): formáty rastrových souborů [on-line]. 2003. [cit. 3. 5. 2009]. Dokument ve formátu HTML. Dostupné na Internetu: .
Přílohy
A
A
DIAGRAM TŘÍD
Diagram tříd
Obr. 4: UML diagram tříd modelové aplikace
38
A
DIAGRAM TŘÍD
39
Obr. 5: UML diagram třídy StereoSettings, sloužící pro nastavení stereografické projekce
B
B
UKÁZKY FRAKTÁLNÍCH OBRAZCŮ Z MODELOVÉ APLIKACE
Ukázky fraktálních obrazců z modelové aplikace
Obr. 6: Mengerova houba
40
B
UKÁZKY FRAKTÁLNÍCH OBRAZCŮ Z MODELOVÉ APLIKACE
Obr. 7: Barnsleyho kapradina
Obr. 8: Vločka Helge von Kocha
41
B
UKÁZKY FRAKTÁLNÍCH OBRAZCŮ Z MODELOVÉ APLIKACE
Obr. 9: Lorenzův atraktor
Obr. 10: Sierpinského čtyřstěn
42
C
C
FOTOGRAFIE Z LABORATOŘE VIRTUÁLNÍ REALITY
Fotografie z laboratoře virtuální reality
Obr. 11: Kochova vločka ve virtuální realitě
43
C
FOTOGRAFIE Z LABORATOŘE VIRTUÁLNÍ REALITY
Obr. 12: Mengerova houba v prostředí laboratoře virtuální reality
44