Mendelova zemědělská a lesnická univerzita v Brně Provozně ekonomická fakulta
Modelování a vizualizace biomedicínských dat v prostředí virtuální reality Bakalářská práce
Vedoucí práce: Ing. David Procházka, Ph.D.
Michael Lauko
Brno 2009
Chtěl by poděkovat vedoucímu své bakalářské práce, panu Ing. Davidu Procházkovi, Ph.D., za jeho ochotu a metodické vedení.
Prohlašuji, že jsem bakalářskou práci na téma „Modelování a vizualizace biomedicínských dat v prostředí virtuální realityÿ zpracoval samostatně s použitím literatury, kterou uvádím v seznamu.
V Brně dne 21. května 2009
....................................................
4
Abstract Lauko, M. Biomedical data modelling and visualisation in the virtual reality environment Bachelor thesis. Brno, 2009. Thesis deals with the visualisation of the object in the context of OpenGL. In the theoretical part there are described the basic methods of visualisation and its principles. Next there are described principles of stereoscopy and instruments for user-application interaction in the virtual reality. Practical part describes the implementation of the application processing biomedical data and visualises it in the virtual reality. The implementation is realised by using C++ and OpenGL. biomedical data, OpenGL, virtual reality, motion tracking
Abstrakt Lauko, M. Modelování a vizualizace biomedicínských dat v prostředí virtuální reality Bakalářská práce. Brno, 2009. Práce ze zabývá zobrazením objektu pomocí počítače v kontextu OpenGL, v teoretické části jsou popsány základní možnosti zobrazování a jejich principy, dále principy stereoskopie a prostředky umožnující interakci uživatele s aplikací ve virtuální realitě. Praktická část popisuje implementaci programu, který zpracovává biomedicínská data a vizualizuje je ve virtuální realitě. Implementace je realizována pomocí C++ a OpenGL. biomedicínská data, OpenGL, virtuální realita, motion tracking
5
OBSAH
Obsah 1 Úvod a cíl práce 1.1 Cíl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Teoretická východiska práce 2.1 Prostorové zobrazení v počítačové grafice 2.1.1 Reprezentace objektu . . . . . . . 2.1.2 Osvětlení . . . . . . . . . . . . . 2.1.3 Stínování . . . . . . . . . . . . . 2.2 OpenGL . . . . . . . . . . . . . . . . . . 2.2.1 OpenGL a další grafické knihovny 2.3 Stereoprojekce . . . . . . . . . . . . . . . 2.3.1 Hardwarové prostředky . . . . . . 2.3.2 Stereoprojekce v OpenGL . . . . 2.4 Motion tracking . . . . . . . . . . . . . . 2.4.1 Hardwarové prostředky . . . . . . 2.4.2 API TrackD . . . . . . . . . . . . 2.4.3 TrackD v OpenGL . . . . . . . . 2.5 Shrnutí teoretických poznatků . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
3 Metodika 4 Implementace 4.1 Vytvoření TIN . 4.2 Třída Soubor . . 4.3 Menu . . . . . . . 4.4 Trackery pohybu
6 6 7 7 7 13 16 19 20 22 23 26 27 27 29 30 32 33
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
35 35 38 40 40
5 Závěr
42
6 Literatura
43
Přílohy
47
A Diagram tříd
48
B Screenshoty z aplikace
49
1
ÚVOD A CíL PRÁCE
1
6
Úvod a cíl práce
V době, kdy jde ve všech aspektech lidské činnosti o rychlost a spolehlivost, dochází výpočetní technika stále nových uplatnění v nejrůznejších oblastech lidského života. Medicína, tedy odvětví, ve kterém jde především ochranu a záchranu života, nikdy nezůstávala s využitím techniky pozadu, naopak často to byla právě ona, kdo posunoval vývoj nových technologií dopředu. Různé kostní a kloubní náhrady (endoprotézy) jsou již poměrně běžnou součástí lidského života. Mnoha lidem tyto prostředky ulehčují, či dokonce umožnují normální život. Je pochopitelné, že je při výrobě těchto pomůcek nezbytná přesnost zpracování a věrnost „origináluÿ, tedy původní kosti nebo původnímu kloubu. Trojrozměrný (3D) scanner umožňuje získat reálný prostorový model předmetu. Existuje více technologií, které umožňují skenovat povrch trojrozměrného objektu. Výstupem scanneru je zpravidla shluk bodů, které reprezentují povrch dotyčného objektu. Tyto body je nutné transformovat na spojitou plochu a umožnit tak její zobrazení. Takto vizualizovanou plochu lze použít při tvorbě náhradní kosti nebo náhradního kloubu. Díky využití znalostí principu lidského vidění stereoprojekce umožňuje za pomoci speciální techniky zobrazit předměty věrohodným způsobem trojrozměrně. Tyto technologie dosahují svého uplatnění v celé řadě odvětví, například v zábavě, designu, průmyslu, armádě nebo medicíně. Aplikace, která je smyslem této práce, je součástí projektu, který pro brněnskou Nemocnici u svaté Anny vytváří Strojnická fakulta Vysokého učení technického v Brně. Projekt by měl umožnit automatizovat celý proces tvorby kloubních a kostních implantátů, tedy mimo jiné skenování, vytvoření nové náhrady a kontrolu shodnosti s originálem. Aplikace, která je smyslem této práce, by měla celý tento proces usnadnit tím, že umožní vizualizaci výstupů, porovnání a zjištění případných rozdílů, a to jak v prostředí desktopu, tak ve virtuální realitě.
1.1
Cíl
Cílem této práce je navrhnout a implementovat aplikaci, která umožní načtení výstupu ze scanneru, tedy soubor obsahující souřadnice bodů určujících dotyčnou kost či dotyčný kloub. Dále tyto body zpracuje do zobrazitelné podoby a umožní základní prohlížení objektu – pohyb, otáčení a přibližování. Aplikace bude schopna pracovat se dvěma takto zadanými objekty a bude tedy díky ní možné porovnávat a zjišťovat shodnost či rozdílnost. Aplikace bude schopná pracovat jak v desktopovém prostředí, tak v prostředí virtuální reality a v druhém případě umožní stereoskopickou vizualizaci stejně jako komunikaci s trackery pohybu pro ovládání aplikace.
2
TEORETICKÁ VÝCHODISKA PRÁCE
2
7
Teoretická východiska práce
První, nejrozsáhlejší kapitola práce nastiňuje teoretické znalosti užitečné pro orientaci v dané problematice. Je rozdělena do čtyř částí, které se postupně zabývají možnostmi, jak lze objekt reprezentovat a věrohodně zobrazovat v prostoru, grafickou knihovnou OpenGL využitou k implementaci aplikace, dále prostorovým zobrazením objektu – stereoprojekcí a nakonec monitorováním pohybu objektu – trackingem.
2.1
Prostorové zobrazení v počítačové grafice
Kapitola Prostorové zobrazení v počítačové grafice pojednává ve své první části o různých způsobech reprezentace tělesa v kontextu počítačové grafiky. Zabývá se obzvláště hraniční, dále objemovou a procedurální reprezentací objektu. Další dvě části popisují metody používané při vizualizaci objektů: empirický model osvětlení a základní stínovací techniky. 2.1.1
Reprezentace objektu
Fyzika definuje těleso jako množinu bodů (v trojrozměrném prostoru) splňujících určitá kritéria. Těleso můžeme také definovat jako sjednocení dvou vzájemně disjunktních množin. Jednou z nich je množina vnitřních bodů a druhou množina bodů hraničních, přičemž „každý vnitřní bod sousedí pouze s vnitřními nebo hraničními body. Hraniční bod pak sousedí alespoň s jedním hraničním bodem, vnitřním bodem a bodem vnějším, nepatřícím do žádné z uvedených dvou množin.ÿ (Žára, 1998, s. 183) Možností jak v počítačové grafice zobrazit těleso je několik. Mezi základní způsoby patří hraniční, objemová a procedurální reprezentace. Možnosti zobrazení • Hraniční reprezentace – Těleso je popsáno svým povrchem. Kromě geometrických a topologických informací (viz níže) může také nést informace o vlastnostech povrchu. (barvě, průhlednosti, textuře a podobně). Podle toho, jak přistupujeme k vyjádření hranic objektu, existují dvě základní větve dělení hraniční reprezentace: – Plošková (polygonální) reprezentace – Oblé tvary tělesa jsou přibližně vyjádřeny (aproximovány) sítí polygonálních plošek, nejčastěji trojúhelníků. – Analytická reprezentace – Hranice tělesa jsou vyjádřeny pomocí matematických funkcí. • Objemová reprezentace – Těleso je vyjádřeno svým objemem, tedy výčtem částí, které tvoří jeho hmotu. Kromě informací o objemu tělesa lze zazamenávat také podobně jako u hraniční reprezentace data o průhlednosti nebo barvě, ale také například hustotě a jiných fyzikálních veličinách.
2.1
Prostorové zobrazení v počítačové grafice
8
• Procedurální reprezentace – Těleso je narozdíl od hraniční a objemové reprezentace zadáno algoritmem, který umožní vypočítat tvar tělesa nebo další informace o něm. Procedurální interpretaci rozdělujeme na dvě podtřídy. – Metody používané v CAD, CAGD, jako například šablonování nebo generování ploch z křivek. – Automatické generování objektů, které se vizuálně nebo chováním podobají předmětům, které můžeme nalézt v přírodě. Tato podtřída se dále dělí a bude jí věnováno více prostoru v části Procedurální reprezentace. Hraniční reprezentace Hraniční reprezentace tělesa ho popisuje pomocí jeho povrchu, tedy množiny bodů představující jeho hranici – boundary. (Odtud boundary representation nebo také B-rep či BREP.) Hraniční reprezentace je nejpoužívanější způsob zobrazování v počítačové grafice. Hlavními důvody je podle Tišnovského použití jednoduchých datových struktur, rychlé zobrazení s využitím široce používaných 3D rozhraní (OpenGL, Direct 3D) a také například podpora CAD/CAM systémů (Computer-Aided Design – počítačem podporované projektování, Computer-Aided Manufacturing – počítačem podporovaná výroba) (Tišnovský, 2008). 3D scannery, které jsou používány například v medicíně – CT (Computer Tomography – počítačová tomografie) a MR (Magnetic Resonance – magnetická rezonance), jejichž výstupem je množství rovinných řezů objektem, jsou schopny po základním zpracování těchto dat vytvořit výstup právě v hraniční reprezentaci, a to v podobě pravidelné nebo nepravidelné trojúhelníkové sítě (TIN – Triangular Irregular Network) představující povrch snímaného tělesa. Další skutečností je, že reprezentovat objekt pomocí jeho obrysu je pro většinu lidí naprosto přirozené. Hraniční reprezentace se skládá ze dvou částí, geometrie a topologie. „Geometrie určuje, kde jsou umístěné vrcholy, topologie, jak jsou vrcholy pospojovanéÿ (Hnídek, 2007). Základními prvky v zobrazení jsou plochy, hrany a vrcholy. Plocha je ohraničená část povrchu tělesa, hrana je ohraničená část křivky a vrchol leží v bodě. Způsobů jak těleso vyjádřit v hraniční reprezentaci je více. Následující část je popisem několika možností. Hranová reprezentace je nejjednodušší metoda, která spočívá v uchování informací pouze o hranách a vrcholech. Tomuto zobrazení se také někdy kvůli jeho vzhedu říká drátový model (wired frame). Pro uložení všech informací o modelu potřebujeme dva seznamy. První seznam je seznam všech vrcholů a druhý je seznam všech hran, přitom platí, že každá hrana obsahuje právě dva odkazy do seznamu vrcholů. Výhodou tohoto modelu je rychlost zobrazení, nedochází totiž k rasterizaci plošek, řešení viditelnosti nebo výpočtu osvětlení, je ale možné zobrazit pouze hrany a tento model někdy nelze jednoznačně interpretovat.
2.1
Prostorové zobrazení v počítačové grafice
9
Jednoduchá plošková reprezentace – přidáním dalšího seznamu, seznamu ploch, do hranové reprezentace přirozeně vzniká jednoduchá plošková reprezentace. Seznam ploch obsahuje odkazy na vrcholy, které daná plocha obsahuje. Plochy tvoří buď pravidelnou síť, nebo jsou nepravidelné a mají nejčastěji tři vrcholy. Seznam ploch je realizován seznamem odkazů do seznamu vrcholů. Strukturovaná plošková reprezentace – struktura používaná při této reprezentaci je stejně jako u jednoduché ploškové reprezentace tvořena třemi seznamy metadat. Seznamem vrcholů, hran a ploch. Hlavním nositelem informací je zde hrana, někdy označovaná jako „okřídlená hranaÿ (winged-edge). Hrana v záznamu obsahuje odkazy na oba vrcholy, obě plochy, se kterými sousedí, sousední hrany a libovolnou další hranu. Seznam ploch obsahuje odkaz na jednu z jejích hran, a „případně normálový vektor, barvu či jinou materiálovou charakteristiku.ÿ (Žára, 1998, s. 187) Dalším způsobem vyjádření hranice tělesa je použití TIN (Triangulated Irregular Network – Nepravidelná trojúhelníková síť). TIN je datová stuktura, která je nejvíce používána v kartografii a v geografických informačních systémech pro reprezentaci zemského povrchu. Skládá se z nepřekrývajících se nepravidelných trojúhelníků uspořádaných ve dvoj- nebo trojrozměrném prostoru. Každé dva sousedící trojúhelníky mají společné právě dva vrcholy a hranu. Přesnost zobrazení povrchu pochopitelně závisí na vzdálenosti jednotlivých bodů – čím blíže body jsou, tím přesněji mohou kopírovat povrch objektu a tím více je omezeno vyloučení případného extrémního bodu. Algoritmus, který TIN vytváří, se nazývá triangulace. Jedním ze způsobů triangulace je triangulace Delaunayova. Pro 2D Delaunay Triangulaci (DT) platí, že žádný bod příslušné množiny bodů neleží v kružnici opsané kterémukoli z trojúhelníků. V trojrozměrném prostoru je to opsaná koule. Mezi další vlastnosti DT patří také nastavení maximálního možného vnitřního úhlu v trojúhelníku – snaha o jeho minimalizaci. Algoritmus DT používající jednu z možných metod – inkrementálního vkládání, převzato z (Strych, 2003): vytvoř trojúhelník ze tří bodů nepatřící množině, (tak aby obsahoval všechny body množiny) pro každý bod množiny { zjisti, ve kterém trojúhelníku bod leží spoj bod se všemi body trojúhelníku testuj úhly nově vzniklých trojúhelníků { pokud jsou úhly příliš velké { prohoď diagonály nových trojúhelníků a~sousedů znovu testuj úhly (rekurze)
2.1
Prostorové zobrazení v počítačové grafice
10
} } } zruš vrcholy tvořící první trojúhelník Kromě inkrementálního vkládání existují také metody inkrementální konstrukce, lokálního zlepšování, včlenění do vyšší dimenze, „rozděl a panujÿ a nepřímá metoda pomocí Voronoi diagramů (Strych, 2003). Další metodou triangulace je hltavá triangulace (Greedy Triangulation – GT). Tento algoritmus se nevrací a ve vytvořené síti nic nemění, proto se v ní mohou, narozdíl od DT, objevovat tupoúhlé trojúhelníky. Algoritmus GT nejprve vytvoří všechny hrany mezi všemi body (což vede k větší časové a paměťové náročnosti), seřadí je podle délky a počínaje nejkratší začíná spojovat body. V případě že přidávaná hrana kříží již nějakou danou hranu, nebude přidána a přeskočí se na další. V této formě lze ale použít pouze ve 2D, pro trojrozměrnou GT je potřeba využít jinou techniku než zjišťování průsečíku dvou úseček. Objemová reprezentace Jak už bylo řečeno, objemová reprezentace je způsob zobrazení tělesa pomocí výčtu částí, které jsou jeho součástí, tedy tvoří jeho objem. Tato data jsou většinou výstupem 3D scanneru, nejčastěji CT a MR. Výstupem z těchto zařízení je soustava řezů tělesem, které lze převést na objemové elementy – voxely (výraz vznikl spojením slov volumetric – objemový – a pixel). Názorněji to ukazuje obrázek 1. Data mohou být podle zdroje buď rozptýlená, častěji ale uspořádaná do pravidelných nebo nepravidelných mřížek.
Obr. 1: Ukázka objemových dat. Scan části dlaně a zápěstí. (VRVIS, 2009)
Narozdíl od hraniční reprezentace uchovává objemová reprezentace velké množství diskrétních dat. To má za důsledek nejenom větší datovou a hardwarovou náročnost, ale také například problémy s manipulací s objektem. Tato data se obtížně otáčejí (o úhly jiné než pravé) a zmenšují či zvětšují.
2.1
Prostorové zobrazení v počítačové grafice
11
Nicméně tato data mají také své výhody. Například odpadá problém určení vnějších a vnitřních bodů objektu (Tišnovský, 2008). Jednodušší je také výpočet osvětlení a průhlednosti. Při výpočtu osvětlení je také v každém bodě snadno zjistitelný normálový vektor. Práce s naměřenými daty je snadná, snadno se provádí blokové a logické operace, přičemž nazáleží na složitosti objektů nebo scény (Žára, 2004, s. 256). Procedurální reprezentace Procedurální reprezentace, jak bylo zmíněno, vyjadřuje objekty pomocí algoritmu, přesného předpisu, podle kterého je počítač schopen objekt vykreslit. Podtřídou procedurální reprezentace je technika, u které podél trojrozměrné křivky (páteře – spine curve) táhneme nejčastěji dvojrozměrnou obrysovou křivku (profil). Profilová křivka se během posunu může nebo nemusí měnit. Tato technika se nazývá šablonování (sweeping). Používají se tři způsoby šablonování: Translační šablonování – páteří je úsečka, profil je libovolný. Výsledkem je přímková plocha. Rotační šablonování – páteří je kružnice nebo její část, profil je libovolný. Stejný výsledek můžeme také získat pomocí rotace profilu kolem osy. Výsledkem je rotační plocha. Obecné šablonování – páteři i profil jsou libovolné. Výsledkem je obecná válcová plocha. Fraktální geometrie je vědní odvětví, které začalo vznikat již v 17. století, kdy profesor Gottfried Leibnitz uvažoval o rekurzivní soběpodobnosti přímek. Dalšího rozvoje se tato disciplína dočkala až na konci 19. století a intenzivně je rozvíjena asi od 60. let 20. století. Výraz fraktál pochází z latinského fractus – rozbitý, zlomený. Nejznámějším fraktálem je Mandelbrotova množina, pojmenovaná po Benoitu Mandelbrotovi, který je považován za zakladatele „moderníÿ fraktální geometrie. Tuto množinu jako první definoval v roce 1905 matematik Pierre Fatou, ale vzhledem k náročnosti ručních výpočtů ji nebyl schopen vykreslit.
Obr. 2: Mandelbrotova množina (Danvk, 2009).
2.1
Prostorové zobrazení v počítačové grafice
12
Fraktály jsou založeny na soběpodobnosti (self-similarity). To znamená nezávislost na změně měřítka. Soběpodobný objekt můžeme rozdělit na menší části, které budou jeho přesnou kopií. Na první pohled jsou to velice složité útvary, ve skutečnosti mají často relativně jednoduchý předpis. V 3D počítačové grafice se fraktály používají hlavně pro generování hor, kamenů, korálů nebo krajin. Lindenmayerovy systémy neboli L-systémy jsou systémy paralelního přepisování řetězců (parallel string rewriting system) nejčastěji používané pro modelování rostlin v počítačové grafice. Podstatou paralelního přepisování je přepisování posloupností podle určitých pravidel. Přitom každý symbol má přiřazen určitý význam, transformaci či generování objektu.
Obr. 3: Ukázka rostlin vygenerovaných pomocí L-systému Fractal Plant (wikipedia.org, 2009).
Modelování pomocí systémů částic se používá v případě objektů, u kterých není možné přesně reprezentovat povrch, a to buď kvůli jeho vysoké členitosti, nebo jeho změnám. Částicové systémy se nejčastěji používají pro modelování explozí, mraků, tekoucí vody, komet, dýmu, ohně, hejn ptáků, deště, mlhy nebo trávy. Částic, ze kterých se systémy skládají, je velké množství a vlastnosti těchto částic se v čase mění. Velkou roli v systémech tvoří náhodná čísla. Jimi jsou zadány vlastnosti částic, ať je to rychlost, směr pohybu, doba trvání nebo barva. Pomocí systémů částic můžeme také modelovat nejrůznější ekosystémy. Jedním z používaných fyzikálních modelů je takzvaný větrný tunel, kde jsou simulovány testy tření vzduchu s prototypy aut nebo letadel. Křivky a plochy – přestože šablonování nebo tvorbu ploch z křivek je řazeno řadí do procedurální reprezentace (Žára, 2004, s. 265), křivky a plochy samotné jsou reprezentací hraniční (Tišnovský, 2008) i (Žára, 2004, s. 176).
2.1
Prostorové zobrazení v počítačové grafice
13
Této oblasti počítačové grafiky položili základ P. de Casteljau a P. Béziere v padesátých a šedesátých letech minulého století. Dnes je tato oblast velmi rozsáhlá a s křivkami a plochami se setkáváme v počítačové grafice na mnoha místech. Sjednocení používaných přístupů přineslo používání racionálních B-spline křivek a NURBS ploch (Non-Uniform Rational B-Spline – plochy s neuniformní parametrizací). To znamenalo možnost rozvoje v této oblasti a s těmito křivkami a plochami pracují dnes všechny CAD/CAM systémy. Výhodou práce s analytickými křivkami a plochami je nejenom přesnost, ale také fakt, že takto vyjádřené těleso je snadné měnit a upravovat. Naproti tomu u tělesa vyjádřeného polygonální reprezentací je velmi náročná změna tvaru, vyjma lokálních změn. Nevýhodou analytického zobrazení je ale právě jeho přesnost. Pro zobrazování v reálném čase je příliš náročné, a proto je grafickým akcelerátorem převáděna právě na polygonální reprezentaci, která je výrazně rychlejší. Tento přístup je volen v aplikacích, ve kterých je čas kritickým faktorem, tedy například v počítačových hrách anebo právě ve virtuální realitě. V počítačové grafice jsou požívány křivky polynomiální, nejčastěji třetího stupně, kubiky. Modelování probíhá tak, že každá křivka má několik řídících bodů a z jejich polohy je určen průběh křivky. Řídící body můžeme interpretovat dvěma základními způsoby, a těmi jsou interpolace a aproximace. Při interpolaci křivka probíhá všemi řídícími body, při aproximaci body určují tvar křivky, ale ta jimi procházet nemusí. Křivky můžeme podle jejich povahy rozdělit na • Interpolační – Hermitovské kubiky • Aproximační – Bézierovy křivky, kubiky, Spline, uniformní kubický B-spline, NURBS • • • • •
Plochy rozdělujeme takto (Žára, 2004, s. 7): Interpolační plochy Aproximační plochy – Hermitovské, 12- a 16vektorové Plochy zadané okrajem Bézierovy plochy B-spline plochy
2.1.2
Osvětlení
Světelné zdroje jsou objekty, které vyzařují světelné záření. Nemusí ho vyzařovat sám o sobě (emitovat), ale může ho také odrážet. Rozeznáváme několik druhů světelných zdrojů (Žára, 2004, s. 336): • Bodový světelný zdroj – vyzařuje světlo z jednoho bodu do všech směrů stejnoměrně. • Rovnoběžný světelný zdroj – můžeme brát jako někonečně velký rovinný zdroj v konečné vzdálenosti nebo nekonečně vzdálený bodový zdroj. Většinou se používá na modelování slunečního světla.
2.1
Prostorové zobrazení v počítačové grafice
14
• Plošný světelný zdroj – je plošný zdroj konečné velikosti, který vyzařuje světlo do předního poloprostoru všemi směry. • Reflektor (spot light) – je zdroj světla, který je určen svou polohou a směrem, kterým září. Lze ho popsat jako kužel. Nejvíce září ve směru své osy, se vzdáleností od osy intenzita klesá. • Tabulka (general luminaries) – je předpis, který zadává množství světla závislé na vzdálenosti a úhlu od zdroje světla. • Obloha – je zdroj rovnoběžného světla ve tvaru polokoule s nekonečným poloměrem. Jakýkoli bod tedy vyzařuje rovnoběžné paprsky. Phongův osvětlovací model Tento empirický model lokálního osvětlení je pojmenován po původem vietnamském počítačovém grafikovi Bui Tuong Phongovi. Phong ([fong] ) v roce 1973 získal doktorát na University of Utah za svou práci „Illumination for Computer Generated Picturesÿ (Osvětlení pro počítačem generované obrazy), ve které tento model představil. Tento model rozlišuje tři druhy odrazu světla, které na těleso dopadá. Pro získání výsledného obrazu je složí dohromady. Model rozlišuje tyto složky: • Ambientní složka (ambient) • Difúzní složka (diffuse) • Odlesková složka (specular) Ambientní složka představuje odraz okolního světla, které rozptýleně přichází ze všech směrů. Světlo se několikrát odrazí od stěn místnosti a je rozptýleno molekulami vzduchu. Toto světlo je v empirických modelech pro celou scénu konstatní, na osvětlení všech bodů se podílí rovnoměrně. Nedostáváme žádnou informaci o prostoru. Ambientní složka určuje, jestli je těleso světlé nebo tmavé (Žára, 2004, s. 335). Na obrázku 4 vlevo je obrázek ambientní složky. Difúzní složka vyjadřuje světlo, které dopadá na těleso z konkrétního světelného zdroje a odráží se všemi směry rovnoměrně. Tato složka vytváří matné materiály. V tomto modelu je výpočet upraven tak, aby výsledná barva difúzní složky byla závislá jenom na vzájemné poloze světelného zdroje a objektu (Tišnovský, 2003b) . Při urychlování vykreslovacích algoritml se využívá toho, že poloha kamery (pozorovatele) nemá na barvu nebo intenzitu difúzní složky vliv. Difúzní složka do značné míry určuje barvu tělesa (Žára, 2004, s. 335). Difúzní složka je na obrázku 4 druhá zleva. Poslední složkou odráženého světla je složka odlesků ((Žára, 2004, s. 333): zrcadlová složka). Odlesk vzniká, když světlo dopadne na povrch tělesa a podle zákona lomu a odrazu se odráží. Phongův model modeluje skutečnost tak, že počítá s tím, že paprsek se nikdy neodrazí ideálně, ale „stanoví koeficient změny intenzity odraženého světla podle úhlu odklonu počítaného odraženého paprsku od paprsku ideálně odraženého. Vektory těchto dvou paprsků se vynásobí a výsledek se umocní zadaným koeficientemÿ (Tišnovský, 2003b). Třetí zleva na obrázku 4 je složka odlesků.
2.1
Prostorové zobrazení v počítačové grafice
15
Při zobrazování se většinou žádná ze složek nepoužívá samotná, ale používají se jejich kombinace. Kombinaci všech tří složek světla, která se nejvíce blíží realitě, zobrazuje obrázek nejvíce vpravo na obrázku 4.
Obr. 4: Phongův osvětlovací model. Nalevo ambientní složka, druhá zleva difúzní složka, třetí zleva odlesky a zcela vpravo je výsledný obraz za použití všech tří složek. (wikipedia.org, 2008h)
Výpočet intenzity osvětlení se provádí pro každou barevnou složku RGB (Red – červená, Green – zelená, Blue – modrá) modelu zvlášť, takže následující výpočet probíhá třikrát. Vzorec pro výpočet lze vyjádřit různými způsoby (Žára, 2004, s. 336) nebo (wikipedia.org, 2008h). Následující vzorec uvádí Tišnovský (Tišnovský, 2003c): I = ca Ia + cd Id (N L) + cs Is (V R)n
(1)
kde: • I je celková intenzita, která se počítá třikrát, tedy pro každou barevnou složku světla zvlášť. • ca – je koeficient materiálu pro ambientní složku světla. Může nabývat hodnot 0 (uplná absorbce) až 1 (úplný odraz). Koeficient se určuje při vytváření materiálu. • Ia je intenzita ambientní složky, tedy světla přicházejícího ze všech směrů. Není závislé na poloze tělesa a zdroji světla. Intenzita se nastavuje při vytvážení zdroje světla. • cd je koeficient materiálu pro difúzní složku světla. Stejně jako koeficient ambientní složky nabývá hodnoty 0 až 1, s podobným významem. Hodnota je stanovena při vytváření materiálu. • Id je intenzita difúzní složky světla, tedy té části, které dopadá na povrch tělesa a odráží se rovnoměrně všemi směry. Hodnota se nastavuje při vytváření světla. • N představuje normálu povrchu tělesa, na který světlo dopadá. • L je vektor světla. Hodnota součinu cd Id (NL) je závislá na vzájemné poloze tělesa (normály povrchu) a směru osvětlení. • cs je koeficient odlesků. Může nabývat hodnot 0 až 1. Koeficient je nastavován pro každou barevnou složku zvlášť. • Is představuje intenzitu světla, které dopadá na povrch a odrazí se převážně v jednom směru. Hodnota se nastavuje při vytváření zdroje světla. • V vektor z pozice kamery (pozorovatele) do bodu na povrchu tělesa.
2.1
Prostorové zobrazení v počítačové grafice
16
• R je vektor ideálně odraženého paprsku světla. • n je exponent, který udává míru lesklosti tělesa. Matné těleso má hodnotu exponentu blízkou až rovnou nule, velmi lesklé 100 i více. Čím vyšší exponent, tím jsou odlesky menší, ale intenzivnější. Hodnota součinu cs Is (VR)n je závislá na poloze zdroje světla, tělesa a pozice pozorovatele. Vektory N, L, V, R musí být před výpočtem normalizovány, jejich velikost musí být jednotková. Tento koncept je kompromisem mezi rychlostí vykreslování a věrností zobrazení. Přes svoji rychlost ale dosahuje velmi uspokojivých výsledků. Existují věrnější modely osvětlování (například Cook-Torrance, Phong-Blinn), ale pro svoji výpočetní složitost se pro realtimovou grafiku nehodí (Tišnovský, 2003c). 2.1.3
Stínování
Stínování se používá nejen v počítačové grafice. Je to proces, při kterém vykreslujeme objekt pomocí různých odstínů barvy. Používá se k co nejvěrnějšímu zobrazení „prostorovostiÿ objektu. Dokonalého stínování (tedy barvy povrchu tělesa) v každém bodě sice dosáhnout lze, ale všechny tyto výpočty jsou časově náročné, proto vzniklo několik aproximačních metod stínování, které umožňují docílit „přirozeného vzhledu prostorových objektů přesto, že řada výpočtů týkajících se zpracování světla byla zjednodušena či vynechánaÿ (Žára, 2004, s. 339). Konstantní stínování Nejjednodušším způsobem stínování je konstatní stínování (flat shading) – obrázek 5. Jeho algoritmus je založen na předpokladu, že každá plocha tělesa má jedinou normálu. Podle té je spočtena jedna barva, která je přiřazena celé ploše. Výhoda tohoto způsobu je v jeho jednoduchosti a rychlosti. Pro zobrazení mnohostěnů je tato metoda dostačující, ale nevýhoda spočívá v tom, že sousední polygony mají různé normály, tedy jinou barvu, a při zobrazení složitějších objektů je na první pohled jasné, že těleso je vykresleno pomocí skupiny plošek. Pseudokód alogoritmu konstatního stínování: pro každou plochu objektu { vypočti normálový vektor vypočti odchylku NV od paprsků světla přiděl barevný odstín ploše } Gouraudovo stínování Gouraudovo stínování je pojmenované po francouzském vědci Henri Gouraudovi [guró, guródovi]. Tuto metodu navrhl ve své práci „Computer Display of Curved Surfacesÿ (Počítačové zobrazení zakřivených povrchů), za kterou v roce 1971 získal titul PhD. na University of Utah (wikipedia.org, 2008f).
2.1
Prostorové zobrazení v počítačové grafice
17
Obr. 5: Koule vykreslená pomocí konstantního stínování. Každá plocha má stejný odstín a hrany mezi plochami jsou proto zřetelné na první pohled (wikipedia.org, 2008h).
Tato metoda je založena na bilineární interpolaci barev. Tu chápeme jako „rozšíření lineární interpolace pro interpolaci funkcí dvou proměnných v pravoúhlé soustavě. Myšlenka spočívá v interpolaci nejprve v jednom směru a poté v druhémÿ (wikipedia.org, 2008g). Zatímco při konstatním stínování vycházíme z normálových vektorů ploch, při tomto stínování potřebujeme „normály vrcholůÿ. Tyto vektory vypočteme jako kombinaci normál všech ploch, ke kterým dotyčný vrchol patří. Tak bude mít každý vrchol polygonu jiný „normálový vektorÿ. Barva je potom přiřazena bodu, ne ploše, a pomocí bilineární interpolace (viz obrázek 7) je vypočtena barva všech bodů v polygonu. Díky interpolaci se při zobrazení nezobrazují hrany mezi plochami a zobrazený objekt je hladší a věrohodnější. Nedostatkem Gouradova stínování je neschopnost korektně počítat s odlesky světla (wikipedia.org, 2008f).
Obr. 6: Dvě koule vykreslené pomocí lepšího Gouraudova stínování se zvýrazněnými hranami. Vlevo koule s velmi nízkým počtem ploch, interpolace je znatelnejší, vpravo koule s vysokým počtem ploch, stínování je důveryhodnější (wikipedia.org, 2008f).
Algoritmus Gouraudova stínování v pseudokódu: pro každou plochu objektu{ vypočti normálový vektor }
2.1
Prostorové zobrazení v počítačové grafice
18
pro každý vrchol{ vypočti NV jako kombinaci NV okolních ploch vypočti odchylku NV od paprsků světla přiděl barevný odstín vrcholu } pro každý bod všech ploch\{ proveď bilineární interpolaci barev vrcholů }
Obr. 7: Postup při bilineární interpolaci. Nejprve provedeme interpolaci barev rovnoběžnou s osou x po hranách Q11 Q21 a Q12 Q22 . Tím zjistíme barevný odstín v bodech R1 a R2 . Poté provedeme interpolaci barvy po hraně R1 R2 a zjistíme barevný odstín v bodě P (wikipedia.org, 2008g).
Phongovo stínování Phong v roce 1975 vydal svůj slavný článek „Illumination for Computer Generated Picturesÿ (Osvětlení pro počítačem generované obrazy) v časopise Communications of the ACM. V této práci zveřejnil popisy algoritmů svého „vylepšenéhoÿ stínování. Při své práci totiž vycházel z Gouraudovy metody. Phongovo stínování také používá bilineární interpolaci (obrázek 7), ale narozdíl od Gouraudova neinterpoluje barvy v každém zobrazeném bodě objektu, ale interpoluje normálové vektory zjištěné ve vrcholech. To je početně mnohem náročnější a tedy pomalejší, ale výsledky jsou věrohodnější. Zvláští případ nastává například v situaci, kdy je plocha natočena kolmo ke zdroji světla. Při Gouradově stínování díky interpolaci „vrcholových normálÿ dostaneme dva vektory stějně odýchlené od vektoru osvětlení, proto bude celá plocha mezi nimi mít stejnou barvu. Naproti tomu při použití Phongova stínování tyto dva vektory interpolují a každý bod v ploše bude mít odlišný odstín, přičemž nejsvětlejší budou body uprostřed, tedy tam, kde je plocha skutečného (ne aproximovaného) tělesa opravdu kolmá na vektor osvětlení.
2.2
OpenGL
19
Tyto rozdíly jsou nejvíce patrné při dynamických scénách a proto je tam Phongova metoda výrazně vhodnější. Pseudokód algoritmu Phongova stínování: pro každou plochu objektu{ vypočti normálový vektor } pro každý vrchol{ vypočti NV jako kombinaci NV okolních ploch } pro každý bod všech ploch{ proveď bilineární interpolaci vektorů vypočti odchylku NV od paprsků světla přiděl barevný odstín bodu }
Obr. 8: Koule vykreslená za použití Phongova stínování (wikipedia.org, 2008h).
Obr. 9: Srovnání všech tří způsobů stínování. Vlevo konstantní, uprostřed Gouraudovo a vpravo Phongovo stínování (The Computer Desktop Encyclopedia, 2009).
2.2
OpenGL
Grafická knihovna OpenGL (Open Graphics Library) byla vyvinuta v roce 1992 firmou SGI (Silicon Graphics Inc.). „Aplikační programové rozhraní OpenGL je přední prostředí pro vývoj přenosných, interaktivních 2D a 3D grafických aplikací. Nízkoúrovňové, hardwarově
2.2
OpenGL
20
nezávislé softwarové rozhraní OpenGL API (Application Programming Interface) je často nazýváno „assembler počítačové grafikyÿ. Kromě nesmírné flexibility a funkčnosti poskytují OpenGL aplikace nejširší platformní využití v celém odvětví. Mnohé aplikace v odvětví CAD, energetiky, zábavy, vývoje her, průmysl, zdravotnictví a VRML využívají platformní nezávislost a vysokou funkčnost OpenGL APIÿ (sgi.com, 2008a). OpenGL je standardem, tedy dokumentem, který popisuje sadu funkcí a přesný popis činností, které jednotlivé funkce vykonávají. To, že je open (otevřený) znamená, že jeho autor pouze dohlíží na dodržování ostatními tak, aby implementace přesně splňovaly požadavky specifikace a nutně nemusí být autorem implementace na konkrétní platformu. Implementace na různé operační systémy a platformy zajišťují výrobci grafického hardware. V současnosti je OpenGL možno používat na všech rozšířených platformách, Mac OS, MS Windows, OS/2, Linuxy, množství UNIXů a další. OpenGL lze použít také v případě, že daná platforma žádným grafickým akcelerátorem nedisponuje. V tomto případě se použije jeho softwarová emulace, která je ale pochopitelně pomalejší (Tišnovský, 2003a). Za účelem co možná nejvyšší systémové nazávislosti OpenGL nedisponuje žádnými nástroji pro práci s okny nebo tvorbu GUI (Graphical User Interface – grafické uživatelsk rozhraní) nebo zpracování událostí. K tomuto slouží softwarové nástavby OpenGL jako například GLUT (OpenGL Utility Toolkit), GLAUX (OpenGL Auxiliary Library), Qt firmy Trolltech a některé další. 2.2.1
OpenGL a další grafické knihovny
Následující část práce pojednává o srovnání těchto několika základních nástrojů pro tvorbu 3D grafiky. Autor si neklade za cíl dokonalé srovnání technologií a rozhodnutí pro lepší technologii, jde o výčet hlavních rysů a rozdílu. Nejprve jsou srovnány API OpenGL a DirectX, dále je věnována část Open Inventoru a XNA. OpenGL vs DirectX Nejvýraznějším konkurentem OpenGL je technologie DirectX (respektive jeho část Direct3D, která se zabývá 3D grafikou) společnosti Microsoft Corporation. Problémem, na který můžeme narazit při případném srovnávání, je i skutečnost, že obě těchnologie jsou založeny na rozdílné myšlence. „Vlastnosti, kterými disponuje DirectD3, jsou odvozeny od vlastností, které poskytuje konkrétní hardware. Direct3D očekává od aplikace správu hardwarových zdrojů, OpenGL vytváří implementaci, která to uděláÿ (wikipedia.org, 2008b). OpenGL je vydáváno jako svobodný software, kdežto DirectX je patentovaným softwarem společnosti Microsoft. S tím také souvisí rozšířenost těchto dvou technologií. DirectX je vázán na produkty Microsoft, tedy operační systémy Windows a herní konzole Xbox. To samozřejmě nevyhovuje jak vývojářům her, tak výrobcům grafických karet. OpenGL, jak už bylo řečeno, je nezávislé jak na hardware, tak
2.2
OpenGL
21
na operačním systému, a proto jej lze použít kromě Windows také na jakémkoliv UNIXu, Linuxu, Mac OS, OS/2, a jak uvádí (wikipedia.org, 2008b), je používáno také na herní konzoli PlayStation 3. Modifikovanou variantu OpenGL podporují Nintendo GameCube a Wii a také handheldy Nintendo DS a PlayStation Portable. Všechny operační systémy, které podporují hardwarově akcelerovanou 3D grafiku (s výjimkou Windows a Xbox), používají OpenGL jako svoje primární 3D GAPI (grafické API). V případě, že chcete aplikaci nejen pro Windows, připadá v úvahu pouze OpenGL. Co se týče podpory obou API programovacími jazyky, DirectD3 je určen pro C++, C#, případně Javu. Rozhraní OpenGL je vytvořeno tak, aby k němu bylo možno přistupovat prakticky pomocí jakéhokoli programovacího jazyka. Primární hlavičkový soubor je pro jazyky C a C++. S časovým vývojem souvisí to, že DirectX je od začátku objektový, OpenGL je, mj. historicky, procedurální. OpenGL tradičně došlo využití více u profesionální grafiky, DirectD3 se zaměřilo výhradně na hry. Většina profesionálních grafických karet v minulosti podporovala pouze OpenGL a až v poslední době někteří výrobci dodávají karty s podporou obou rozhraní (ddworld.cz, 2007). Direct3D API je dnes, jako většina produktů Microsoftu, pevně svázána s Windows. Open Inventor V roce 1989 začala společnost SGI vývoj nástroje IRIX Inventor. Tento nástroj měl umožnit vytvářet 3D grafiku jednodušeji než OpenGL samotné. Zatímco OpenGL se koncentruje na rychlost a výkon, myšlenkou Inventoru byla jednoduchost použití pro programátory před výkonem. Mottem Inventoru se stalo označení „3D programování pro lidiÿ (wikipedia.org, 2008c). Open Inventor je objektově orientovaný a (stejně jako OpenGL) platformně nazávislý nástroj pro tvorbu 3D grafiky. Jak už bylo řečeno, OpenGL pracuje na systémové úrovni a objekty vykresluje jako série geometrických primitiv co možná nejrychleji. Nicméně je pro programátora právě pro svou nízkoúrovňovost poměrně nepohodlné. Open Inventor „posunuje programátora od primitivního OpenGL rozhraní na vyšší úroveň a nabízí mu rozsáhlou množinu C++ tříd. Ta podstatně zjednodušuje práci programátora a dokonce často (díky jistým optimalizacím) poskytuje vyšší výkon než přímá implementace v OpenGLÿ (Pečiva, 2003). Programy psané v objektovém Open Inventoru jsou ale většinou o něco pomalejší než ručně psané programy. Dalším praktickým problémem je fakt, že „Open Inventor umí pracovat pouze s vlastním formátem souborů, což donutilo programátory napsat konvertory z a do ostatních formátůÿ (wikipedia.org, 2008c). XNA 24. března 2004 byl na Game Developers Conference v San Jose v Californii uveden nový produkt společnosti Microsoft. Nese název XNA (XNA’s Not Acronymed) a byl představen jako velká pomůcka při programování her. To, že Microsoft si od XNA už od začátku sliboval hodně, dokazoval například i jeden z výroků, které při té příležitosti pronesl Bill Gates, zakladatel a tehdejší šéf Microsoftu: „Tento software bude nejmocnějším nástrojem v oblasti digitální zábavy příštího desetiletíÿ
2.3
Stereoprojekce
22
(Microsoft Inc., 2004). XNA je první free nástroj, který umožňuje psát hry jak pro PC, tak pro herní konzole, konkrétně Xbox a Xbox 360 (Lamr, 2007, s. 5). XNA je technologie založená na .NET Compact Framework 2.0 pro Xbox 360 (wikipedia.org, 2008d). Lze pro ni programovat prakticky v jakémkoli .NET jazyce, ale oficiálně je podporováno pouze C# a vývojové prostředí Visual C# Express (Microsoft Inc., 2008). XNA je prezentováno jako platformně nezávislá technologie („cross-platformÿ) (Microsoft Inc., 2004). To ale znamená, že je použitelná na všech platformách Windows a Xbox. Nicméně, aplikace kompilovány XNA Frameworkem jsou překládány do jazyka Common Intermediate Language (CIL), což je „mezikód (bytekód) spustitelný libovolnou implementací Common Language Runtime (CLR)ÿ (Lamr, 2007, s. 5). Ten je do Windows překládán právě .NET Frameworkem. CLR překladač pro jiné platformy vyvíjí společnost Novell pod názvem Mono. Projekt Mono.XNA tedy řeší převod XNA her do jiných platforem, 3D akcelerace probíhá samozřejmě pomocí OpenGL.
2.3
Stereoprojekce
„Virtuální realita je takové rozhraní mezi člověkem a počítačem, které zahrnuje simulace v reálném čase a interaktivitu díky množství smyslových kanálů. Ty mohou být zrakové, sluchové, hmatové, čichové a chuťovéÿ (Burdea a Coiffet, 2003). Lidské smysly se automaticky brání přijmout prezentovanou virtuální realitu za skutečnou. Je to proto, že se často liší od reality a neodpovídá tedy jejich dosavadním zkušenostem. Přesto lze za znalosti některých principů, jak mozek vnímá například zrakové a sluchové vjemy, realitu napodobit relativně věrně. Lidské oči jsou od sebe průměrně vzdáleny 5-7 centimetrů. Právě díky tomu, že máme dvě oči, a díky této vzdálenosti můžeme vnímat svět kolem nás prostorově. Každým okem jde do mozku drobně posunutý obraz a oba dva tyto obrazy jsou v mozku spojeny a my je vnímáme trojrozměrně. Stejně tak dvě uši a to, že jsou na opačné straně hlavy nám pomáhá nejenom vnímat směr, ze kterého zvuk přichází (ve všech třech směrech) ale také vzdálenost zdroje zvuku nebo velikost prostoru, ve kterém se nacházíme (Tonnesen a Steinmetz, 2009). Následující příklad i s obrázkem 10 je převzat z knihy Virtual Reality Technology (Burdea a Coiffet, 2003, s. 58, 59). Mějme objekt A, který je za objektem B. Oči zaostřují na objekt B, konkrétně na jeho bod F. Úhel mezi osou pohledu a spojnicí oka a bodu F určuje úhel sbíhavosti. Teto úhel je ovlivněn také vzdáleností obou očí. Tato vzdálenost je nazývána IPD (Interpupillary Distance - mezioční vzdálenost). Čím větší IPD je, tím vytší je úhel sbíhavosti. v důsledku jiné pozice k oběma očím se bod F jeví každému oku jinak – horizontálně posunut. Toto posunutí se nazývá paralaxa a prostředky VR ho musí napodobit, aby pomohly mozku s vnímáním hloubky v simulovaném prostředí. Proto potřebujeme zobrazovat dva vzájemně posunuté obrazy. Na obrázku vpravo je vidět, jak vnímá objekty A a B a bod F levé oko a jak pravé.
2.3
Stereoprojekce
23
Obr. 10: Fyzický model prostorového vidění. Mezioční vzdálenost (IPD), úhel sbíhavosti (convergence angle), paralaxa (parallax). Vpravo nahoře je obraz, jak scénu vnímá levé oko, vpravo dole scéna vnímaná pravým okem (Burdea a Coiffet, 2003, s. 59).
2.3.1
Hardwarové prostředky
Následující část se zabývá výstupními hardwarovými prostředky, používanými pro stereoprojekci. Základní problém, kterému stereoprojekce čelí, je, jak promítat dva oddělené obrazy každému oku zvlášť. Existují dva základní přístupy, jeden používá dvě zobrazovací plochy, z nichž každou vidí pouze jedno oko, druhý přístup zobrazuje oba dva obrazy na jednu plochu a řeší, jak zajistit vnímání obrazu každým okem zvlášť. K prvnímu přístupu patří HMD (Head Mounted Displays – displeje připevněné na hlavě), které mají podobu brýlí se dvěma displeji místo skel. Výhodou je, že do každého z nich jde obraz určený pouze konkétnímu oku, nevýhodou je jednak malá velikost obrazu, jednak případná nepohodlnost při větších velikostech displejů. Druhá přístup promítá oba obrazy naráz, ať už na stereoskopický displej, projekční plochu, (rovnou, zaoblenou, vydutou) případně několik ploch tvořící (i částečně) uzavřené prostředí. Pozorování je umožněno stereoskopiskými brýlemi. Tato kategorie se dále dělí na autostereo, aktivní a pasivní stereo. Autostereoskopické displeje mají samy o sobě schopnost zobrazovat dva obrazy naráz. Je v nich většinou použita jedna ze dvou základních technologií, a to buď lenticular lenses (čočky) nebo parallax barrier (překážky). Pokud má pozorovatel hlavu (oči) v určité poloze vůči displeji, uvidí na displeji kazdým okem jiný obraz. V případě paralaxové bariéry je před displej umístěna vrstva tekutých krystalů složená
2.3
Stereoprojekce
24
z přesně rozřezaných pruhů, které umožňují vnímat každým okem jiný obraz. Čočkovité čočky jsou vrstva vypouklých čoček, které zvětšují z každého úhlu jiný obraz. Nevýhodou je nutná přesná pozice hlavy, výhodou je absence brýlí nebo jakýchkoli dalších pomůcek.
Obr. 11: Dvě technologie užívané při autostereu, paralax barrier a lenticular lenses (Review Spring, 2009).
Do druhé kategorie, aktivního sterea, patří použití takzvaných shutter glasses – zatmívacích brýlí, které pomocí polopropustných zorníků vyrobených na základě tekutých krystalů (Žára, 2004, s. 529) střídavě zatmívají obě oči. Brýle jsou synchronizovány se zobrazovacím zařízením, které ve chvíli, kdyz je propustné levé oko, vysílá obraz pro levé oko a naopak. Nevýhodou je to, že každé oko dostává pouze polovinu signálů, a proto až na vysoké frekvence je přepínání znatelné. Proto je při použití aktivního sterea nutné použít projektory s vysokou obnovovací frekvencí. U pasivního sterea jsou obrazy odděleny pomocí filtrů. Těch může být opět několik druhů. Nejjednodušší je použití barevných filtrů, kdy obraz pro každé oko vykreslíme v odstínech jiné barvy (nejčastější kombinace je červená a modrozelená). Takovému obrazu se říká anaglyf. Nevýhodou je, že můžeme trojrozměrné objekty vykreslovat pouze v těchto dvou barvách. Jako superanaglyf je někdy označována technika Infitec (INterference FIlter TEChnology) (wikipedia.org, 2009). Tato technologie je pokročilejší technikou založenou na stejném principu. V brýlích i v projektorech jsou speciální filtry, které světlo rozdělí na šest jeho složek, pro každý barevný kanál dvě. Podrobněji to ukazují obrázky 12 a 13. Posledním běžně používaným způsobem je polarizace světla. Při využití lineární polarizace jsou paprsky světla nesoucí informaci pro jedno oko polarizovány svisle a pro druhé oko vodorovně. V brýlích jsou polarizační filtry, které propustí jenom příslušně polarizované světlo. Tento princip je používán v kinech IMAX 3D. V případě použití radiální polarizace jsou použity dvojice optických izomerů, které jsou schopné natáčet polarizované světlo. Světelné vlnění z projektoru je natočeno jedním izomerem o určitý úhel, filtr v příslušném sklíčku brýlí jej natočí zpět. Výhodou
2.3
Stereoprojekce
25
Obr. 12: Infitec filtry rozdělující spektrum na dvě části určené jednotlivým očím. Filtry jsou zobrazené jako plná a tečkovaná čára. (Barco, 2009)
Obr. 13: Obraz po rozdělení filtrem. Vlevo informace pro levé oko, vpravo informace pro pravé oko. (Barco, 2009)
oproti lineárnímu polarizování je, že nezáleží na tom, jestli jsou brýle ve vodorovné poloze či nikoliv.
Obr. 14: Brýle pro stereoprojekci. Vlevo červeno-modré brýle pro anaglyf, uprostřed lineárně polarizované brýle a vpravo shutter-glasses pro aktivní stereoskopii (Santos Human, 2009).
Při vysílání dvou odlišných obrazů za účelem realistického vnímání pochopitelně nastává problém s ideální polohou pozorovatele. Ta je přibližně uprostřed promítací plochy. Pokud je pozorovatel na jiném místě, dostává se mu více či méně zkreslenému obrazu, v závislosti na jeho poloze. Existují ale zařízení, které umožňují detekovat polohu pozorovatele a díky tomu je možno obrazy posunovat, aby pro něj byl výsledný vjem stále realistický. Tato zařízení se nazývají trackery pohybu a pojednává o nich následující kapitola. V laboratoři Virtuální reality na MZLU – Virtuality je využíváno stereoskopické projekční plátno se dvěma DLP (Digital Light Processing) projektory Projection
2.3
26
Stereoprojekce
Design s filtry Infitec a pro nedostatek místa zrcadlo. Brýle pro pozorování plátna mají taktéž filtry Infitec. 2.3.2
Stereoprojekce v OpenGL
Vykreslování v OpenGL probíhá pomocí takzvaného framebufferu, který se skládá z několika dílčích bufferů určených pro různé specifické operace. Těchto bufferů jsou čtyři druhy, a to color buffery, depth buffer, stencil buffer a accumulation buffer. Tyto buffery jsou vytvářeny metodou glutInitDisplayMode(), která je součástí OpenGL smyčky programu. Pro většinu z nich existuje více variant. Barevné buffery v režimu RGB se vytváří pomocí parametru GL RGB. Při vytvoření jediného barevného bufferu je při překreslování scény znatelné přeblikávání, proto se používá double buffering (GL DOUBLE). Tím vzniknou dva barevné buffery – zadní buffer (back buffer – GL BACK) sloužící pro vykreslování a přední buffer (front buffer – GL FRONT), který je zobrazen uživateli. Tyto buffery se pomocí funkce glutSwapBuffers() prohodí při každém překreslení scény. V případě steroprojekce je funkce glutInitDisplayMode() volána navíc s parametrem GLUT STEREO, a tím se všechny barevné buffery zdvojí, vzniknou buffery pro levé a pravé oko s názvy GL FRONT RIGHT, GL FRONT LEFT, GL BACK RIGHT a GL BACK LEFT. V OpenGL smyčce je tedy hlavní funkce zároveň s funkcemi registrujícími funkce volané při překreslování, vstupech z myši a klávesnice, volána funkce glutInitDisplayMode(GLUT RGBA|GLUT DOUBLE|GLUT STEREO|GLUT DEPTH). Ve vykreslovací funkci, která ja volána při každém překreslení scény, dochází k samotnému vykreslování a výměně bufferů. Nejdříve je nastaven buffer, do kterého se bude vykreslovat pomocí funkce glDrawBuffer(). Poté jsou volány všechny potřebné funkce zajišťující například vymazání minulého obsahu bufferu, nastavení perspektivy, osvětlení, označení matice, která se bude upravovat, a některé další. Pohled jednotlivých očí je nastavován funkcí gluLookAt(). Tato funkce má 9 GLdouble parametrů, z nichž první tři určují pozici „okaÿ, další tři určují pozici referenčního bodu a poslední tři určují {up vector, tedy vektor, který směřuje vzhůru ve scéně. Poté následují příkazy pro vykreslení scény a příkaz glFlush(), který zajistí vykonání všech předešlých příkazů. Poté je nastaven druhý zadní buffer a vše probíhá opět pro druhé „okoÿ. Na konci jsou zadní buffery prohozeny s předními funkcí glutSwapBuffers(). Celá vykreslovací funkce může v pseudokódu vypadat následovně: glDrawBuffer(GL\_BACK\_LEFT); vymaž buffer, nastav matici gluLookAt(-0.08, 0.0, 6.0, -0.08, 0.0, 6.0, vykresli scénu pro levé oko; glFlush();
0.0, 1.0, 0.0);
2.4
27
Motion tracking
glDrawBuffer(GL\_BACK\_RIGHT); vymaž buffer, nastav matici gluLookAt(0.08, 0.0, 6.0, 0.08, 0.0, 6.0, vykresli scénu pro pravé oko; glFlush();
0.0, 1.0, 0.0);
glutSwapBuffers(); Hodnoty předávané jako parametry funkci gluLookAt() byly zjištěny empiricky v závislosti na posunutí scény. Pro dosažení realistického zobrazení je nutné, aby spojnice mezi okem a referenčním bodem, tedy bodem, na který se oko dívá, byly pro obě oči vzájemně rovnoběžné. Důležité je také to, že vykreslovaná scéna pro levé a pravé oko se nijak neliší.
2.4
Motion tracking
Virtuální realita byla v předchozí části práce definována jako prostředí umožňující interaktivitu s uživatelem v reálném čase. Ta je umožněna na základě vstupích zařízení, která snímají uživatelův pohyb, jeho polohu, gestikulaci, případně jeho hlasové příkazy. Zařízení umožnující snímat polohu a pohyb ve virtuální scéně se nazývají trackery. Jejich umístění záleží na účelu trackování. Často bývají umístěny na HMD či stereoskopických brýlích, aby sledovaly pozici uživatelových očí a scéna (obraz, zvuk) se tak mohla měnit v závislosti na poloze uživatele. Ovládací zařízení ve VR, alternativy počítačových myší – controllery – také obsahují trackery pohybu za účelem intuitivního ovládání aplikace. Objekt pohybující se v trojrozměrném prostoru má šest možností pohybu (six degrees of freedom – 6 DOF). Je to pohyb ve třech směrech a rotace kolem tří os – kolem osy x (roll), osy y (pitch) a osy z (yaw). Těchto šest údajů determinuje pozici a orientaci objektu v prostoru. 2.4.1
Hardwarové prostředky
Trackovací zařízení se sestává ze dvou částí, z nichž jedna je umístěna stabilně a jedna se pohybuje se sledovaným objektem. Která část je která, záleží na použité technologii. Těch je několik. V první řadě jsou to trackery mechanické, u nichž je trackování realizováno za pomoci mechanického ramene, případně kostry připevněné na tělo uživatele. Výhodou je rychlost a přesnost, nevýhodou je nepohodlnost a omezení v pohybu, případně omezení na dosah ramene. Dále jsou to technologie založené na bezkontaktním trackování. Jsou to hlavně trackery elektromagnetické, akustické a optické, případně gyroskopové (intertial) a hybridní. Trackery elektromagnetické jsou založeny na měření síly magnetického pole, které vzniká elektrickým proudem procházejícím třemi malými cívkami umístěnými vzájemně kolmo. Tyto tři cívky jsou vloženy do objektu, který chceme snímat. Každou cívkou prochází elektrický proud, a ta se chová jako elektromagnet. Postupným
2.4
Motion tracking
28
Obr. 15: Možnosti rotace kolem tří os určující orientaci pozorovatele v prostoru (How Stuff Works, 2009).
Obr. 16: Streoskopické displeje v kombinaci s ramenem umožnujícím mechanické trackování (Santos Human, 2009).
aktivováním každé z cívek a měřením vznikajícícho magnetického pole na nich je možné určit jejich polohu a orientaci v prostoru. Nevýhodou elektromagnetického trackování je rušení feromagnetickými předměty, které jsou v dosahu, a omezení pohybu potřebnými kabely. Akustické trackery pracují na bázi ultrazvuku. Signály jsou zpracovávány buď na základě „času letuÿ, nebo „fázové koherenceÿ. Při použití akustického trackování jsou z vysílačů umístěných nejčastěji na stropě vysílány ultrazvukové signály, které jsou přijímány přijímači. Pro zjižtějí polohy a orientace se tracker skládá nejméně ze 3 přijímačů, které jsou ve tvaru rovnostranného trojúhelníka připevněny na sledovaném objektu. Pro sledování je nezbytné, aby byly přijímač a vysílač signálu „na dohledÿ. Při použití času letu (time-of-flight) je v přijímači také infračervený trigger, který koordinuje vysílání signálů z jednotlivých vysílačů. Díky třem přijímačům je poloha přesně určena. Při použití fázové koherence (phase-coherence) je poloha zjištována na základě šíření zvuku vlněním a znalosti velikosti vlny zvuku. Při pohybu se fáze mění, protože zvuk potřebuje jiný čas, aby dorazil k objektu. Vý-
2.4
Motion tracking
29
hodou akustického trackování je malá velikost trackovacího zařízení, takže nedochází k žádnému omezování v pohybu, akustické signály nejsou nijak ovlivněny okolními předměty, jak je tomu u elektromagnetického trackování. Nevýhodou je nutná absence překážek mezi vysílačem a prijímačem. Vzhledem k tomu, že v sinusoidě jsou dvě místa se stejnou hodnotou, při metodě fázové koherence vvznikají chyby, které mají tendenci se v čase sčítat. Optické trackery pracují na základě infračerveného světla. Ve stálé pozici v prostoru je umístěno několik infradiod společně s infrakamerami a na sledovaném objektu jsou umístěny kuličky z reflexního materiálu, který světlo z diod odráží zpět kamerám. Pohyblivá část trackeru se skládá ze 4 kuliček, které jsou umístěny na tyčinkách a mohou být připevněny na HMD nebo na obládací zařízení (controller, pero). Výhodou je nízká hmotnost a malá velikost pohyblivé části, která tak uživatele nijak neomezuje. Nevýhodou je opět nutný „dohledÿ vysílače na pohyblivou část a také možné chyby způsobené odrazem od stěn prostředí.
Obr. 17: Infračervená kamera (dole) s přijímačem (nahoře) (iotracker, 2009a).
Obr. 18: Pohyblivá část trackeru může být umístěna na HMD (vlevo) nebo na ovládacím zařízení (vpravo) (iotracker, 2009b).
2.4.2
API TrackD
V laboratoři Virtuální reality na MZLU – Virtuality je pro tracking používán elektromagnetický tracker Flock of Birds od firmy Ascension. Jedno přijímací zařízení je
2.4
Motion tracking
30
připevněno na brýlích a druhé v controlleru Wanda 3D Navigator/Pointer od stejné firmy. Softwarovou stránku trackování řeší program TrackD od firmy Mechdyne. Deamon (program běžící na pozadí systému) TrackD umožňuje příjem informací z trackovacích zařízení a jejich další zpracování pomocí TrackD API. Toto API poskytuje Mechdyne pro nekomerční použití zdarma. Je realizováno hlavičkovým souborem trackdAPI c.h a dynamickou knihovnou trackdAPI MT.dll. Funkce obsažené v hlavičkovém souboru umožňují přístup do sdílené paměti, a tak je možno předávat polohu předmětu a dále s ní pracovat. Pro přístup ke sdílené paměti je potřeba znát shmKey trackeru (SHared Memory KEY - sdílený paměťový klíč), který lze zjistit v konfiguračním souboru programu. V hlavičkovém souboru jsou funkce jak pro tracker, tak pro Controller. První dvojice funkcí void* trackdInitTrackerReader (int shmKey) a void* trackdInitControllerReader(int) slouží pro zahájení komunikace se zařízením. Vrací ukazatel do sdílené paměti, se kterým pracují následně všechny ostatní funkce. Pokud pointer není vytvořen, aplikace nemůže s trackerem komunikovat . Funkce int trackdGetNumberOfSensors (void* tracker) pro tracker zjištuje počet sensorů, se kterými je pracováno. Funkce int trackdGetNumberOfValuators (void* controller) a int trackdGetNumberOfButtons (void* controller) pro controller zjišťuje počet valuátorů a počet tlačítek na ovládacím zařízení. Další funkce void trackdGetPosition (void* tracker, int id, float* pos) a void trackdGetEulerAngles (void* tracker, int id, float* orn) slouží pro předávání pozice a polohy konkrétního trackeru (6 DOF). Transformační matici trackeru zjišťuje void trackdGetMatrix (void* tracker, int id, float mat[4][4]). Poslední dvě funkce, float trackdGetValuator (void* controller, int id) a int trackdGetButton (void* controller, int id), vrací hodnotu valuátoru (při pohybu joystickem) a zmáčknutého tlačítka.
Obr. 19: Tracker pohybu Flock of Birds od firmy Ascension (Inition, 2009).
2.4.3
TrackD v OpenGL
OpenGL (GLUT) standartně podporuje vstup myši a klávesnice, pomocí časovací callback funkce ale lze umožnit komunikaci i s trackerem, který není
2.4
Motion tracking
31
Obr. 20: Controller Wanda 3D Navigator/Pointer od firmy Ascension (Virtual Realities, 2009).
standartně podporován. Funkce void timer(int tick) je pomocí funkce void glutTimerFunc (unsigned int msecs, void (*func)(int value), value) rekurzivně volána po celou dobu komunikace s trackovacím zařízením. Do inicializační funkce void Init(void) je vložen následující kód: glutTimerFunc(interval obnovování, časovací funkce, hodnota předávaná časovací funkci); tracker.init(shmKey trackeru); controller.init(shmKey controlleru); Při stisknutí levého tlačítka controlleru je aktivováno otáčení objektu v závislosti na orientaci controlleru. Pohyb joysticku controlleru objekt přibližuje nebo oddaluje. Samotná časovací funkce vypadá následovně: void timer(int tick){ pokud je stisknuto levé tlačítko, otáčej objekt v~závislosti na poloze controlleru pokud je pohybováno joystickem, pohybuj objektem po ose y glutPostRedisplay(); glutTimerFunc(timerInterval, timer, 1); } Hodnota timerInterval je volena tak, aby docházelo k dostatečně častému obnovování, empiricky byla určena na 50 (ms), což znamená 20 obnovení za sekundu.
2.5
2.5
Shrnutí teoretických poznatků
32
Shrnutí teoretických poznatků
Tato část stručně shrnuje dosud uvedené teoretické informace a měla by vypíchnout podstatné vlastnosti jednotlivých přístupů, jejich výhody či nevýhody. Reprezentace objektu může být buď hraniční (drátěný model nebo TIN), objemová (data z CT nebo MR) nebo procedurální (fraktály). Výhodou hraniční je její rychlost, výhodou procedurální je její relativní jednoduchost a naprostá přesnost. Nevýhodou procedurální je naopak náročnost, proto se při zobrazování přvádí na hraniční. Pro osvětlování se používá Phongův osvětlovací model. Rozděluje světlo na tři složky, ambientní (všudypřítomné) světlo, určující tmavost objektu, difůzní (rovnoměrně odražené) světlo, určující barvu objektu a složka odlesků, která určuje, jak lesklý je povrch objektu. Přes svou rychlost dosahuje věrohodných výsledků zobrazení. Existují další koncepty osvětlení, ty jsou ale složitější a tedy pomalejší. Nejjednodušší metodou stínování je konstatntní stínování, při kterém je každé plošce přiřazeny jedna barva na základě normálového vektoru. Výhodou je rychlost, nevýhodou je relativní nevěrohodnost. Složitějšími metodami jsou interpolační, u kterých jsou barvy přiřazovány jednotlivým bodům na základě interpolace normálových vektor ve vrcholech. Phongovo stínování je nejrealističtější, ovšem také nejnáročnější. OpenGL je nizkoúrovňové grafické rozhraní pro tvorbu 2D a hlavně 3D grafiky. Je platformně nezávislé, přenositelné prakticky do každého programovacího jazyka, primárně určené pro C a C++. Stereoprojekce je způsob vizualizace, při kterém dochází k oddělení a zobrazení dvou obrazových kanálů, aby po spojení mohly být uživatelem vnímány jako skutečné. Obrazy můžeme promítat buď na dvě plochy, nebo na jednu a nějakým způsobem je rozdělit. Tento druhý způsob je rozšířenější. Autostereoskopie upravuje samotný displej tak, aby každému oku byla promítaná jiná informace. Aktivní stereo používá uzávěrkové brýle a synchronizuje je s projektorem. Nevýhodou je nutnost vysoké obnovovací frekvence projektoru, protože je potřeba dvojnásobný počet obrázků. Pasivní stereo používá filtry v brýlích. Jsou to buď barevné filtry, technologie Infitec nebo polarizované sklo. Jako jeden ze způsobů, jak získat od uživatele virtuální reality zpětnou vazbu, je používán takzvaný tracking pohybu a polohy. Tracking může být mechanický, jeho nevýhodou je omezování pohybu uživatele, pohyb omezuje svými kabely do jisté míry i tracking elektromagnetický. Optický tracking je založený na infračerveném záření emitovaném diodami, které je odráženo pevnými kuličkami a zpět snímáno kamerami. Toto shrnutí základních informací je dále rozpracováno v kapitole Metodika, kde se autor přímo zamýšlel nad vhodností jednotlivých technologií pro aplikaci, kterou později implementoval.
3
3
METODIKA
33
Metodika
Cílem práce je vytvořit aplikaci, která umožní vizualizaci výstupu 3D scanneru ve stereoprojekci. Následující část je popisem výběru technologií a postupů použitých při plnění cíle. Přestože je aplikace implementována ve Windows, jako grafické API bylo zvoleno vzhledem k platformní nezávoslosti OpenGL. Jak už bylo uvedeno dříve strana 21), základní hlavičkové soubory OpenGL jsou C a C++. Z těchto tvou jazyků bylo vybráno C++ kvůli objektům. Výstupem ze scanneru je soubor, který obsahuje souřadnice bodů povrchu scanovaného předmětu. Optický scanner, který je používán, je možno zjednodušeně popsat jako přístroj, který promítá na scanovaný předmět posunující se proužky světla, jejichž pohyb je snímán pomocí dvou CCD kamer. Následně je vypočítána poloha sledovaného bodu v prostoru, podobně jako je to u optického trackování (strana 29). Výstupem je soubor, ve kterém jsou ve spirále uloženy souřadnice bodů povrchu bodu. Zobrazení povrchu tělesa pomocí těchto bodů může probíhat v zásadě dvěma způsoby, a to vykreslením pomocí parametrických ploch (ať už interpolačních nebo aproximačních) nebo pomocí sítě TIN (strana 9). V OpenGL lze dosáhnout obojího, implementace ploch je ovšem o poznání složitější. Empiricky bylo zjištěno, že síť bodů je natolik hustá, že v případě že bude vykreslen povrch pomocí sítě TIN a bude použito vhodné osvětlení a stínování (Goraudovo – strana 16), bude těleso vykresleno reálně. Aby bylo možno objekt vizualizovat, musí být program schopen soubor načíst. Poté body převede na trojúhelníkovou síť a k tomu použije buď vlastní metody, nebo ji vytvoří pomocí již hotového algoritmu. V tomto případě ideálně pomocí API, automatizovaně, případně manuálně, vlastní program by tedy načítal již přímo předem vytvořenou trojúhelníkovou síť. Je nutné, aby bylo program možno ovládat pomocí klávesnice, myši a v případě zobrazení ve virtuální realitě také pomocí controlleru. OpenGL disponuje v nástavbové knihovně funkcemi, které umožňují komunikaci s těmito vstupními zařízeními, v případě controlleru je možné řešení uvedeno na straně 30. GLUT umožňuje také rozříření interaktivity programu o menu. Pomocí něho je možné například měnit osvětlení nebo stínování. Aplikace bude vytvořena tak, aby podporovala stereoprojekci, jak to bylo vysvětleno na straně 26 a ovládání pomocí controlleru přes API TrackD (strana 29). Zavedeným způsobem ovládání je, že pomocí levého tlačítka myši lze objektem otáčet a pomocí pravého tlačítka objekt přibližovat nebo oddalovat. V případě controlleru joystick přibližuje a oddaluje. Levé tlačítko ve spojení s pohybem trackeru v controlleru objektem otáčí. V případě, že je k aplikaci připojeno menu, může být navázáno na prostřední tlačítko (kolečko) myši. Jedním z využití aplikace je možnost srovnání dvou objektů na vstupu. Tím, že budou moci být zobrazeny paralelně, bude možné je porovnat a zjistit případné
3
METODIKA
34
rozdíly. Pro pohodlnou práci je vhodné, aby bylo možno s objekty pohybovat nezávisle a měnit tak jejich vzájemnou polohu. Předpokladem je scanování ve stejném měřítku, aplikace tedy nemusí být schopna měnit vzájemnou velikost obou objektů. Načítání zdrojových souborů může probíhat například pomocí příkazové řádky – cesty k nim moho být předány jako parametry při spuštění programu, případně mohou být soubory načítány pomocí rozhraní v již spuštěném programu.
4
IMPLEMENTACE
4
35
Implementace
Následující kapitola pojednává o tom, jak autor řešil zadání, jak postupoval při analýze problému a jak implementoval výsledný program. Jak už bylo uvedeno, vstupem je textový soubor. Tento soubor má na prvním řádku celkový počet bodů, které objekt obsahuje a na dalších řádcích souřadnice jednotlivých bodů, vždy jeden bod na řádek, jednotlivé souřadnice jsou odděleny mezerami. Body jsou seřazeny tak, jak je zapisuje 3D scanner, tedy ve spirále, která obtáčí objekt stále dokola. Příklad: prvních 5 řádků vstupního souboru. 31354 11.286400 10.936200 10.621100 11.196600
4.1
10.498000 -6.793400 9.207500 -6.787000 10.876000 -6.784900 11.212000 -6.782500
Vytvoření TIN
Načtení a zobrazení vstupních bodů pomocí parametru GL POINTS příkazu glBegin() je velmi jednoduché, ale z hlediska použití k účelu aplikace velmi neužitečné. Geometrické informace (souřadnice bodů) je nutné doplnit o topologii (hrany), aby bylo možno těleso zobrazit jako plochy. Autor zamýšlel vytvořit algoritmus, který by topologii automaticky vytvořil. Uvažoval přitom následujícím způsobem. Vezměme bod, který je první v souboru. Z empiricky určeného okolí tohoto bodu (například okolních 20, 50, 100 nebo 1000 bodů) najděme nejmenší trojúhelník, který tento bod (spolu s okolními) tvoří. Najděme tedy jeho nejbližšího „sousedaÿ a poté třetí bod, u něhož platí, že součet vzdáleností k prvnímu a druhému bodu je minimální. Takto jsme vytvořili první „nejmenší trojúhelníkÿ. Do objektu Bod bude do vektoru soused zapsáno pořadové číslo souseda, se kterým byla vytvořena vazba a nastavena vlastnost, která značí, že bod je již zapojen v síti. Hledání následujících bodů probíhá podobně jako hledání třetího bodu. Z pozorování TIN sítí bylo určeno, že každý bod má přibližně 5 až 6 sousedů. Dokud tedy bod nemá šest sousedů, je pro něj a jeho sousedy hledán nejmenší trojůhelník. Ve chvíli, kdy má daný bod maximální počet sousedů, začínají se hledat sousedé pro další bod – druhý bod v souboru, následně třetí a další. Body v souboru jsou ve spirále, tedy nehrozí situace, že by daný bod ještě nebyl zapojen v síti, tedy neměl minimálně dva sousedy. Při každém propojení je provedena zpětná kontrola, která zjišťuje, zda propojované body nemají „mezi sebouÿ bod, který by byl právě přidávanému bodu blíže než bod výchozí. Takovýto případný bod musí být jedním ze sousedů výchozího bodu.
4.1
Vytvoření TIN
36
Tento algoritmus po implementaci pro několik málo bodů fungoval dobře, brzy ale autor narazil na problém „neuzavřených trojúhelníkůÿ, viz obrázek 21. V případě, že šlo o dva body se společným sousedem, došlo k propojení také těchto dvou. Po připojení několika bodů ke dvěma sousedícím bodům ale vznikaly „lichoběžníkové díryÿ – obrázek 21. Autorovi se nepodařilo vyřešit problém, jak určit, které body se mají v tomto případě propojit, jinými slovy nedokázal určit vzdálenost, či kritérium, podle něhož by bylo určeno, které body spojit a které nikoliv.
Obr. 21: Neuzavřené trojúhelníky a později lichoběžníkové díry při pokusech o tvorbu vlastní TIN.
V případě ignorování tohoto problému nebo jeho obejití spojením více trojúhelíků než je nezbytně nutné, dochází k vytvoření nadbytečných trojúhelníků a tedy k snižování výkonu aplikace. Navíc v místech, kde je na tělese konkávní ohyb dochází k velmi nedůslednému kopírování povrchu tělesa, což vede ke zkreslení objektu. Tento postup je tudíž nevhodný. Vzhledem k tomu, že se autorovi nepodařilo překonat tento problém, rozhodl se využít již hotový algoritmus a následně jej implementovat do aplikace. Rozšířeným algoritmem pro triangulaci je, jak už bylo uvedeno na straně 9, Delaunayova. DT byla do C implementována například programem Triangle (Shewchuk, 2009), případně Triangle++ jako implementace do C++ (Kumar, 2009). Podstatně univerzálnější jsou programy Qhull (Qhull, 2009) a TetGen (Si, 2009) Druhý z nich navíc umožnuje připojení hlavičkového souboru a dynamické knihovny pro implementaci do vlastního programu. Oba tyto programy umožnují nejen samotnou DT, ale i mnoho dalších operací například vytvoření Voronoi diagramů, určení konvezní obálky a podobně. Podobně knihovna CGAL (CGAL, 2009) disponuje nástroji pro triangulaci a vytváření sítí. Omezením DT, a tím i těchto programů, je vázanost na konvexní objekty. V případě vstupních dat kloubní náhrady se jedná o těleso nekonvexní a proto výstup z triangulace byl vždy jeho konvexní obálka. Řešením problému nekonvexnosti se autorovi zdály Alpha Shapes, které velmi zjednodušeně představují obal bodů v prostoru. Od konvexní obálky se liší tím, že
4.1
Vytvoření TIN
37
je zadán parametr, který určuje, v jaké maximální vzdálenosti mohou být body, aby byly spojeny jako sousední. Algoritmus je ve své základní formě založen na DT. Pokud parametr alfa nabývá vysokých hodnot, dosahujeme stejných výsledků jako u klasické DT. Pokud je jeho hodnota 0, výsledný tvar tvoří pouze body, na které byl algoritmus aplikován. Optimální hodnota parametru alfa tedy záleží na každém tělese, respektive vzdálenosti bodů. Tento algoritmus autor našel na více místech, ale v použitelné formě pouze opět v CGAL. Vzhledem k vysoké náročnosti se mu ho ale nepodařilo implementovat do vlastního programu. Jako řešení tedy autor přijal upravení vstupních dat externím programem MeshLab (MeshLab, 2009). Vzhledem ke struktuře původního souboru byl zvolen formát OFF (Object File Format). Hlavička tohoto typu se liší pouze prvním řádkem, kde je napsáno „OFFÿ a po celkovém počtu bodů je také uveden počet plošek a počet hran. Vhledem k tomu, že v souboru žádné plochy ani hrany nejsou, začátek OFF souboru vypadá následnovně: OFF 31354 0 0 11.2864 10.498 -6.7934 Tento soubor je načten a pomocí vestavěného algoritmu „Ball Pivoting Surface Reconstructionÿ založeném na Ball Pivoting Algorithm (Bernardini et al., 1999). Tímto je provedeno vytvoření sítě tvořící povrch tělesa. Výstupem je pro jednoduchost zpracování opět OFF formát. Vzhledem k tomu, že v souboru jsou již uloženy plochy, soubor vypadá následovně: OFF 31354 55458 0 11.2864 10.498 -6.7934 ... výpis všech bodů ... 3 2 4 12 3 12 13 2 3 4 15 12 ... výpis všech ploch ... V souboru nejsou uloženy žádné hrany, pouze body a 55458 plošek, tvořících povrch tělesa. Trojúhelníky TIN jsou uloženy ihned za výpisem bodů. První číslo určuje, kolik bodů tvoří plošku, za ním následují následují pořadová čísla bodů tvořících daný trojúhelník. Tento již může být bez problémů načten a zobrazen.
4.2
4.2
Třída Soubor
38
Třída Soubor
V objektu této třídy jsou uloženy informace o bodech, které jsou načteny ze vstupních souborů. Při každém spuštění programu jsou dynamicky vytvořeny právě dvě instance, pro každý ze vstupních souborů jedna. V případě, že je na příkazovém řádku zadán pouze jeden vstupní soubor, druhý se nezobrazuje. Konstruktor třídy Soubor je volán s dvěma parametry – cestou k souboru a informací, jestli se jedná o první nebo druhý soubor. Body, jsou načteny do soukromého atributu vektorBodu. V případě, že nejsou soubory zadány explicitně pomocí příkazové řádky jako parametry programu, program načte dva defaultní zdrojové soubory. V případě, že ani ty nebudou nalezeny, program se ukončí. V případě, že je na příkazovém řádku zadán jeden soubor, je načten pouze on, v případě, že soubory nebo oba soubory nejsou nalezeny, program se ukončí, protože nemá co vykreslovat. O načtení dat se stará metoda Soubor::nactiSouborOff(char*);, která pomocí vstupu in načte jednotlivé řádky. Hlavička souboru je načtena a ignorována, kromě počtu bodů a ploch. Poté metoda načítá jednotlivé řádky a souřadnice ukládá do již zmíněné proměnné vektorBodu. Jakmile je dosažen počet bodů, který je uveden na začátku souboru, začínají se načítat troúhelníky. První údaj je ignorován, další jsou uloženy do vektoruTrojuhelniku. V Soubor jsou také tři speciální body – max, min a stred. Trojúhelníky nejsou v zájmu rychlosti ukládány stejným způsobem jako v souboru, ale do vektoruTrojuhelniku jsou ukládány přímo souřadnice bodů, které tvoří trojúhelník. První tři hodnoty jsou souřadnice prvního, čtvrtá až šestá druhého a sedmá až deváta hodnota patří třetímu bodu. Pro korektní vykreslování osvětlení v OpenGL je nutné znát normálový vektor zobrazované plochy. Ten není v souboru uveden, proto je nutné jej spočítat. Po načtení každého trojúhelníku to udělá metoda udelejNormalu(), která má jako parametry všech devět souřadnic příslušného trojúhelníka, a to opět kvůli rychlosti. Tato metoda vypočítá normálový vektor plochy, normalizuje ho (upraví na jednotkovou délku) a uloží do pole vektorNormal. Po načtení je sada bodů vycentrována. Je to z toho důvodu, že souřadnice bodů jako výstup ze scanneru mají nepředvídatelnou hodnotu ve smyslu konečného zobrazení v prostoru. V případě, že by body nebyly vycentrovány, by se objekt mohl zobrazit kdekoli na obrazovce, případně i mimo ni. Proto má metoda načítající soubor část, která objekt posune doprostřed obrazovky. Centrování je založeno na myšlence, že objektu lze opsat pomyslnýminimální kvádr, jejhož dvěma protějšími rohy budou právě body max a min. Maximem bude pravý přední horní a minimem levý zadní dolní roh.Souřadnice každého bodu budou porovnány se stávajícím minimem a maximem a v případě, že tato hodnota (tedy ne nutně všechny tři) bude přesahovat dosavadní extrém, minimum a maximum bude změněno, jinými slovy roh „kvádruÿ bude posunut na nové místo. Poté, co jsou porovnány všechny body ve vektoru, je zjištěn střed „krychleÿ jako průměr minima a maxima. O souřadnice středního bodu (který obecně není těžištěm, ani nijak jinak nevypovídá o objektu)
4.2
Třída Soubor
39
jsou následně upraveny všechny souřadnice všech bodů v sadě. Alternativou přepsání souřadnic všech objektu je pouhé posunutí pomocí glTranslate(). Tato možnost ale nijak nevyřeší problém s manipulací se zobrazeným objektem, v případě, že jeho střed nebude shodný se středem otáčení. Vycentrování probíhá na základě této myšlenky: pro všechny body v sadě:{ porovnej jejich 3 souřadnice s minimem, pokud jsou menší, uprav minimum porovnej jejich 3 souřadnice s maximem pokud jsou větší, uprav maximum } zjisti střední hodnotu (min + max)/2 ulož souřadnice střední hodnoty Metoda Soubor::posunSoubor(int osa, float krok) je volána po stlačení klávesy na numerické klávesnici, která slouží pro změnu vzájemné polohy objektů. Toto posunování je opět realizováno za pomocí metody glTranslate(). K tomu je využita třída Posun. V ní je pouze vektor tří hodnot, které uchovávají vzájemný posun dvou vykreslených objektů ve všech třech osách. Jedinou metodou třídy Posun je zmenPosun(int osa, bool posun). Pravdivost nebo nepravdivost argumentu posun určuje směr posunu. Klávesy 4 a 6 slouží pro změnu vzdálenosti na ose x, 2 a 8 na ose y a 0 a 5 pro osu z. Tato metoda umožní porovnávání obou objektů. v případě, že jeden bude původní kloub a druhý jeho náhrada, můžeme v programu zjistit vzájemnou „kompatibilituÿ. To je hlavním účelem programu. Poté, co máme sadu bodů načtenou a vycentrovanou, můžeme ji vykreslit pomocí metody vykresliSoubor(), kterou spouštíme v metodě display(), která je volána v OpenGL smyčce hlavního programu při každém překreslení obrazovky. Nastavíme velikost bodů, jejich barvu a začneme vykreslovat vrcholy (vertex) pomocí tří jejich souřadnic. void vykresliSadu(){ nastav velikost bodu, nastav barvu, glBegin(GL\_POINTS); pro všechny body v~sadě:{ glVertex3f(všechny 3 souřadnice příslušného bodu)); } glEnd(); } Trojúhelníky, tedy celý objekt vykreslíme pomocí metody vykresliTrojuhelniky(), která je až na změnu vykreslované grafické primitivy na GL TRIANGLES a získání normály stejná jako Soubor::vykresliSoubor().
4.3
Menu
40
Při osvětlení je použito nejjednodušší stínování. Konstantní stínování je výrazně méně náročné než Goraudovo, nebo dokonce Phongovo. Vzhledem k velkému množství plošek je to výhodné z hlediska rychlosti vykreslování a tedy pohodlnosti ovládání. Navíc právě díky velkému množství plošek je vykreslení kloubu realistické a tedy dostačující.
4.3
Menu
Menu je vytvořeno a spravováno pomocí metod nástavbové knihovny GLUT, která disponuje prvky na tvorbu GUI. Jsou to metody void createMenu(void) pro vytvoření menu a submenu a metoda void onMenuCommand(int command) pro řízení událostí spojených s menu. POmocí menu můžeme měnit vlastnosti světla a materiálu povrchu objektů a také krok posunu při posouvání objektů pomocí klávesnice. Pomocí menu leze v programu lze zapínat a vypínat osvětlení. V programu jsou implementovány tři světelné zdroje, u kterých jsou nadefinovány jejich složky podle Phongova osvětlovacího modelu. Také materiály mají nadefinovány tyto vlastnosti. V případě, že je světlo pomocí menu vypnuto, je proveden příkaz glDisable(LIGHTx), kde „xÿ je číslo příslušného světla, počínaje nulou. Zapnutí probíhá příkazem glEnable(). Jedno světlo svítí zleva zpředu, další zprava a třetí zhora zepředu.
4.4
Trackery pohybu
Jak už bylo uvedeno dříve, v laboratoři VR na MZLU – Virtuality je ke zpracování informací z trackovacího zařízení používán program TrackD od firmy Mechdyne. Protože program je napsán v C++ a hlavičkový soubor trackdAPI c.h, který byl zvolen, je napsán v C, byly vytvořeny třídy pro přístup k metodám trackeru a controlleru. o komunikaci s trackery pohybu se tedy stará třída Tracker a třída Controller. Jsou uloženy v hlavičkovém souboru tracker.h. Třída Tracker, která obsluhuje trackery pohybu, tedy určování polohy a orientace v prostoru, má dvě chráněné proměnné a to ukazatel tracker, který ukládá data ze sdílené paměti programu TrackD a proměnnou, která ukládá počet sensorů. Jako veřejné atributy má tři pole, float pos[3], kam se ukládá informace o poloze trackovacího zařízení, float orn[3], kde je uložena informace o prostorové orientaci (elevation, asimuth a roll) a float mat[4][4], kde je uložena transformační matice daného sensoru. Veřejné metody třídy umožnují přístup k metodám v hlavičkovém souboru trackdAPI c.h. Metoda bool Tracker::init (int daemonKey) zajišťuje spojení s trackovacím zařízením pomocí metody TRACKD EXPORT API void* trackdInitTrackerReader(int). Pokud je vše v pořádku, do ukazatele tracker je uložen ukazatel do sdílené paměti pro příslušný tracker, odkud se dále může číst. Metoda také vypíše počet sensorů (int trackdGetNumberOfSensors(void*
4.4
Trackery pohybu
41
tracker)) a verzi rozhraní. Metoda Tracker::loadData (int sensor) načítá do veřejných proměnných informace z trackeru pomocí int trackdGetPosition(void* tracker, int id, float* pos), int trackdGetEulerAngles(void* tracker, int id, float* orn) a TRACKD EXPORT API int trackdGetMatrix(void* tracker, int id, float mat[4][4]). Třída Controller, která obsluhuje controller – Wandu, obsahuje tři chráněné a dva veřejné atributy. Ukazatel controller má stejný účel jako u třídy Tracker. Veřejné atributy int buttons[] a float valuators[] ukládají informace o tom, jaká kombinace třech tlačítek na zařízení je stisknuta a o poloze joysticku. Veřejné metody třídy také umožnují přístup k metodám z hlavičkového souboru a pracují obdobně jako ve třídě Tracker, ovšem s metodami příslušejícími controlleru, jako void* trackdInitControllerReader(int) pro spojení, int trackdGetNumberOfValuators(void* controller) pro zjištění počtu valuátorů, obdobně int trackdGetNumberOfButtons(void* controller) pro zjištění počtu tlačítek a float trackdGetValuator(void* controller, int id) nebo int trackdGetButton(void* controller, int id) pro zjištění stlačení kombinace tlačítek nebo pohyb valuátorem. Komunikace s trackovacím zařízením v programu funguje bezproblémově, ovšem ovládání není zcela komfortní vzhledem k tomu, že při každém stisknutí příslušného tlačítka je objekt naorientován v závislosti na orientaci controlleru, tedy nelze „navazovatÿ na minulou polohu.
5
5
ZÁVĚR
42
Závěr
Hlavním cílem práce bylo navrhnout a implementovat aplikaci, která umožní vizualizaci biomedicínských dat v prostředí virtuální reality. Za důležitou součást autor považuje také teoretický základ k zobrazování v počítačové grafice, proto je mu v práci věnována podstatná část. Další významnou částí práce je část Implementace, kde je popsán postup tvorby programu, jak program pracuje a problémy, které se při jeho tvorbě vyskytly. Vytčené se podařilo splnit, program umožňuje vizualizaci výstupu z optického scanneru, dále prohlížení a porovnávání dvou objektů ve stereoskopii i v desktopu. Lze jej ovládat jak klasickými vstupními zařízeními počítače, klávesnicí a myší, tak pomocí trackerů pohybu. V oblasti trackingu se nabízí některé možnosti zlepšení. Pokud by se obraz měnil v závislosti na poloze uživatele, stereoskopického vjemu by bylo možno dosáhnout kdekoli v místnosti a ne pouze přímo před projekčním plátnem. K všestranějšímu použití by nepochybně pomohla rozvinutí uživatelského rozhraní a možnost načítat a také exportovat některé nejznámější datové typy spojené s 3D-modelováním a virtuální realitou, například STL, PLY, případně X3D a WRL. Za hlavní možnost zlepšení autor považuje přímou implementaci alogritmů umožnujících generování nekonvexních povrchů, například Alpha Shapes a Ball Pivoting Algortithm. V dnešní době je důležité nejen rozvíjet poznání v jednotlivých oblastech vědy, ale také dokázat propojovat tyto poznatky navzájem. Rychlý rozvoj v oblasti medicíny spolu s rostoucími možnostmi informatiky přímo vybízí k jejich vzájemnému propojení a k aplikaci poznatků počítačových věd v medicíně. V budoucnosti je tato aplikace perspektivní zejména při výuce, diagnostice, terapii a výzkumu.
6
6
LITERATURA
43
Literatura
3D LCD Monitors [on-line]. Dokument ve formátu HTML [cit. 2009-05-15]. URL: http://www.reviewspring.com/3d-lcd-monitors-a80.php. Ascension Flock of Birds [on-line]. Dokument ve formátu HTML [cit. 2009-05-14]. URL: http://www.inition.co.uk/inition/product.php? URL =product mocaptrack ascension flockofbirdsSubCatID =18. Baratoff, Gregory; Blanksteen, Scott Tracking Devices [on-line]. Dokument ve formátu HTML [cit. 2009-05-01]. URL: http://www.hitl.washington.edu/scivw/EVE. Bernardini, Fausto et al. The Ball-Pivoting Algorithm for Surface Reconstruction [on-line]. Dokument ve formátu PDF [cit. 2009-05-15]. URL: http://www.research.ibm.com/vistechnology/pdf/bpat vcg.pdf. Bilinear interpolation [on-line]. Dokument ve formátu HTML [cit. 2009-05-02]. URL: http://en.wikipedia.org/. Boundary representation [on-line]. Dokument ve formátu HTML [cit. 2009-04-0]. URL: http://en.wikipedia.org/. Burdea, Grigore C.; Coiffet Phillipe Virtual Reality Technology. 2nd edition, Hoboken (New Jersey): Wiley, 2003. 444 s. ISBN 0-471-36089-9. CGAL: Computational Geometry Algorithms Library [on-line]. Dokument ve formátu HTML [cit. 2009-05-15]. URL: http://www.cgal.org/. Comparison of OpenGL and Direct3D [on-line]. Dokument ve formátu HTML [cit. 2009-03-27]. URL: http://en.wikipedia.org/. Eckel, B. Myslíme v jazyku C++: knihovna programátora. Praha: Grada, 2000. 554 s. ISBN 80-247-9009-2. Flat Shading [on-line]. Dokument ve formátu HTML [cit. 2009-05-12]. URL: http://lookup.computerlanguage.com/ hosta pp/search?cid = C000401def = 666c61742073686164696e67.htm. Gouraud shading [on-line]. Dokument veformátu HTML [cit. 2009-05-20]. URL: http://en.wikipedia.org/. High-Quality Real-Time Volume Rendering [on-line]. Dokumentve formátu HTML [cit. 2009-05-12]. URL: http://medvis.vrvis.at/projects/hvr/. Hnídek, Jiří Reprezentace 3D dat [on-line]. Dokument ve formátu PDF [cit. 200904-12]. URL: www.nti.tul.cz/wiki/images/1/1e/ Prednaska hranicni a objemova reprezentace dat.pdf. How Virtual Reality Gear Works [on-line]. Dokument ve formátu HTML [cit. 200905-15]. URL: http://electronics.howstuffworks.com/ gadgets/other-gadgets/VR-gear6.htm. iotracker Camera [on-line]. Dokument ve formátu HTML [cit. 2009-05-14]. URL: http://www.iotracker.com/index.php?q=cameras. Infitec stereo separation [on-line]. Dokument ve formátu HTML [cit. 2009-05-15]. URL: http://www.barco.com/ VirtualReality/en/stereoscopic/Infitec.asp.
6
LITERATURA
44
Kumar, PiyushTriangle++ [on-line]. Dokument ve formátu HTML [cit. 2009-0519]. URL: http://www.compgeom.com/ piyush/scripts/triangle/. L-system [on-line]. Dokument ve formátu HTML [cit. 2009-05-12]. URL: http://en.wikipedia.org/. Lamr, Tomáš Vývoj her na platformě XNA. Brno: Masarykova Univerzita. Fakulta Informatiky. 2007. 38 s. Vedoucí bakalářské práce Mgr. Ondřej Krajíček. MeshLab [on-line]. Dokument ve formátu HTML [cit. 2009-05-18]. URL: http://meshlab.sourceforge.net/. Microsoft: Next Generation of Games Starts With XNA [on-line]. Dokument ve formátu HTML [cit. 2009-04-04]. URL: https://www.microsoft.com/ presspass/press/2004/mar04/03-24xnalaunchpr.mspx. Microsoft Invites the World to Create Its Own Xbox 360 Console Games for the First Time [on-line]. Dokument ve formátu HTML [cit. 2009-04-05]. URL: http://www.microsoft.com/ presspass/press/2006/aug06/08-13XNAGameStudioPR.mspx. Microsoft XNA [on-line]. Dokument ve formátu HTML [cit. 2009-04-05]. URL: http://en.wikipedia.org/. Nebulabrot [on-line]. Dokument ve formátu HTML [cit. 2009-05-12]. URL: http://www.danvk.org/wp/2007-04-06/nebulabrot/. Open Inventor [on-line]. Dokument ve formátu HTML [cit. 2009-04-02]. URL: http://oss.sgi.com/projects/inventor/. Open Inventor [on-line]. Dokument ve formátu HTML [cit. 2009-04-02]. URL: http://en.wikipedia.org/. Pečiva, Jan Open Inventor: Knihovna pro realtimovou 3D grafiku [on-line]. Dokument ve formátu HTML [cit. 2008-04-02]. URL: http://www.root.cz/ clanky/open-inventor/. OpenGL [on-line]. Dokument ve formátu HTML [cit. 2008-03-26]. URL: http://en.wikipedia.org/. OpenGL - Overview [on-line]. Dokument ve formátu HTML [cit. 2008-03-25]. URL: http://www.sgi.com/ products/software/opengl/overview.html. OpenGL vedle DirectX stále žije – vychází openGL 3 [on-line]. Dokument ve formátu HTML [cit. 2009-03-27]. URL: http://www.ddworld.cz/ linux/opengl-vedle-directx-stale-zije-vychazi-opengl-3-6.html. Phong shading [on-line]. Dokument ve formátu HTML [cit. 2009-05-05]. URL: http://en.wikipedia.org/. Qhull [on-line]. Dokument ve formátu HTML [cit. 2009-05-18]. URL: http://qhull.org/. Rigid-Body Targets [on-line]. Dokument ve formátu HTML [cit. 2009-05-14]. URL: http://www.iotracker.com/index.php?q=rigid body targets. Shewchuk, Jonathan Richard Triangle [on-line]. Dokument ve formátu HTML [cit. 2009-05-16]. URL: http://www.cs.cmu.edu/ quake/triangle.html.
6
LITERATURA
45
Stereoscopy [on-line]. Dokument ve formátu HTML [cit. 2009-04-25]. URL: http://en.wikipedia.org/. Strych, Václav Triangulace a editování vrstevnic. Plzeň: Západočeská univerzita. Fakulta aplikovaných věd. 2003. 53 s. Vedoucí diplomové práce Doc. Dr. Ing. Ivana Kolingerová. Svoboda, M. OpenGL. [on-line]. Dokument ve formátu HTML [cit. 2009-05-21]. URL: http://www.builder.cz/serial63.html. Si, Hang TetGen: A Quality Tetrahedral Mesh Generator and Three-Dimensional Delaunay Triangulator [on-line]. Dokument ve formátu HTML [cit. 2009-05-15]. URL: http://tetgen.berlios.de/. Turek, M. CZ NeHe OpenGL - vše o programování 3D grafiky pod knihovnou OpenGL [on-line]. Dokument ve formátu HTML [cit. 2009-05-15]. URL: http://nehe.ceske-hry.cz/. Tišnovský, Pavel Grafická knihovna OpenGL (1) [on-line]. Dokument ve formátu HTML [cit. 2009-03-26]. URL: http://www.root.cz/ clanky/graficka-knihovna-opengl-1/. Tišnovský, Pavel Grafická knihovna OpenGL (18): vykreslování osvětlených těles [on-line]. Dokument ve formátu HTML [cit. 2009-05-04]. URL: http://www.root.cz/clanky/ opengl-18-vykreslovani-osvetlenych-teles. Tišnovský, Pavel Grafická knihovna OpenGL (19): Phongův osvětlovací model [on-line]. Dokument ve formátu HTML [cit. 2009-05-05]. URL: http://www.root.cz/clanky/opengl-19-phonguv-osvetlovaci-model. Tišnovský, Pavel OpenGL evaluátory [on-line]. Dokument ve formátu HTML [cit. 2009-04-16]. URL: http://www.root.cz/ clanky/opengl-evaluatory-i/. Tišnovský, Pavel Vykreslování povrchů terénů s LOD, Gouraudovo a Phongovo stínování [on-line]. Dokument ve formátu HTML [cit. 2009-05-02]. URL: http://www.root.cz/clanky/vykreslovani-povrchu-terenu-s-lod-gouraudovo-a-phongovo-stinovani. Tišnovský, Pavel Způsoby popisu prostorových objektů v POV-Rayi [on-line]. Dokument ve formátu HTML [cit. 2009-04-22]. URL: http://www.root.cz/ clanky/zpusoby-popisu-prostorovych-objektu-v-pov-rayi/. Tonnesen, Cindy; Steinmetz, Joe 3D Sound Synthesis [on-line]. Dokument ve formátu HTML [cit. 2009-04-30]. URL: http://www.hitl.washington.edu/ scivw/EVE. Virtual Reality For Santos [on-line]. Dokument ve formátu HTML [cit. 2009-05-15]. URL: http://www.digital-humans.org/ Report2004/Documents/06-VirtualRealityForSantos.htm. Wanda [on-line]. Dokument ve formátu HTML [cit. 2009-05-15]. URL: http://www.vrealities.com/wanda.html.
6
LITERATURA
46
XNA Frequently Asked Questions [on-line]. Dokument ve formátu HTML [cit. 200904-05]. URL: http://msdn2.microsoft.com/ en-us/directx/aa937793.aspx. Žára, Jiří; Beneš, Bedřich; Felkel, Petr Moderní počítačová grafika. Praha: Computer Press, 1998. 448 s. ISBN 80-7226-049-9. Žára, Jiří; Beneš, Bedřich; Sochor, Jiří; Felkel, Petr Moderní počítačová grafika. Praha: Computer Press, 2004. 609 s. ISBN 80-251-0454-0.
Přílohy
A
A
DIAGRAM TŘíD
Diagram tříd
Obr. 22: UML diagram tříd.
48
B
B
SCREENSHOTY Z APLIKACE
Screenshoty z aplikace
Obr. 23: Vykreslení zdrojového souboru pomocí parametru GL POINTS.
49
B
SCREENSHOTY Z APLIKACE
Obr. 24: Vykreslení dat kloubní nárhady.
Obr. 25: Detail kloubní náhrady.
50
B
SCREENSHOTY Z APLIKACE
51
Obr. 26: Aplikace spuštěná se dvěma stejnými načtenými soubory. Jsou posunuty pomocí aplikace.
Obr. 27: Další pohled na dva identické soubory.
B
SCREENSHOTY Z APLIKACE
52
Obr. 28: Dvě náhrady pod jiným osvětlením. Náhrada, která je vyobrazena světlejší barvou má na pravém bříšku „hrbolÿ, který je jednoduše zpozorovatelný.
Obr. 29: Detail rozdílu obou náhrad.