VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ ÚSTAV TELEKOMUNIKACÍ

FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION DEPARTMENT OF TELECOMMUNICATIONS

VYTVOŘENÍ INTERAKTIVNÍCH POMŮCEK Z OBLASTI 3D POČÍTAČOVÉ GRAFIKY

INTERACTIVE TEACHING AIDS FOR 3D COMPUTER GRAPHICS

DIPLOMOVÁ PRÁCE MASTER'S THESIS

AUTOR PRÁCE Bc. RADIM BALUSEK AUTHOR

VEDOUCÍ PRÁCE Mgr. PAVEL RAJMIC, Ph.D. SUPERVISOR

BRNO 2012 VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

Fakulta elektrotechniky a komunikačních technologií

Ústav telekomunikací

Diplomová práce magisterský navazující studijní obor Telekomunikační a informační technika

Student: Bc. Radim Balusek ID: 75022 Ročník: 2 Akademický rok: 2011/2012

NÁZEV TÉMATU: Vytvoření interaktivních pomůcek z oblasti 3D počítačové grafiky

POKYNY PRO VYPRACOVÁNÍ: Nastudujte základy popisu ploch, jejich zpracování a vizualizace ve 3D. Implementujte přehledné grafické uživatelské rozhraní pro applety, které budou demonstrovat vybrané jevy z 3D grafiky pro účely výuky: a/ geometrické transformace, b/ perspektivní promítání ve 3D, c/ parametrický způsobu popisu 3D plochy.

DOPORUČENÁ LITERATURA: [1] Jiří Žára, Bedřich Beneš, Jiří Sochor, Petr Felkel, Moderní počítačová grafika (2. vydání), Computer Press, 2005, ISBN 80-251-0454-0

[2] Les A. Piegl, Wayne Tiller, The NURBS Book. Springer, druhé vydání, 1996, ISBN-10: 3540615458

[3] Mortenson, M.E., Geometric Transformations for 3D Modeling. Industrial Press, Inc., druhé vydání, 2007. ISBN 0831133384

Termín zadání: 6.2.2012 Termín odevzdání: 24.5.2012

Vedoucí práce: Mgr. Pavel Rajmic, Ph.D.

prof. Ing. Kamil Vrba, CSc. Předseda oborové rady

UPOZORNĚNÍ: Autor diplomové práce nesmí při vytváření diplomové práce porušit autorská práva třetích osob, zejména nesmí zasahovat nedovoleným způsobem do cizích autorských práv osobnostních a musí si být plně vědom následků porušení ustanovení § 11 a následujících autorského zákona č. 121/2000 Sb., včetně možných trestněprávních důsledků vyplývajících z ustanovení části druhé, hlavy VI. díl 4 Trestního zákoníku č.40/2009 Sb. ABSTRAKT Tato diplomová práce se zabývá tvorbou interaktivních pomůcek z oblasti 3D počíta- čové grafiky. Úvod práce je věnován obecné teorii křivek a ploch a jejich matematickým popisem. Podrobněji jsou rozebrána témata Geometrická transformace, Perspektivní pro- mítání a Parametrický způsob zápisu plochy. Navazující kapitola se zabývá problematikou vizualizace prostorových objektů v programovém prostředí . V praktické části je po- psána implementace jednotlivých appletů. K vlastní realizaci interaktivních pomůcek byl použit jazyk Java, který využívá knihovní funkce JOGL. Cílem diplomové práce je vy- tvoření souboru interaktivních appletů z oblasti počítačové grafiky. Tyto applety budou umístěny na stránkách fakulty a budou sloužit studentům VUT v Brně ke zkvalitnění výuky. KLÍČOVÁ SLOVA Počítačové křivky, Bézierovy kubiky, de Casteljau, Geometrické transformace, Perspek- tivní projekce, Parametrický popis 3D prostoru, 3D grafika, Java, JOGL, applet

ABSTRACT This diploma thesis deals with the creation of interactive tools for 3D computer gra- phics. The introduction of the thesis focuses on general theory of curves and surfaces and its mathematical description. The topics of Geometric transformation, Perspective projection and Parametric description of 3-dimensional surface are analysed in more de- tail. The successive chapter deals with the subject of visualisation of spatial objects in Java platform interface. The practical part describes the implementation of indivi- dual applets. JAVA programming language, which uses the library functions JOGL, was employed for the very realization of the interactive tools. The goal of the diploma thesis is the creation of a set of interactive applets in the field of computer graphics. These applets will be placed on the website of the faculty and they will serve students of VUT in Brno to improve the quality of education. KEYWORDS Computer curves, Bézier cubic, de Casteljau, Geometric Transformations, Perspective Projection, Parametric description of 3-dimensional surface, 3D graphic, Java, JOGL, applet

BALUSEK, Radim Vytvoření interaktivních pomůcek z oblasti 3D počítačové grafiky: diplomová práce. Brno: Vysoké učení technické v Brně, Fakulta elektrotechniky a komu- nikačních technologií, Ústav telekomunikací, 2012. 54 s. Vedoucí práce byl Mgr. Pavel Rajmic, Ph.D. PROHLÁŠENÍ

Prohlašuji, že svou diplomovou práci na téma „Vytvoření interaktivních pomůcek z oblasti 3D počítačové grafiky“ jsem vypracoval samostatně pod vedením vedoucího diplomové práce a s použitím odborné literatury a dalších informačních zdrojů, které jsou všechny citovány v práci a uvedeny v seznamu literatury na konci práce. Jako autor uvedené diplomové práce dále prohlašuji, že v souvislosti s vytvořením této diplomové práce jsem neporušil autorská práva třetích osob, zejména jsem nezasáhl nedovoleným způsobem do cizích autorských práv osobnostních a/nebo majetkových a jsem si plně vědom následků porušení ustanovení S 11 a následujících autorského zá- kona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon), ve znění pozdějších předpisů, včetně možných trestněprávních důsledků vyplývajících z ustanovení části druhé, hlavy VI. díl 4 Trestního zákoníku č. 40/2009 Sb.

Brno ...... (podpis autora) PODĚKOVÁNÍ

Na tomto místě bych chtěl poděkovat panu Mgr. Pavlu Rajmicovi za vstřícnost, cenné rady a čas, který věnoval mé práci. V neposlední řadě musím poděkovat své rodině za podporu během celého studia.

V Brně dne ...... (podpis autora) OBSAH

Úvod 9

1 Křivky a plochy v počítačové grafice 10 1.1 Křivky a jejich základní vlastnosti ...... 10 1.2 Napojování křivek ...... 11 1.3 Modelování křivek ...... 12 1.4 Bernsteinovy polynomy a Bézierovy křivky ...... 13 1.4.1 Bézierovy kubiky ...... 14 1.4.2 Algoritmus de Casteljau ...... 15 1.5 3D plochy a jejich parametrický zápis ...... 16 1.5.1 Bézierovy plochy ...... 18 1.6 Geometrické afinní transformace ...... 20 1.6.1 Posunutí ...... 21 1.6.2 Rotace ...... 21 1.6.3 Změna měřítka ...... 22 1.6.4 Zkosení ...... 23 1.6.5 Skládání transformací ...... 23 1.7 Promítání ...... 23 1.7.1 Kamera ...... 24 1.7.2 Rovnoběžné promítání ...... 24 1.7.3 Středové promítání ...... 24

2 Java 27 2.1 3D grafika v Javě a přehled technologií pro její realizaci . 27 2.1.1 LWJGL (Lightweight Java Game Library) ...... 27 2.1.2 Java 3D ...... 28 2.1.3 Java OpenGL (JOGL) ...... 28 2.2 Java applety ...... 29

3 OpenGL 31 3.1 Transformační matice a lineární transformace ...... 31 3.2 Tvorba osvětlení ...... 31

4 Praktická část 33 4.1 Rozbor praktické části ...... 33 4.1.1 Implementace knihovny JOGL ...... 33 4.2 Applet Geometrické transformace ...... 34 4.2.1 Programová realizace appletu ...... 34 4.3 Applet Perspektivní promítání ve 3D ...... 37 4.3.1 Programová realizace appletu ...... 38 4.4 Applet Parametrický způsob popisu 3D plochy ...... 41 4.4.1 Programová realizace appletu ...... 41 4.5 Reprezentace appletů na webových stránkách ...... 43 4.6 Zhodnocení výsledků ...... 44

5 Závěr 45

Literatura 46

Seznam symbolů, veličin a zkratek 47

Seznam příloh 48

A Instalace knihovny JOGL v IDE Netbeans 7.1.1 49 A.1 Umístění JOGL knihovny na WWW stránky ...... 50

B UML diagramy 52

C Obsah CD 54 SEZNAM OBRÁZKŮ

1.1 Křivka 푄(푡) vzniklá spojením dvou segmentů 푄1(푡) a 푄2(푡) ...... 11 1.2 Interpolační (vlevo) a aproximační křivka ...... 12 1.3 Vyobrazení Bernsteinových polynomů ...... 15 1.4 Výpočet bodu na Bézierově kubice pomocí algoritmu de Casteljau . . 16 1.5 Parametrická plocha [6] ...... 17 1.6 Bézierův bikubický plát ...... 20 1.7 Posunutí v ose 푦 ...... 21 1.8 Rotace kolem osy 푥 ...... 22 1.9 Změna měřítka v ose 푧 ...... 22 1.10 Jednobodová perspektiva ...... 25 1.11 Dvoubodová perspektiva ...... 26 1.12 Trojbodová perspektiva ...... 26 2.1 Jednoduchý graf scén ...... 29 2.2 Životní cyklus appletu ...... 30 4.1 GUI appletu geometrická transformace ...... 35 4.2 GUI třídy GLPanel ...... 36 4.3 GUI třídy Control panel ...... 37 4.4 GUI appletu perspektivní promítání ...... 38 4.5 Perspektivní promítání změna úhlu záběru kamery ...... 38 4.6 Perspektivní promítání změna poměru stran ...... 39 4.7 Perspektivní promítání úprava ořezových rovin ...... 39 4.8 Pohledová pyramida ...... 40 4.9 první typ Bézierovy bikubické plochy ...... 42 4.10 druhý typ Bézierovy bikubické plochy ...... 43 4.11 třetí typ Bézierovy bikubické plochy ...... 43 A.1 Otevření manažera knihoven ...... 49 A.2 Volba jar souborů v manažeru knihoven ...... 50 A.3 Knihovna JOGL v projektu ...... 51 A.4 FTP server ...... 51 B.1 Diagram tříd appletu Geometrická transformace ...... 52 B.2 Diagram tříd appletu Perspektivní promítání ...... 52 B.3 Diagram tříd appletu Parametrický způsob popisu plochy ...... 53 ÚVOD

Tato diplomová práce se zabývá návrhem a implementací sady interaktivních ap- pletů z oblasti 3D počítačové grafiky. V rámci výuky počítačové grafiky na fakultě FEKT v Brně vznikl požadavek na vytvoření interaktivních appletů pro demon- straci vybraných úloh z oblasti počítačové grafiky. Praktické vyzkoušení těchto úloh na názorné ukázce reprezentované na interaktivních appletech pomůže ke snadněj- šímu pochopení jinak složitých matematických operací. Výsledkem této práce bude tedy sada interaktivních appletů, které budou umís- těny na stránkách fakulty a budou sloužit ke zkvalitnění výuky v předmětech BZSG a MGMP jako grafická pomůcka pro snadnější pochopení vyučované látky. Úvodní teoretická část práce je věnována obecné teorií křivek a ploch. Podrobněji jsou rozebrána témata: Geometrická transformace, Perspektivní promítání a Para- metrický popis plochy. Druhá kapitola práce se věnuje programovému prostředí Java, kde jsou popsány možné techniky vizualizace prostorových objektů. Konec kapitoly je věnován seznámení s Java appletem a stručnému úvodu do knihovny OpenGL. V praktické části je v úvodu zdůvodněno vybrání knihovny JOGL pro realizaci 3D grafiky v Javě a její implementace do vývojového prostředí NetBeans 7.1.1. Ná- sleduje sumarizace požadavků, které jsou na jednotlivé applety kladeny. Na základě těchto požadavků je popsán návrh a postup realizace jednotlivých appletů. V zá- věru práce je popsána implementace appletů na webové stránky, průběh testování a návrh možnosti rozšíření stávajícího řešení.

9 1 KŘIVKY A PLOCHY V POČÍTAČOVÉ GRAFICE

V současné době se můžeme setkat s využitím křivek napříč všemi obory. Využívají se v mnoha vědních oborech (fyzika, statika, matematika), ale i technické praxi (stavebnictví, strojírenství apod.). Dle rozdílných potřeb vědních oborů klademe rozdílné požadavky na vlastnosti a chování použitých křivek. V moderní počítačové grafice se s křivkami můžeme setkat například při modelování objektů, výpočtu dráhy pohybujících se objektů, ale i při tvorbě animovaných filmů.

1.1 Křivky a jejich základní vlastnosti

Křivku můžeme obecně zapsat jako soustavu parametrů rovnice, kterou následně můžeme generativně zobrazit. K definici křivky existují tři základní matematické přístupy explicitně (1.1), implicitně (1.2) a parametricky (1.3).

Explicitně: Křivku můžeme definovat jako spojitou funkci ve tvaru

푦 = 푓(푥). (1.1)

Implicitně: V porovnání s ostatními variantami je toto zadaní křivky obtížnější, neboť neumožňuje v obecnějších případech postupný výpočet křivky. Tento typ mů- žeme využít například při výpočtu průsečíků paprsku s křivkou nebo při testování oblastí vymezených implicitně zadanou křivkou [6]

퐹 (푥, 푦) = 0. (1.2)

Parametricky: Nejčastější zápis v počítačové grafice je parametrický zápis křivky, pro jeho univerzálnost a pohodlnost. Mezi výhody parametrického zápisu křivky patří závislost na jediném parametru t (času). Křivku chápeme fyzikálně jako dráhu pohybujícího se bodu, jehož souřadnice jsou funkcemi parametru t (času). Při volbě parametru t vybíráme z rozsahu t∈ ⟨0, 1⟩

푥 = 푥(푡), 푦 = 푦(푡), 푧 = 푧(푡). (1.3) Funkcemi (1.3) je určena bodová rovnice křivky:

푄(푡) = [푥(푡), 푦(푡), 푧(푡)], (1.4) nebo vektorová rovnice: ⃗푞(푡) = (푥(푡), 푦(푡), 푧(푡)). (1.5)

10 Vektor ⃗푞(푡) = 푄 – [0,0,0] nazýváme polohový vektor, jehož velikost je rovna vzdále- nosti Q(t) od počátku. V případě výpočtu Tečného vektoru v bodě 푄(푡0) dosazujeme derivace parametricky vyjádřené křivky

′ ′ ′ d푥(푡 ) d푦(푡 ) d푧(푡 ) 푞⃗′ (푡 ) = (푥 (푡 ), 푦 (푡 ), 푧 (푡 )) = 0 , 0 , 0 . (1.6) 0 0 0 0 d푡 d푡 d푡 Rovnice tečny se vypočítá z téčného vektoru a bodu na křivce jako

⃗′ 푃 (푢) = 푄(푡0) + 푢푞 (푡0). (1.7)

Vektor 푞⃗′ (푡) se také nazývá směrový vektor přímky.

1.2 Napojování křivek

Při modelování složitějších křivek nemá smysl provádět modelování pomocí jedné slo- žité křivky vyššího řádu. Z pohledu realizace je daleko praktičtější modelovat tyto křivky jako navzájem napojující se křivky jednoduché složitosti. Bod, kde končí je- den konec křivky a navazuje na něj začátek následující křivky, nazveme uzel. Příklad zobrazení můžeme vidět na obr. 1.1.

Obr. 1.1: Křivka 푄(푡) vzniklá spojením dvou segmentů 푄1(푡) a 푄2(푡)

U křivek můžeme využít různé způsoby napojení. Nejvíce nás však zajímá jakým způsobem se křivky napojují tzv. spojitost v uzlu. Napojení křivek můžeme rozdělit na dva typy parametrickou a geometrickou spojitost.

ˆ Parametrická spojitost značíme 퐶푛. Říkáme, že křivka 푄(푡) je třídy 퐶푛, má– li ve všech bodech spojité derivace podle parametru 푡 do řádu 푛 [6]. Spojitá návaznost u dvou segmentu vzniká tehdy, jestiže koncový bod u prvního seg- mentu tvoří počáteční bod u druhého segmentu druhého. 퐶1 spojení u dvou

segmentů vzniká tehdy, jestliže si jsou tečné vektory v koncovém bodě 푄1 a

11 počátečním bodě 푄2 rovny.

ˆ Geometrická spojitost označujeme 퐺푛. Pro geometrickou spojitost platí, že seg- 0 menty křivky 푄(푡) jsou 퐺 spojité, pokud je koncový bod 푄1 totožný s počát- 1 kem 푄2 [6]. 퐺 spojitost u dvou segmentů nastává tehdy, jestliže je dodržena spojitost 0 a zároveň u tečných vektorů ⃗′ ,⃗′ dochází k lineární zá- 퐺 푞 1(1) 푞 2(0) vislosti. Podmínka spojitosti 퐺푛 je splněna, když jsou segmenty v uzlu 퐺푛−1 spojité a všechny derivace až do 푛−1 jsou rovnoběžné a souhlasně orientované.

1.3 Modelování křivek

Nejčastěji používané křivky používané v počítačové grafice jsou křivky polynomiální, které můžeme zapsat pomocí vztahu

푛 푄푛(푡) = 푎푛푡 + ... + 푎1 + 푎0. (1.8)

Hlavní výhodou polynomiálních křivek je rychlost výpočtu a snadná snadná di- ferencovatelnost. Skládáním několika segmentů polynomiálních křivek lze vytvořit křivky po částech polynomiální. V počítačové grafice nejčastěji využívané křivky tře- tího stupně tzv. kubiky. Výhodou těchto křivek je nenáročný výpočet, velká škála možných tvarů, lehká manipulovatelnost a lze u nich zaručit spojitost 퐶2. U křivek vyššího stupně vznikají nežádoucí vlnění a oscilace. Pro modelování musíme definovat několik řídících bodů a matematický aparát nám určí průběh křivky. Rozlišujeme dva základní způsoby, jak můžeme interpre- tovat řídící body. První způsob je interpolace a druhý aproximace. Zatímco u in- terpolačních křivek nám křivka prochází řídícími body přesně (obr. 1.2 vlevo) u aproximačních křivek nám křivka prochází pouze v blízkosti zadaných bodů (obr. 1.2 vpravo).

Obr. 1.2: Interpolační (vlevo) a aproximační křivka

12 Parametricky můžeme zadanou kubiku 푄(푡) vyjádřit ve tvaru:

3 2 푧(푡) = 푎푥푡 + 푏푥푡 + 푐푥푡 + 푑푥 3 2 푦(푡) = 푎푦푡 + 푏푦푡 + 푐푦푡 + 푑푦. 3 2 푧(푡) = 푎푧푡 + 푏푧푡 + 푐푧푡 + 푑푧 (1.9)

Ve zkráceném maticovém tvaru můžeme zapsat:

⎡ ⎤ 푎푥 푎푦 푎푧 3 2 ⎢ ⎥ (1.10) 푄(푡) = 푇 퐶 = [푡 , 푡 , 푡, 1] ⎣ 푏푥 푏푦 푏푧 ⎦ . 푐푥 푐푦 푐푧

Derivaci 푞⃗′ (푡) získáme derivací vektoru 푇

(︂ d )︂ (︂ d )︂ 푞⃗′ (푡) = 푞(푡) = 푇 퐶 = [3푡2, 2푡, 1, 0]퐶. (1.11) d푡 d푡 Konstantní matici C můžeme rozepsat do součinu

퐶 = 푀퐺. (1.12)

Kde 푀 nám značí matici konstant tzv. bázovou matici a čtyřprvkový vektor 퐺 označujeme jako vektor geometrických podmínek. Součin 푇 푀 definuje polynomiální bázi, která je společná pro všechny křivky určitého typu [6]. Vektor geometrických podmínek obsahuje konkrétní parametry, které ovlivňují tvar křivky [6]. Kubika je definována vztahem ⎡ ⎤ ⎡ ⎤ 푚11 푚12 푚13 푚14 퐺1 ⎢ 푚 푚 푚 푚 ⎥ ⎢ 퐺 ⎥ 3 2 ⎢ 21 22 23 24 ⎥ ⎢ 2 ⎥ (1.13) 푄(푡) = 푇 푀퐺 = [푡 , 푡 , 푡, 1] ⎢ ⎥ . ⎢ ⎥ ⎣ 푚31 푚32 푐33 푚34 ⎦ ⎣ 퐺3 ⎦ 푚41 푚42 푐43 푚44 퐺4 1.4 Bernsteinovy polynomy a Bézierovy křivky

Nejvyužívanější křivky v počítačové grafice pro modelování ve dvou, ale i třech rozměrech, jsou Bézierovy křivky. V praxi se tyto křivky často využívají při defi- nici písma (fontů). Bézierovy křivky jsou vystavěny na Bernsteinových polynomech

퐵푘,푛(푛) daných rovnicí:

(︂푛)︂ 퐵 (푡) = 푡푘(1 − 푡)푛−푘, 푡 ∈ [0, 1], 푘 = 0, 1, . . . , 푛, (1.14) 푘,푛 푘 kde definujeme (︀푛)︀ 0 . 0 = 1, 0 = 1

13 Bézierovu křivku 푛–tého stupně definujeme jako: 푛 퐵퐸푍 ∑︁ 푄 (푡) = 푃푘퐵푘,푛(푡), (1.15) 푘=0 kde 푃푘 je 푛 + 1 řídících bodů. Proložíme-li v rovnici (1.14) 푡 = 0, případně 푡 = 1, můžeme odvodit, že křivka prochází prvním resp. posledním, řídícím bodem [6]. Mezi základní vlastnosti Bézierových křivek patří, že při změně jednoho řídícího bodu, se změní tvar celé křivky. Proto se v praxi využívají Bézierovy kubiky a jejich navazování. V případě Bézierových kubik je tečna v počátečním bodě dána rovnicí [5] ′ 푃 (0) = 푛(푃1 − 푃0), (1.16)

′ 푃 (1) = 푛(푃푛 − 푃푛−1). (1.17) Mezi další vlastnosti Bézierových křivek patří: ˆ vlastnost konvexního obalu – platí, že všechny body Bézierovy křivky jsou v konvexním obalu, který tvoří řídící polygon. ˆ nezávislost na orientaci řídícího polygonu. ˆ invariantnost, můžeme afinně transformovat jednotlivé body Bézierovy křivky nebo můžeme transformovat její řídící polygon a vypočteme Bézierovu křivku pro tento polygon, v obou případech dostaneme stejný výsledek.

1.4.1 Bézierovy kubiky

Bézierovy kubiky patří mezi nejčastěji využívané křivky. Bézierovy kubiky tvoříme pomocí křivek třetího stupně 푛 = 3. Bézierova kubika je zadána čtyřmi body

푃0, 푃1, 푃2, 푃3. Začíná v prvním řídícím bodě 푃0 a končí v posledním 푃3. Názorný příklad Bézierovi kubiky v dvourozměrném prostoru můžeme vidět na obr. 1.3. Bé- zierova kubika je určena vztahem

3 ∑︁ 푄(푡) = 푃푖퐵푖(푡), (1.18) 푖=0 nebo ve zkrácené maticové formě

⎡ ⎤ ⎡ ⎤ −1 3 −3 1 푃0 ⎢ 3 −6 3 0 ⎥ ⎢ 푃 ⎥ 3 2 ⎢ ⎥ ⎢ 1 ⎥ (1.19) 푄(푡) = [푡 , 푡 , 푡, 1] ⎢ ⎥ ⎢ ⎥ . ⎣ −3 −3 0 0 ⎦ ⎣ 푃2 ⎦ 1 0 0 0 푃3 Pro tečné vektory v prvním a posledním bodě platí:

⃗′ 푝 (0) = 3(푃1 − 푃0), (1.20)

14 ⃗′ 푝 (1) = 3(푃3 − 푃2). (1.21)

Obr. 1.3: Vyobrazení Bernsteinových polynomů

1.4.2 Algoritmus de Casteljau

Algoritmus de Casteljau patří mezi základní techniky pro výpočet Bézierových kři- vek v daném časovém okamžiku. Jedná se o rekurzivní algoritmus, kde jednotlivé body křivky o souřadnicích 푄(푡) můžeme vypočítat podle vztahu

푃푗,푖(푡) = (1 − 푡)푃푗−1, 푖−1 + 푡푃푗,푖−1 (1.22)

, kde 푖 = 1, 2, . . . , 푛 a 푗 = 푖, 푖+1, . . . , 푛. Vstupem do algoritmu jsou body 푃0, 푃1, . . . , 푃푛

řídícího polygonu a časový okamžik t ∈ [0, 1]. Postupně dosazujeme za 푃푖,0 a jednot- livé body jsou vypočítané podle vztahu (1.22) [6]. Algoritmus de Casteljau můžeme využít také k dělení křivek, kdy nejjednodušší je dělení ve středu, tj. 푡 = 1/2. Při dělení vytvoříme dvě skupiny řídících bodů 퐿0, . . . , 퐿푛 a 푅0, . . . , 푅푛, které přísluší části rozpůlené křivky. Nové řídící body získáme pomocí vztahů:

푖 (︃ )︃ (︂ )︂ ∑︁ 푖 푃푗 퐿 = 푖 = 0, 1, ...푛, (1.23) 푖 2푖 푗=0 푗 푛 (︃ )︃ (︂ )︂ ∑︁ 푛 − 푖 푃푗 푅 = 푖 = 0, 1, ...푛, (1.24) 푖 2푛−푖 푗=푖 푛 − 푗

15 které si graficky můžeme zobrazit jako půlení. Pokud tento postup opakujeme, kon- verguje polygon určený řídícími body k Bézierově křivce. Řídící polygon je apro- ximací Bézierovy křivky a každé rozdělení generuje dva nové řídící polygony, které jsou přesnějšími aproximacemi této křivky [6]. Výpočet bodu na Bézierově kubice můžeme vidět na obr. 1.4. Algoritmus de Casteljau se v praxi využívá pro hledání

Obr. 1.4: Výpočet bodu na Bézierově kubice pomocí algoritmu de Casteljau bodu na křivce ve zvoleném časovém okamžiku, dělení Bézierové křivky a vykreslo- vání vektorové křivky do bitmapového obrazu. Algoritmus se především využívá jako základní nástroj pro kreslení 2D grafiky. Při 3D modelování se z důvodů některých nevhodných vlastností používají složitější křivky tzv. NURBS křivky.

1.5 3D plochy a jejich parametrický zápis

3D plochy zapisujeme pomocí souřadnic (푥, 푦, 푧). U modelování náročnějších ploch je výhodnější vytvářet jednotlivé plochy navazováním základních ploch, tzv. plátů. V počítačové grafice se nejčastěji využívá parametrický zápis, kdy je plocha popsána svým parametrickým vyjádřením. Pro parametrický zápis platí bodová rovnice pa- rametrické plochy 푄(푢, 푣) = [푥(푢, 푣), 푦(푢, 푣), 푧(푢, 푣)], (1.25) kde 푥(푢, 푣), 푦(푢, 푣) a 푧(푢, 푣) jsou funkce dvou parametrů 푢, 푣 ∈ ⟨0, 1⟩.

Tečné vektory (viz obr. 1.5) ⃗푞푢(푢, 푣) a ⃗푞푣(푢, 푣) jsou určeny vztahy 휕푄(푢, 푣) 휕푥(푢, 푣) 휕푦(푢, 푣) 휕푧(푢, 푣) ⃗푞 (푢, 푣) = = ( , , ), (1.26) 푢 휕푢 휕푢 휕푢 휕푢

휕푄(푢, 푣) 휕푥(푢, 푣) 휕푦(푢, 푣) 휕푧(푢, 푣) ⃗푞 (푢, 푣) = = ( , , ). (1.27) 푣 휕푣 휕푣 휕푣 휕푣

16 Parametrická rovnice tečné roviny 푇 (푟, 푠) k ploše Q je určena tečnými vektory ⃗푞푢,

⃗푞푣 [6]. V bodě 푄(푢, 푣) ji definujeme jako

푇 (푟, 푠) = 푄(푢, 푣) + 푟 ⃗푞푢 + 푠⃗푞푣, kde 푟, 푠 ∈ 푅. (1.28)

Normálový vektor ⃗푛 v bodě 푄 (viz lupa na obr. 1.5) vypočítáme jako vektorový součin vektorů ⃗푞푢, ⃗푞푣 podle vztahu ⃗푞 × ⃗푞 ⃗푛 = 푢 푣 . (1.29) |⃗푞푢 × ⃗푞푣|

Obr. 1.5: Parametrická plocha [6]

Při návrhu parametrických ploch se můžeme setkat z následujícími pojmy: Hlavní křivka plochy ve směru parametru 푢 je každá křivka, která je určena rovnicí 푄(푢, 푘), kde 푘 označujeme pevný parametr a 푢 je proměnný parametr. Ve směru parametru 푣 je křivka určena rovnicí 푄(푘, 푣), kde pevný parametr je 푢 a proměnný 푣. Rohy plochy označujeme body 푄(0, 0), 푄(1, 0), 푄(0, 1), 푄(1, 1). Strany plochy jsou hlavní křivky plochy 푄(푢, 푣). Pro směr 푢 jsou to hodnoty 푣 = 0 nebo 푣 = 1 a pro směr 푣 jsou to hodnoty 푢 = 0 nebo 푢 = 1. Tyto čtyři strany tvoří dohromady okraj plochy. Pláty označujeme jednotlivé části ploch. Složité plochy lze získat následným nava- zováním těchto plátů tzv. plátováním. Při navazování plátů budou pro nás důležité pojmy geometrická spojitost 퐺 a parametrická spojitost 퐶.

17 ˆ Spojitosti 퐶0 je dosaženo v případě, že dva pláty mají společnou stranu, která je křivkou třídy alespoň 퐶0. ˆ Spojitosti 퐶1 je dosaženo, je-li strana spojitá křivka a příčné parciální derivace k této straně jsou shodné pro první i druhý plát. ˆ Spojitosti 퐺1 je dosaženo v případě, že dva pláty jsou 퐺1 spojité, mají-li spo- lečnou stranu, která je alespoň 퐺1 spojitou křivkou a jsou-li parciální derivace obou plátů podél této strany ve směru napojení lineárně závislé s koeficientem 푘 > 0.

Při vytváření ploch zadáváme jejich řídící body a bázové funkce. U trojrozměr- ného modelování se většinou využívají aproximační plochy. Z důvodu složitosti se při interpolaci řídících bodů ve třech dimenzích obvykle využívají interpolace ploš- kami (tzv. polygonizace). Pro dobré vlastnosti se nejčastěji používá jako polygon trojúhelník. Pro bázové funkce u ploch využíváme nejčastěji polynomy třetího stupně pro je- jich snadnou diferencovatelnost a rychlou vyčíslitelnost. Kubikou nazýváme polynom nejmenšího stupně s odpovídajícími vlastnostmi, který zároveň umožňuje spojitost 퐶1 a 퐶2. S polynomy vyššího stupně roste časová náročnost. Modelování ploch pro- bíhá úpravami sítě řídících bodů. Při změně polohy řídících bodů se mění tvar plochy [5].

1.5.1 Bézierovy plochy

Bézierovy plochy patří mezi základní metody pro tvorbu povrchu těles v počítačové grafice. Tyto plochy nám přináší několik nesporných výhod. Plochy můžeme snadno diferencovat, snadno se modelují a lze jednoduše vypočítat průsečík s paprskem. Bézierovu plochu stupně 푛 × 푚 můžeme definovat pomocí následujícího vztahu

푛 푚 ∑︁ ∑︁ 푛 푚 (1.30) 푃 (푢, 푣) = 푃푖,푗퐵푖 (푢)퐵푗 (푣), 푖=0 푗=0 kde nám určuje síť řídících bodů o velikosti a 푛 푚 푃푖,푗 (푛 + 1) × (푚 + 1) 퐵푖 (푢)퐵푗 (푣) nám tvoří Bernsteinovy polynomy (viz kap.1.4) dvou proměnných 푢, 푣 [6]. V případě, že do rovnice (1.30) dosadíme za 푢 = 0, 푣 = 0 dostaneme výrazy pro tečné vektory v rohu 푄(0, 0) a analogicky dosazujeme i pro ostatní rohy.

⃗푞푢(0, 0) = 푛(푃10 − 푃00), (1.31)

⃗푞푣(0, 0) = 푚(푃01 − 푃00). (1.32)

18 V případě, že potřebujeme vypočítat normálu plochy ⃗푛 v bodě 푄(푢, 푣), získáme jí dosazením do vzorce (1.29) jako vektorový součin tečných vektorů v tomto bodě [6].

Bézierovy bikubické plochy patří mezi nejčastěji používaný typ Bézierovy plochy. Bézierův bikubický plát můžeme vidět na obr. 1.6. Bézierova bikubická plo- cha vznikne dosazením hodnot 푛 = 푚 = 3 do vztahu (1.30) [6] tedy dostaneme

3 3 ∑︁ ∑︁ 푄(푢, 푣) = 푃푖,푗퐵푖(푢)퐵푗(푣). (1.33) 푖=0 푗=0

Tečný vektor ⃗푞푢 ve směru 푢 v obecném bodě 푄(푢, 푣) získáme derivací vztahu pro vektor 푈 휕푈 휕 푈 = = [푢3 푢2 푢 1] = [3푢2 2푢 1 0] (1.34) 푢 휕푢 휕푢 a dosazením do (1.33) 푇 푇 (1.35) ⃗푞푢 = 푈푢푀퐵푃 푀퐵 푉 . Maticový zápis pro výpočet souřadnic Bézierových bikubický ploch můžeme vidět na následujícím vztahu

⎡ 푣3 ⎤ ⎢ 푣 ⎥ 푇 푇 3 2 푇 ⎢ 2 ⎥ (1.36) 푥(푢, 푣) = 푈푀푃푥푀 푉 = [푢 , 푢 , 푢, 1]푀푃푥푀 ⎢ ⎥ , ⎣ 푣1 ⎦ 1

푇 푇 푦(푢, 푣) = 푈푀푃푦푀 푉 , (1.37)

푇 푇 푧(푢, 푣) = 푈푀푃푧푀 푉 , (1.38)

kde푃푥, 푃푦, 푃푧 jsou tvořeny maticí 4×4. Tyto vztahy pro výpočet 16 řídících bodů jsou využity i ve třetím appletu. Polygonizace Bézierových bikubických ploch Polygonizací myslíme pře- vod plochy na síť polygonů přičemž nejčastěji se využívá trojúhelník pro jeho dobré vlastnosti. Pro převod Bézierové bikubické plochy na síť trojúhelníků můžeme vy- užít dvě metody. První metoda se aplikujeme postupným dosazováním do vztahu (1.30) za 푢, 푣. V každém kroku tak získáme čtverec, určený rohy Bézieorovy plochy, který je následně dělitelný na dva trojúhelníky. Mezi nevýhody této metody patří nerespektování zakřivení plochy. Mezi výhody jednoduchost implementace. Druhá metoda pracuje na principu rekurzivního dělení plátů (patch splitting), která využívá algoritmus de Casteljau (viz kap. 1.4.2).

19 Obr. 1.6: Bézierův bikubický plát

1.6 Geometrické afinní transformace

Geometrické transformace patří mezi nejčastější využívané úlohy v počítačové gra- fice. Tyto transformace můžeme rozdělit na lineární a nelineární. Mezi základní operace lineárních transformací patří otočení, posunutí, změna měřítka, zkosení a operace vzniklé jejich kombinací. Nelineární transformace vznikají při náročnějších změnách tvaru, např. deformace nebo warping obrazu. Pro snadnější výpočet transformací se v praxi využívají homogenní souřadnice. Použití homogenních souřadnic nám přináší výhodu zapsání často využívaných li- neárních transformací v jediné matici. Mezi další výhody patří rychlé zpracování grafickými procesory nebo vyjádření inverzní transformace pomocí inverzní matice. Výhod homogenních souřadnic využíváme také při perspektivním promítání a sklá- dání matic. Bod 푃 vyjádříme pomocí homogenních souřadnic 푥, 푦, 푧, 푤, kde souřad- nici 푤 nazýváme váhou bodu. Pro bod 푃 platí

푥 푦 푧 푋 = , 푌 = , 푋 = , 푤 ̸= 0. (1.39) 푤 푤 푤 Transformaci bodu 푃 = [푥, 푦, 푧, 푤]푇 do bodu 푃 ′ = [푥, 푦, 푧, 푤]푇 získáme předpisem

푃 ′ = 퐴푃. (1.40) Stěžejním tématem pro naší práci je Trojrozměrná geometrická transformace. Jedná se o zobecnění rovinné transformace přičemž k vyjádření využíváme matice 4×4. Obrázky pro jednotlivé geometrické transformace byly vytvořeny v programu dostupném na stránkách [8].

20 1.6.1 Posunutí

Posunutí znázorněné obr. 1.7 vyjadřujeme pomocí vektoru ⃗푝 = (푋푡). Transformační matice 푇 zapisujeme ve tvaru ⎡ ⎤ 1 0 0 푋푡 ⎢ 0 1 0 푌 ⎥ ⎢ 푡 ⎥ (1.41) 푇 = 푇 (푋푡, 푌푡, 푍푡) ⎢ ⎥ . ⎣ 0 0 1 푍푡 ⎦ 0 0 0 1

Obr. 1.7: Posunutí v ose 푦

1.6.2 Rotace

Rotace kolem osy 푥 znázorněné na obr. 1.8 je reprezentováno maticí 푅푥, kde 훼 repre- zentuje úhel otočení. Uveden je zde případ, kdy osou rotace je jedna ze souřadných os ⎡ 1 0 0 0 ⎤ ⎢ 0 cos 훼 − sin 훼 0 ⎥ ⎢ ⎥ (1.42) 푅푥(훼) = ⎢ ⎥ . ⎣ 0 sin 훼 cos 훼 0 ⎦ 0 0 0 1 Analogicky jsou sestaveny matice pro otáčení kolem osy 푦 a 푧

⎡ cos 훽 0 sin 훽 0 ⎤ ⎢ 0 1 0 0 ⎥ ⎢ ⎥ (1.43) 푅푦(훽) = ⎢ ⎥ , ⎣ − sin 훽 0 cos 훽 0 ⎦ 0 0 0 1

21 ⎡ cos 훾 − sin 훾 0 0 ⎤ ⎢ sin 훾 cos 훾 0 0 ⎥ ⎢ ⎥ (1.44) 푅푧(훾) = ⎢ ⎥ . ⎣ 0 0 1 0 ⎦ 0 0 0 1

Obr. 1.8: Rotace kolem osy 푥

1.6.3 Změna měřítka

Změnu měřítka znázorněná na obr. 1.9 popisujeme pomocí matice ⎡ ⎤ 푠푥 0 0 0 ⎢ 0 푠 0 0 ⎥ ⎢ 푦 ⎥ (1.45) 푆(푠푥, 푠푦, 푠푧) = ⎢ ⎥ , ⎣ 0 0 푠푧 0 ⎦ 0 0 0 1 kde platí 푆−1(푠 , 푠 , 푠 ) = 푆( 1 , 1 , 1 ). Změna směru v příslušné souřadnicové ose 푥 푦 푧 푠푥 푠푦 푠푧 je vyjádřena pomocí koeficientů 푠푥 ̸= 0, 푠푦 ̸= 0 a 푠푧 ̸= 0.

Obr. 1.9: Změna měřítka v ose 푧

22 1.6.4 Zkosení

Zkosení se rozdělujeme na tři případy podle směru jednotlivých rovin 푦푧, 푥푧 a 푦푧. Jednotlivé případy můžeme vidět na následujících maticích

⎡ ⎤ 1 푠ℎ푦 푠ℎ푧 0 ⎢ 0 1 0 0 ⎥ ⎢ ⎥ (1.46) 푆ℎ푦푧 = ⎢ ⎥ , ⎣ 0 0 1 0 ⎦ 0 0 0 1

⎡ 1 0 0 0 ⎤ ⎢ 푠ℎ 1 푠ℎ 0 ⎥ ⎢ 푥 푧 ⎥ (1.47) 푆ℎ푥푧 = ⎢ ⎥ , ⎣ 0 0 1 0 ⎦ 0 0 0 1

⎡ 1 0 0 0 ⎤ ⎢ 0 1 0 0 ⎥ ⎢ ⎥ (1.48) 푆ℎ푥푦 = ⎢ ⎥ . ⎣ 푠ℎ푥 푠ℎ푦 0 0 ⎦ 0 0 0 1

1.6.5 Skládání transformací

Skládání transformací probíhá postupným aplikováním jednotlivých transformací na body objektu. Při aplikaci jednotlivých transformací záleží na pořadí, v jakém se transformace provádějí. Transformace vzniklé složením z dílčích transformací lze vy- jádřit jedinou maticí. Tato matice vzniká postupným násobením jednotlivých matic, kde se pozdější matice přidávají do složeného tvaru zleva. Pokud se tedy transfor- mace provádí v pořadí 퐴1, 퐴2 je bod P transformován vztahem

′ 푃 = 퐴2 × 퐴1 × 푃. (1.49)

1.7 Promítání

Promítáním nazýváme transformaci, která převádí trojrozměrný objekt do dvouroz- měrného tvaru a tedy dochází ke ztrátě třetího rozměru [9]. Při této ztrátě může dojít k určitému zkreslení, proto vybíráme různé druhy promítání dle účelu promí- tání. Důležitým pojmem využívaným v promítání je průmětna. Jedná se o plochu v prostoru, na které se promítají paprsky od všech bodů ve scéně a v místě dopadu vytvářejí průmět. Při promítání využíváme dva souřadné systémy ˆ WCS tyto souřadnice jsou pevně zadány a nedají se měnit. ˆ VCS tyto souřadnice se mění s pohybem kamery.

23 Obecně je promítání vyjádřeno středem (směrem) promítání a průmětnou. Rovinné projekce dělíme na dvě základní třídy rovnoběžné (paralelní) a perspektivní promí- tání.

1.7.1 Kamera

U promítání je v první fázi pro nás důležité správné určení předpisu transformace, tj. vymezení pozice pozorovatele, orientace průmětny a určení směru a cíle pozorování. Pozici, ze které se pozorovatel dívá na scénu, nazýváme pozice kamery. V prostoru je kamera umístěna v bodě se směrovými souřadnicemi (푥푐푎푚, 푦푐푎푚, 푧푐푎푚, 1). V prvním kroku ve scéně zvolíme bod, který nám bude určovat směr kamery. Tento bod je reprezentován jednotkovou maticí a značíme ho 푙. Požadujeme, aby projekční matice 푇 푇푐푎푚 převedla vektor 푙 na [0, 0, −1, 0] . Následně potřebujeme určit horní stranu kamery, kterou značíme ℎ a je kolmá na 푙. Požadujeme, aby jeho VCS obraz byl [1, 0, 0, 0]푇 . Třetí vektor ⃗푝 vypočítáme vektorovým součinem 푙 × ℎ, který je kolmý na oba dva předchozí vektory. Jeho výsledný obraz nechť je [0, 1, 0, 0]푇 . Výsledná projekční matice vznikne, inverzí maticové soustavy vzniklé z těchto tří vektorů. Tato matice má tvar ⎡ ⎤ 푝푥 푝푦 푝푧 0 ⎢ ℎ ℎ ℎ 0 ⎥ ⎢ 푥 푦 푧 ⎥ (1.50) 푇푐푎푚 = ⎢ ⎥ . ⎣ −푙푥 −푙푦 −푙푧 0 ⎦ 0 0 0 1

1.7.2 Rovnoběžné promítání

Rovnoběžné promítání patří mezi nejjednodušší typy promítání. Při rovnoběžném promítání jsou zachovávány úhly a rovnoběžnost čar s promítací rovinou. Střed pro- mítání je nevlastní a promítací přímky jsou určeny směrem promítání. Na příkladě

(1.51) můžeme vidět matici jejíž průmětná rovina 푥0 je rovnoběžná s rovinou 푦푧

⎡ ⎤ 0 0 0 푥0 ⎢ 0 1 0 0 ⎥ ⎢ ⎥ (1.51) 푇푦푧 = ⎢ ⎥ . ⎣ 0 0 1 0 ⎦ 0 0 0 1

1.7.3 Středové promítání

Středové promítání vytváří obrazy, které se nejvíce přibližují vnímání běžné reality lidským okem. Promítání nemá vlastní střed a promítací přímky procházející jedním bodem, tzv. středem promítání. Velikost objektu se mění se vzdáleností od středu promítání. U středového promítání se nezachovává rovnoběžnost. Výjimkou jsou

24 prostorové úsečky ležící v rovině, které jsou rovnoběžné s průmětnou. V případě, že je kamera umístěna v počátku souřadnicového systému 푊 퐶푆 a zároveň je rovina 푥푦 průmětnou, můžeme výslednou matici zapsat ve tvaru

⎡ 1 0 0 0 ⎤ ⎢ 0 1 0 0 ⎥ ⎢ ⎥ (1.52) 푇푝푒푟 = ⎢ ⎥ . ⎣ 0 0 1 0 ⎦ 1 0 0 푧 1 V praxi rozlišujeme tři druhy středového promítání, které odpovídají orientaci vůči osám souřadného systému [4, 2]. Jednobodová perspektiva – tento případ vzniká, když průmětna protíná jedinou souřadnicovou osu (viz obr. 1.10).

Obr. 1.10: Jednobodová perspektiva

Dvoubodová perspektiva – tento případ vzniká, když průmětna protíná dvě sou- řadnicové osy (viz obr. 1.11). Trojbodová perspektiva – tento případ vzniká, když průmětna protíná všechny tři souřadnicové osy (viz obr. 1.12).

25 Obr. 1.11: Dvoubodová perspektiva

Obr. 1.12: Trojbodová perspektiva

26 2 JAVA

Java patří mezi objektově orientované programovací jazyky. První verze jazyka Java byla vydána v květnu roku 1995 firmou Sun Microsystems. Za několik málo letsvé existence jazyk Java prošel bouřlivým vývojem a postupně se stal jedním z nejpo- užívanějších programovacích jazyků. V roce 2007 společnost Sun zveřejnila všechny zdrojové kódy Javy a od té doby je jazyk Java vyvíjen jako Open Source. Mezi největší přednosti jazyku Java patří jeho přenositelnost a nezávislost na platformě. Největší rozvoj v současnosti zažívá jazyk v oblasti mobilních technologií a interne- tových aplikací. Kompletní podporu jazyku Java můžeme nalézt na její projektové stránce na adrese [7].

2.1 3D grafika v Javě a přehled technologií pro její realizaci

Java ve standardní distribuci 3D grafiku nepodporuje. Pro trojrozměrnou grafiku v Javě existují API(Application Programming Interface), které jsou distribuovány jako volitelné balíčky. Tyto balíčky umožňují zprostředkovat propojení mezi Javou a OpenGL(Open Graphics Library). Některé z těchto řešení zprostředkovávají pouze přímé spojení mezi Javou a OpenGL. Jiná jsou komplexní balíčky usnadňující práci s texturami, objekty nebo například zvukem. Techniky pro tvorbu 3D grafiky mů- žeme rozdělit na dvě skupiny: ˆ Nízko-úrovňové rozhraní – do této skupiny patří např. LWJGL(Lightweight Java Game Library) nebo Java OpenGL(JOGL). ˆ Rozhraní s vlastní grafem scén – do této skupiny můžeme zařadit knihovnu Java 3D. Níže se uvedeme stručný popis zmiňovaných technologií.

2.1.1 LWJGL (Lightweight Java Game Library)

LWGL je OpenSource knihovna určená jak pro profesionální tvůrce her, tak pro amatérské programátory. LWJGL se běžně užívá pro vývoj počítačových her a multimediálního softwaru. Tato knihovna umožňuje přístup vývojářům k výkon- ným multiplatformním knihovnám jako OpenGL a OpenAL(Open Audio Library). Díky tomu umožňuje společně s vývojem 3D her vytvářet i 3D zvuk. Mezi další funkce LWJGL patří podpora joysticků, volantů a dalších herních zařízení. Pro vazbu na OpenGL využívá LWJGL mapování OpenGL funkcí z jazyka C do Javy. Tato knihovna však neumisťuje Canvas na SWING komponentu. Pro zobrazování

27 využívá vlastní zobrazovací okno. Při vývoji byl kladen důraz na na jednoduchost, přenositelnost a výkon. První stabilní verze 1.0 vyšla v lednu 2007.

2.1.2 Java 3D

Java 3D API je knihovna vyvinutá za účelem tvorby 3D grafiky v programové pro- středí Java. Tato knihovna je distribuována jako volitelný balíček. Nejnovější do- stupná verze k dispozici je 1.5.2. Tato knihovna staví na technologiích DirectX a OpenGL, s možností volby kterou knihovnu využít. K vytváření rozličných scén Java 3D využívá vysokoúrovňové konstrukce. Zá- kladní prvek každé scény tvoří objekt „virtuální vesmír“ (VirtualUniverse), který odkazuje na veškeré objekty ve scéně. Daleko častější využití u jednodušších pro- gramů nachází třídy SimpleUniverse, které tvoří podtřídu třídy virtuální vesmír. Veškeré objekty ve scéně tvoří stromovou strukturu, kde kořen tvoří již zmiňovaný virtuální vesmír. Do virtuální vesmíru se vkládá struktura BranchGroup, která obsa- huje objekty, sloužící k zobrazení scény. Třída Appearance nám umožňuje pohybovat s objekty, měnit jejich barvu nebo aplikovat textury na jejich povrch. Oblast pro vykreslování trojrozměrné grafiky se nazývá Canvas 3D. Jedná se o obdélníkový po- hled na naše objekty umístěné ve virtuálním vesmíru. Canvas 3D využívá výhod grafických karet, ale má tu nevýhodu, že nefunguje příliš dobře s grafickým roz- hraním SWING. Grafické rozhraní SWING využívá tzv. lehké komponenty, které mohou být skryty v Canvas 3D. Řešením může být buď využití starších komponent AWT(Abstract Windowing Toolkit), nebo užití těžkotonážních komponent. Návrh scén můžeme vidět na následujícím příkladě uvedeném na obr. 2.1, kde v pravé části obrázku jsou zobrazeny symboly využívané pro návrh grafu scén a v levé části je zobrazen jednoduchý příklad pro vykreslení barevné krychle. V první fázi příkladu si vytvoříme scénu s barevnou krychlí, jejímž rodičem bude objekt Trans- formGroup, následně ji zkompilujeme a teprve až potom ji budeme transformovat úpravou objektu TransformGroup [13].

2.1.3 Java OpenGL (JOGL)

Java Bindings for OpenGL (JOGL)[10] je API, které nám umožňuje přímý přístup k službám OpenGL. Na rozdíl od Javy 3D poskytuje JOGL rozhraní na nižší úrovni. JOGL poskytuje obdobné možnosti jako LWJGL je však integrován do knihoven AWT a SWING a i rozsahově je znatelně objemnější. Přístup k službám OpenGL realizuje JOGL pomocí tzv. NIC(Java Native In- terface), což je framework umožňující volat v Javě knihovny a aplikace napsané v jiném programovacím jazyku. Díky tomu může být velká část kódu generována

28 Obr. 2.1: Jednoduchý graf scén automaticky z hlavičkových souborů OpenGL jazyka C. Díky tomuto řešení je pro programátory znající OpenGL z jazyka C tento přístup snažší pro naučení.

2.2 Java applety

Applet je malý přenositelný program v Javě, který je určen primárně pro webové stránky. Applet nespouštíme přímo, ale otevřením HTML dokumentu, kde ho umís- ťujeme pomocí speciální značky ⟨applet⟩. Kdykoli webový prohlížeč narazí na tuto značku pokusí se z webového serveru načíst příslušnou třídu. V případě úspěchu spustí třídu ve virtuálním stroji a předá jí svůj kontext. Applet se následně stará o pro něj vyhrazený region okna. Applet má od ostatních aplikací několik základních odlišností. První změna od klasické aplikace je že postrádá vstupní veřejnou static- kou metodu main(). Další z odlišností je důraz na bezpečnost. Z důvodu stahování appletu z prostředí Internetu nelze každý applet považovat za důvěryhodný. Proto je každý applet jednak podepsán ověřeným certifikátem a spouštění probíhá v ome-

29 zeném kontextu prohlížeče tzv. sandboxu. Každý applet je odvozen od třídy Applet z balíku java.applet, ke kterému je potřeba importovat balík java.awt pro zobra- zení grafického uživatelského prostředí. Mezi výhody Java appletu můžeme počítat vyšší rychlost oproti Javascriptu a možnost tvorby složitějšího dynamického obsahu na statických webových stránkách [1]. Na obrázku 2.2 můžeme vidět životní cyklus appletu v závislosti na stavu prohlížeče webových stránek.

Obr. 2.2: Životní cyklus appletu

30 3 OPENGL

OpenGL je knihovna od firmy SGI(Silicon Graphics Inc.). Tato knihovna byla na- vržena jako API, které využívají grafické akcelerátory. Knihovna OpenGL je navr- žena takovým způsobem, aby byla nezávislá na typu grafické karty nebo platformě. OpenGL rozhraní podporuje platformy Windows, , MacOS a Solaris.. Progra- mátorské rozhraní OpenGL je navrženo pro libovolný programovací jazyk. Primárně je však určeno pro jazyk C a C++. Z vývojového hlediska se OpenGL chová jako stavový automat. Tedy, když v OpenGL nastavíme určitý stav, tento stav nám zů- stává explicitně dokud ho nezměníme. Výhodou tohoto přístupu je, že například jediným příkazem můžeme měnit vykreslování celé scény. Z hlediska datové repre- zentace poskytuje OpenGL pouze základní rozhraní, to však můžeme rozšířit pomocí přídavných knihoven. Jednou z rozšiřujících knihoven, kterou využíváme v praktické části diplomové práce je knihovna GLU(OpenGL Utilities). Díky této knihovně mů- žeme využívat například kvadriky (koule, válce, disky), dále tesselátory (rozložení nekonvexních polygonů na trojúhelníky) nebo evaluátory (výpočet souřadnic bodů ležících na parametrických plochách) [3].

3.1 Transformační matice a lineární transformace

Pro realizaci lineárních transformací viz kapitola 1.6 OpenGL využívá transformační matice o velikosti matice 4×4. V OpenGL rozlišujeme tři transformační matice. První transformační matici nesoucí název ModelView matrix využíváme, jak pro umístění pozice kamery, tak pro manipulaci s objekty ve scéně. Druhá z používaných matic se jmenuje Projection matrix a využívá se při nastavování perspektivní pro- jekce kamery. Poslední z využívaných matic se nazývá Viewport matrix a využíváme ji k mapování objektů z abstraktních souřadnic do souřadnic okna po provedení perspektivní matice. Výše uvedené matice využíváme při transformacích v našich appletech.

3.2 Tvorba osvětlení

V OpenGL tvorba materiálu objektů umístěných ve scéně probíhá pomocí nastavení světel. Tvorbu materiálu je spíše lepší upřesnit jako nastavení barevných složek pro jednotlivé složky světla. OpenGL pracuje s trojicí barevných složek: červená barva (Red – R), zelená barva (Green – G) a modrá barva (Blue – B). Vzájemnou kombi- nací těchto složek můžeme vytvořit téměř jakoukoli viditelnou barvu. Výpočet barvy objektů probíhá na základě tzv. Phongova osvětlovacího modelu. V Phongově mo- delu se světlo rozkládá na tři složky. Pvní složka je tzv. ambientní (ambient). Tato

31 složka nám představuje okolní světlo, které není přímo vyzařováno v žádném ze svě- telných zdrojů. Druhou složku světla nazýváme difúzní(diffuse). Tato světelná složka nám představuje světlo, které na povrch objektu dopadá z konkrétního zdroje světla a dále se od povrchu objektů odráží do všech směrů ze stejnou intenzitou. Poslední složku modelu tvoří odlesky (specular). K odleskům dochází v případě, že na povrch tělesa dopadá paprsek z konkrétního zdroje světla a tento paprsek se odráží podle známého zákona o odrazu a lomu. Při nastavování světel postupujeme v několika krocích. První krok je nastavení směru normálového vektoru na polygon. Tento vek- tor má jednotkovou velikost a je kolmý na plochu polygonu. V dalším kroku musíme nastavit zdroj světla, kterých v OpenGL může být až osm. Tyto světla lze nezá- visle na sobě povolit či zakázat a označují se GL_LIGHT0 až GL_LIGHT7. V OpenGL rozlišujeme tři typy světel: směrové, bodové a reflektor. Bodové světlo patří mezi nejjednodušší a můžeme si ho představit jako žárovku, která vyzařuje světlo stejnou intenzitou na všechny strany. Směrové světlo nemá daný žádný pevný světelný zdroj a šíří ze z jednoho směru bez ohledu na pozici objektů ve scéně (za směrové světlo lze považovat např. slunce). Posledním a nejsložitějším typem světel v OpenGL je Reflektorové světlo. Tento typ si můžeme představit jako reflektor, který míříkuže- lem světla pouze na zadaný bod na scéně. Pro podrobnější seznámení se světelnými zdroji doporučuji literaturu [3].

32 4 PRAKTICKÁ ČÁST

4.1 Rozbor praktické části

V praktické části diplomové práce jsou shrnuty požadavky, které jsou kladeny na jednotlivé applety a následně je stručně popsána programová realizace appletů. Pro tvorbu appletů je použit jazyk Java, kde byly využity zásady objektově orientova- ného programování pro možnost budoucího rozšíření programu. Pro tvorbu 3D grafiky v Javě je využita knihovna JOGL. Tato knihovna nejvíce odpovídá potřebám vybraných úloh z počítačové grafiky. Důvody k tomuto rozhod- nutí vidím ve vyhnutí se zbytečně náročné objektové struktuře, kterou poskytuje Java 3D (detekce kolizí, složité scény s osvětlením). Mezi další výhody patří mož- nost využití knihovny SWING pro návrh grafického uživatelského rozhraní, které bylo realizováno v semestrální práci. Při návrhu byl kladen důraz na objektově orientovanou strukturu. Z tohoto dů- vodu je každý applet rozdělen do několika samostatných balíčků. Grafická uživatelská prostředí appletů byla koncipována tak, aby byla jednoduchá a intuitivní. Pro reali- zaci appletu bylo vytvořeno velké množství tříd a vztahy mezi jednotlivým třídami nemusí být na první pohled jasné. Proto jsou vztahy mezi třídami pro jednotlivé applety vyznačeny v UML diagramech nacházejících se v příloze B. Podrobné po- pisy jednotlivých funkcí využitých z knihovny JOGL lze nalézt v dokumentacích javadoc, které jsou dostupné na stránkách projektu [11]. Samotná realizace appletů probíhala v programové prostředí Netbeans 7.1.1 s využitím Java Development Kit (JDK 1.7.)

4.1.1 Implementace knihovny JOGL

Knihovna JOGL podporuje systémy Windows, Linux, MacOS a Solaris. Pro insta- laci se předpokládá, že počítač obsahuje verzi Javy minimálně 1.5 popřípadě vyšší. Knihovny jsou volně dostupné ze stránek projektu Jogamp [12]. Na těchto strán- kách můžeme najít aktuální archívy JOGL knihovny ve formátu zip, které podporují různé verze operačních systémů. V mém případě probíhal vývoj na platformě Windows 7 32-bit. Jako knihovna byla využita verze v2.0-rc4. Tato knihovna je dostupná jak ze stránek projektu Jogamp, tak na přiloženém CD. Tento archiv obsahuje tyto jar soubory: ˆ glugen-rt.jar, ˆ jogl.all.jar,

33 V prvním archívu jsou obsaženy třídy nástroje GlueGen, který generuje JNI (Java Native Interface) kód. Ve druhém archívu jsou obsaženy všechny třídy knihovny JOGL. V případě využití JOGL knihovny v appletech musí server obsahovat odkaz na uvedené jar soubory. Podrobný návod na instalaci knihovny včetně kódu pro vložení knihoven na internetové stránky můžeme nalézt v příloze A.

4.2 Applet Geometrické transformace

Tento applet má sloužit k názorné ukázce vybraných operací z oblasti geometrické transformace. Grafické rozhraní můžeme vidět na obr. 4.1. Applet umožňuje prová- dět operace posunutí, rotaci, změnu měřítka, zkosení a jejich vzájemné kombinace. Počet kombinací, které student může provést je omezen z důvodu kompaktnosti na hodnotu tři. V každém kroku uživatel může provést jeden výběr transformace. Po výběru se zbývající volby znepřístupní. Od appletu se požaduje, aby v jednotlivých krocích dokázal zobrazit hodnoty matice a výslednou matici po všech transforma- cích. Horní část appletu je tvořena čtyřmi grafy. V pravé dolní části lze vidět 3D graf, který slouží pro vyobrazení vybraného 3D modelu. Sousední tři grafy budou sloužit pro vyobrazení 3D modelu ve třech různých úhlech pohledu. V pravé části appletu můžeme nalézt tři funkční tlačítka. První tlačítko „vyber tvar“ slouží pro volbu ze tří možných 3D objektů. Tlačítko „reset“ slouží pro vymazání všech hodnot jak v grafech, tak v maticích. Tlačítko „vymaž poslední operaci“ slouží pro vymazání aktuální transformace v každém sloupci.

4.2.1 Programová realizace appletu

Struktura prvního appletu je rozčleněna do pěti základních balíčků. Hlavním cílem appletu je aplikování jednotlivých geometrický operací. Pro provedení geometric- kých operací využíváme funkce glTranslate()– posunutí, glShear()– změna měřítka, glScale()– zkosení a glRotate()– rotace, které jsou definované v knihovně JOGL. Druhou důležitou funkcí appletu je vyplnění jednotlivých matic hodnotami. Protože OpenGL již pracuje s maticemi (viz kap. 3.1)velikosti 4×4 stačí nám tuto matici vyvolat pomocí funkce gl2.glMatrixMode(GL2.GL_MODELVIEW) a vyplnit obsahem této matice námi již přednastavenou matici. U výpočtu finální matice vyvoláváme obsah matice MODELVIEW až po vynásobení dílčích operací z jednotlivých control panelů. Princip control panelů bude vysvětlen níže. O vykreslení scény do appletu a doplnění dílčích matic se nám stará třída SceneControler.java. Vykreslení scény probíhá na komponentu GLCanvas. Níže si uvedeme podrobnější popis jednotlivých balíčků a v nich obsažených tříd.

34 Balíček Applet1 – Tento balíček obsahuje hlavní třídu Applet1.java. Pomocí této třídy spouštíme celý applet. V této třídě probíhá inicializace jednotlivých vizu- álních komponent a přidělení funkcí ovládacím prvkům. Všechny komponenty jsou umístěny v třídě JApplet. Rozložení komponent můžeme vidět na obr. 4.1. Další třída obsažená v tomto balíčku je třída SceneControler.java. Tato třída se nám stará jednak o vykreslení celá scény, tak o naplnění dílčích matic výslednými hod- notami jednotlivých transformací.

Obr. 4.1: GUI appletu geometrická transformace

Balíček Graf – Hlavní třída v tomto balíčku je třída GLPanel.java (obr. 4.2). Tato třída se stará o inicializaci OpenGL a implementuje třídu GLCanvas. Zároveň je v této třídě definováno osvětlení scény. Detailní popis nastavení osvětlení je popsán v kapitole 3. V našem případě je osvětlení řešeno jen na základní úrovni, kdy jsou nastaveny dva zdroje světla GL_LIGHT0 a GL_LIGHT1. U těchto světel je nastaveno abientní osvětlení. Toto nastavení je pak společné pro všechny applety. Další třída v tomto balíčku je třída GrafPanel.java. Mezi nejdůležitější funkce této třídy patří nastavení perspektivy setPerspective(), dále nastavení jednotlivých úhlů pohledu na scénu setViewport(), umístění směrových os drawAxes() a umístění úseček vymezující jednotlivé podokna drawLines(). Poslední důležitá třída v tomto balíčku je třída GLPanel4Win.java. Tato třída je podtřída třídy GLpanel.java, obsahuje čtyři GrafPanely, které nám definují čtyři pohledy na scénu.

Balíček gui – V tomto balíčku se nachází nejdůležitější třída ControlPanel.java.

35 Obr. 4.2: GUI třídy GLPanel

Hlavním úkolem této třídy je od uživatele získat jednu ze čtyř operací a předat jí třídě Applet1.java. Rozhraní třídy ControlPanel můžeme vidět na obr. 4.3. Jedná se opět o jednoduchou třídu, která je vložena do appletu třikrát. Obsahuje čtyři předdefinované operace z balíčku operation a výslednou matici. Pokud uživatel vy- plní hodnotu v jedné z operací, zbylé volby jsou znepřístupněny a vytvoří se ob- jekt Baseoperation. Tento objekt je následně předán přes třídu Applet1.java třídě SceneControler.java, kde proběhne aplikování operace do scény a doplnění hod- not do matic. Dále jsou v tomto balíčku obsaženy třídy Matrix.java, která nám definuje matici ve třídě SceneControler.java a třída ObjectMenu.java, kde přiřa- zujeme objekty do rolovacího menu. Třídy RotationPanel.java, ScalePanel.java, ShearPanel.java a TranslatePanel.java nám definují grafické rozhraní a základ- ního nastavení pro operace v balíčku operation.

Balíček object – V tomto balíčku jsou definovány jednotlivé objekty, které můžou být vykresleny v appletech. Nejpoužívanější je funkce base.object(), která definuje funkce pro vykreslení krychle, koule, konvičky. Objekty jsou generovány z knihovny GLU viz kap. 3.

Balíček operation – Tento balíček obsahuje pět tříd, které nám realizují geo- metrické operace zvolené uživatelem ve třídě Control panel.java. Třída BaseOperation.java se provede, jestliže v daném control panelu nebyla zvolena žádná operace. Tato třída nám vyplní třídu matrix jednotkovou maticí. Dále jsou zde třídy Translate – operace posunutí, třída Rotation – operace rotace, třída Shear – změna měřítka a třída Scale – operace zkosení.

36 Obr. 4.3: GUI třídy Control panel

4.3 Applet Perspektivní promítání ve 3D

Následující applet zobrazený na obr. 4.4 nám slouží pro znázornění perspektivního promítání. V tomto appletu je umístěn v levé části jeden 3D graf, který nám slouží pro zobrazení prostorového objektu a jeho perspektivy. Prostorový objekt si volíme pomocí tlačítka „vyber tvar“, kde máme na výběr ze stejných objektů jak v ap- pletu 1. Pro zadání potřebných parametrů perspektivy slouží pole v pravé části appletu. V tomto poli jsou již přednastavené čtyři parametry, které můžeme libo- volně měnit. Prvním parametrem můžeme měnit úhel záběru kamery viz obr. 4.5. Druhá hodnota určuje poměr stran viz obr. 4.6. Poměr stran je definován jako poměr w (šířka) na h(výška). Poslední dvě hodnoty určují minimální a maximální vzdá- lenost ořezových rovin viz obr. 4.7 (hodnota ořezových rovin se pohybuje přibližně okolo hodnoty 160). Tlačítko „reset“ nám stejně jako v předchozím případě slouží pro vymazaní hodnot v obou grafech i v matici.

37 Obr. 4.4: GUI appletu perspektivní promítání

Obr. 4.5: Perspektivní promítání změna úhlu záběru kamery

4.3.1 Programová realizace appletu

Tento applet je založen na obdobném principu jako applet první a pro svoji funkci využívá některé třídy definované v appletu prvním. Struktura appletu se skládá ze čtyř balíčků. Od appletu se požaduje, aby dokázal ovlivňovat hodnoty perspek-

38 Obr. 4.6: Perspektivní promítání změna poměru stran

Obr. 4.7: Perspektivní promítání úprava ořezových rovin tivy a tyto hodnoty doplnit do výsledné matice. Pro ovlivňování perspektivy vy- užíváme matici GL.PROJECTION viz kapitola 3. Tato matice nám ovlivňuje velikost perspektivy tedy, jak moc se budou vybrané objekty zmenšovat (zvětšovat). Pro nastavení perspektivní matice využíváme funkci gluPerspektive, která se řídí po-

39 hledovou pyramidou viz obr. 4.8. V našem případě je úhel záběru kamery nastaven na 45∘. Poměr stran je již přednastaven na hodnotu 1.4. Tato velikost je způso- beno velikostí zobrazovacího okna, které má tvar obdélníku. Ořezové roviny jsou nastavené na hodnoty 푍푛푒푟=0,10 a 푍푓푎푟=300. K vyplnění výsledné matice voláme funkci gl2.glGetFloatv(GL2.GL_PROJECTION_MATRIX, finalMatrix). Vykreslo- vání do scény nám opět obstarává SceneControler.java, kde vybrané tělesa se zobrazují v třídě GLPanelPer.java. Dále si uvedeme stručný popis jednotlivých tříd obsažených v balíčcích.

Obr. 4.8: Pohledová pyramida

Balíček Applet1 – V tomto balíčku je hlavní třída applet2.java, která má obdobnou funkci, jak u prvního appletu. Probíhá zde inicializace jednotlivých vi- zuálních komponent a přiřazujeme zde odpovídající funkci tlačítku „vyber tvar“ a „reset“. Druhá třída obsažená v tomto balíčku je třída SceneControler.java. Tato třída obstarává vykreslení scény a vyplňuje výslednou matici hodnotami perspektivy.

Balíček Graf – Zde probíhá vykreslování scény do třídy GLPanelPer.java. Tato třída je opět podtřída třídy GLPanel.java s tím rozdílem, že v této třídě definujeme pouze jediný pohled na těleso. Třída PerspektiveValues.java slouží pro nastavení hodnot perspektivy konkrétně se jedná o hodnoty angle, ratio, minZ, maxZ.

Balíček GUI – Třída PerspektivePanel.java nám definují grafické rozhraní rozhraní pro panel ve kterém zadáváme hodnoty perspektivy. V této třídě je kontro- lována změna hodnot pomocí metody checkInput() a v případě změny jsou předány třídě Applet2.java.

40 Balíček Object – V tomto balíčku využívá applet perspektivní promítání ty samé třídy, které byly popsány v prvním appletu. Tedy třídu BaseObject.java a třídu Object type pro nastavení typu těles. Jelikož tyto třídy byly již popsány v prvním appletu,ja princip zde nebude rozváděn.

4.4 Applet Parametrický způsob popisu 3D plochy

Applet Parametrický způsob popisu 3D plochy se skládá ze čtveřice 3D grafů a v pravé části umístěného jednoho 2D grafu. Při práci s appletem uživatel může pomocí pravého tlačítka „vyber tvar“ volit ze tří předdefinovaných tvarů Bézierových bikubických ploch (obr. 4.9, obr. 4.10, obr. 4.11). Plocha je opět vykreslena ve čtyřech různých úhlech pohledu obdobně jak u appletu Geometrická transformace. 2D graf umístěný v pravé části slouží pro manipulaci s vektory u,v. Uživatel posunováním řídícího bodu umístěného uvnitř grafu může měnit polohu vykreslovaného bodu na ploše.

4.4.1 Programová realizace appletu

Tento applet má za cíl vymodelovat jednoduchý Bézierův bikubický plát na kterém může uživatel pomocí změn hodnot u,v zvýrazňovat polohu bodu na ploše. Výpočet Bézierovy plochy je realizován převodem plochy na síť trojúhelníků a postupným dosazením hodnot u a v do vztahu platného pro Bézierův bikubický plát. Toto řešení nedosahuje v případě zakřivení plochy takových výsledků, jako použití algoritmu de Casteljau, ale pro názornou ukázku v našem appletu je dostačující. Výpočet řídících bodů probíhá ve třídě BezierSurface.java, kde jsou aplikovány vztahy uvedené v kapitole 1.5.1. Na základě těchto vztahů je vytvořen Bézierův bikubický plát, který je složen z 16 ti řídících bodů uspořádanými v parametrickém prostoru do mřížky 4×4. Třída Point3D.java nám slouží pro definování základních operací s body (vektorový součin, normalizace vektorů atd.), které jsou pak využívány pro výpočet polohy řídících bodů. V pravé části appletu je umístěna komponenta Java SWING, pomocí které můžeme ovlivňovat umístění bodů na ploše.

Balíček Applet3 – Obsahuje třídu Applet3.java, která je hlavní spustitelná třída, kde probíhá inicializace komponent. Dále třídu SceneControler.java, kde probíhá vykreslení celé scény. V této třídě je zároveň nastaveno umístění 16 řídících bodů ze kterých je tvořen Bézierův bikubický plát.

Balíček Graf – Jako zobrazovací komponentu využíváme třídu GLPanel4Win.java, která je detailně popsána v appletu 1.

41 Balíček Gui – V balíčku gui je definována třída Selector.java, která má za úkol určit pozici bodu ve 2D panelu. Tato třída je tvořena Java SWING kompo- nentou poděděnou od panelu JComponent. V této třídě jsou definovány metody FormPressed() – reakce na stisk tlačítka, Formdragged()– reakce na tažení myši a metoda paintComponent, která obsahuje funkce paintComponentdrawLine() – vykreslení rozdělovacích čar a drawOval pro vykreslení bodu na komponentě.

Balíček Object – V třídě BezierSurface.java je realizovaná polygonizace Bézierovy plochy a přepočet polohy bodu na ploše. V této třídě je nejdůležitější metodadraw(). Tato metoda obsahuje funkci genBezier() pro vygenerování Bézie- rovi bikubické plochy a funkci drawLines() pro vykreslení spojovacích čar mezi řídí- cími body. Poslední využívaná třída v tomto balíčku je třída Point3D.java, kde defi- nujeme jednotlivé operace s body, které jsou využívaný ve třídě BezierSurface.java.

Obr. 4.9: první typ Bézierovy bikubické plochy

42 Obr. 4.10: druhý typ Bézierovy bikubické plochy

Obr. 4.11: třetí typ Bézierovy bikubické plochy

4.5 Reprezentace appletů na webových stránkách

Pro prezentaci appletů byla vytvořena webová stránka, která je dostupná z URL adresy http://3dgrafikabalusek.wz.cz/index.html. Pro správnou funkčnost musí mít webový prohlížeč nainstalován Java SE Develoment Kit 1.5 a vyšší. Všechny applety jsou plně funkční a testovány na prohlížečích: Firefox 3.4.0, Internet Explorer 6, 7 Opera 10.52 a Google Chrome 4.1. Při tvorbě obsahu stránek byl kladen důraz zejména na jednoduchost a přehlednost webových stránek. Stránka je členěna do tří částí, vždy dle názvu appletu. Jednotlivé části jsou doplněny o popis ovládání

43 appletů a krátkým teoretickým úvodem k appletům. Tyto stránky budou využívány jako výukové pásmo pro snadnější pochopení vybraných úloh z počítačové grafiky. Popis začlenění appletu do webových stránek je detailně popsán v příloze A.1.

4.6 Zhodnocení výsledků

Ve všech třech appletech byly splněny cíle zadání. Vzhledem k tomu, že u appletů jsou dodržovány zásady pro objektově orientované programování, nabízí se možnost budoucího rozvoje těchto appletů. První applet by bylo možné rozšířit o interakti- vitu matic, kde by docházelo ke Geometrickým transformacím i po změně hodnot v matici. Stávající řešení využívá matice pouze jako výstupní prvek, kdy je změna jejich hodnot uživateli znepřístupněna. Dále by bylo možné stávající applet rozší- řit o možnost výběru z více předdefinovaných objektů s možností úpravy textur a osvětlení. U stávajícího řešení jsou tyto funkce řešeny jen na základní úrovni. U dru- hého appletu by bylo zajímavé přidat funkci, která by umožňovala změnu pozice kamery. Stávající řešení počítá s fixním umístěním kamery v jednom bodě, kdy uži- vatel může měnit hodnoty pohledové pyramidy. Poslední applet umožňuje rozšíření ve více částech. Ve stávající řešení jsou již přednastavené tři typy Bézierových bi- kubických ploch. Zde by bylo možné applet rozšířit o možnost ovlivňování polohy řídících bodů uživatelem. Díky tomu by uživatel mohl ovlivňovat tvar zobrazované plochy. Dále by bylo zajímavé rozšíření appletu o výpočet plochy pomocí adaptiv- ního metody algoritmu de Casteljauova, která prokazuje lepší výsledky v případě zakřivení ploch. V neposlední řadě by applet mohl být doplněn i o jiné druhy ploch např. B-spline plochy nebo NURBS plochy.

44 5 ZÁVĚR

Tato diplomová práce se zabývá tvorbou interaktivních grafických appletů, které rea- lizují úlohy Geometrické transformace, Perspektivní promítání a Parametrický popis plochy. Obsahuje také nezbytné teoretické minimum pro pochopení základů popisu ploch, jejich zpracování a vizualizace ve 3D. Při tvorbě appletů bylo postupováno dle požadavků, které byly splněny ve všech bodech. Veškeré uvedené applety jsou prezentovány na webových stránkách s nezbytným teoretickým minimem a budou v budoucnu sloužit jako praktická ukázka při výuce počítačové grafiky. V první části diplomové práce je rozebrána teorie křivek a ploch obecně. V úvodu jsou popsány základní vlastnosti křivek, které se využívají při modelování těles v po- čítačové grafice. V navazující části následuje obecný popis ploch, zejména pakBé- zierových ploch, které jsou prezentovány ve třetím appletu. Dále jsou podrobněji popsány úlohy Geometrické transformace a Perspektivní promítání, které tvoří další dva z požadovaných appletů. Druhá kapitola diplomové práce nás seznamuje s programovacím prostředím Java. Zde jsou popsány především techniky pro realizaci 3D grafiky v programo- vém prostředí Java. Dále je zde uvedeno stručné seznámení s Java appletem, který bude využíván pro tvorbu jednotlivých úloh z 3D grafiky. Poslední kapitola teoretické části práce uvádí stručný úvod do technologie OpengGL. Praktická část práce se především zaměřuje na popis a implementaci jednotli- vých appletů. V závěru práce jsou zhodnoceny výsledky práce a popsány možnosti rozšíření interaktivity appletů. V rámci diplomové práce jsem si vytvořil dostatečnou teoretickou základnu v ob- lasti teorie křivek a ploch. Dále jsem pronikl do problematiky tvorby 3D těles v pro- gramovém prostředí Java a prezentoval vybrané úlohy z oblasti počítačové jako in- teraktivní Java applety pro budoucí účely výuky. Cíle diplomové práce tedy považuji za úspěšně splněné.

45 LITERATURA

[1] BRŮHA, L.Java hotová řešení. Brno:Computer Press, 2006. 326s. ISBN 80- 251-0072-3.

[2] DRDLA, Josef.Geometrie 1. Olomouc, 2004. 81s. Skripta. UP Olomouc.

[3] HILL, F.S.Computer Graphics using Open GL. New Jersey: Prentice Hall, 2001. 909s. ISBN 0-02-254856-8.

[4] MORTENSON, M.E.Geometric Transformations for 3D Modeling. Druhé vy- dání. Industries Press, 2007. 353s. ISBN 08-311-3338-4.

[5] PIEGL, Les, et al.The NURBS Book. Druhé vydání. Berlin:Springer, 1996. 646s. ISBN 35-406-1545-8.

[6] ŽÁRA, Jiří,et al.Moderní počítačová grafika. Druhé, přepracované a rozšířené vydání. Brno:Computer Press, 2004. 609s. ISBN 80-251-0454-0.

[7] For Java Developers. [online]. 2010 [cit.2012-01-02]. Dostupné z WWW: .

[8] HAST, Anders.Centre of Computer Graphics and data Visu- alisation. [online]. 2008 [cit.2012-01-02]. Dostupné z WWW: .

[9] HOLZBAUER, M.Výukové pásmo promítacích metod. [online]. 2010 [cit.2012- 01-02]. Dostupné z WWW: .

[10] Java OpenGL. [online]. 2012 [cit.2012-01-02]. Dostupné z WWW: .

[11] Jogamp javadoc documentation. [online]. 2011 [cit.2012-01-02]. Dostupné z WWW: .

[12] Jogamp webstart archive. [online]. 2012 [cit.2012-01-02]. Dostupné z WWW: .

[13] KUŽELKA, J.Java a 3D grafika. [online]. 2003 [cit.2012-01-02]. Dostupné z WWW: .

46 SEZNAM SYMBOLŮ, VELIČIN A ZKRATEK

2D (2–Dimensional) – dvourozměrný

3D (3–Dimensional) – trojrozměrný

API (Application Programming Interface) – sada tříd,funkcí či knihoven distribuovaná cílovou platformou

AWT (Abstract Windowing Toolkit) – sada tříd pro zobrazení vykreslovaní

GLU (OpenGL Utility Library) – knihovna která se snaží doplnit chybějící funkce OpenGL

IDE (ntegrated Development Environment) – vývojové prostředí obsahující editor zdrojového kódu kompilátor , případně interpret a většinou také debugger

JDK (Java Development Kit) – Soubor základních nástrojů pro vývoj aplikací

JOGL (Java OpenGL) – jedna z možných vazeb mezi Javou a OpenGL

LWJGL (Lightweight Java Game Library) – jedna z možných vazeb mezi Javou a OpenGL

OpenAL (Open Audio Library) – standart specifikující multiplatformní rozhraní pro tvorbu aplikací využívacjící zvuk

OpenGL (Open Graphics Library) – standart specifikující multiplatformní rozhraní pro tvorbu aplikací

47 SEZNAM PŘÍLOH

A Instalace knihovny JOGL v IDE Netbeans 7.1.1 49 A.1 Umístění JOGL knihovny na WWW stránky ...... 50

B UML diagramy 52

C Obsah CD 54

48 A INSTALACE KNIHOVNY JOGL V IDE NET- BEANS 7.1.1

Pro otevření manažera knihoven musíme v horní liště otevřít položku "Run"dále "Set project configure"a "Customize". Zde zvolíme položku „libraries“. Pro přidání knihovny klikneme na tlačítko „Add library“ a zvolíme „Create“. Zde zvolíme jméno naší knihovny a potvrdíme volbu viz obr. A.1

Obr. A.1: Otevření manažera knihoven

Následně se nám otevře nové okno, kde si můžeme zvolit požadované jar soubory viz obr. A.2po potvrzení volby se nám požadované jar soubory objeví v projektu jak můžeme vidět na obr. A.3.

49 Obr. A.2: Volba jar souborů v manažeru knihoven

A.1 Umístění JOGL knihovny na WWW stránky

Pro správnou funkčnost knihovny JOGL v Java appletech musíme na server nahrát knihovnu SWING a provést odkazy na využívané jar soubory viz obr. A.4. Tyto stránky musí být doplněny o následující zdrojový kód:

50 Obr. A.3: Knihovna JOGL v projektu

Obr. A.4: FTP server

51 B UML DIAGRAMY

Obr. B.1: Diagram tříd appletu Geometrická transformace

Obr. B.2: Diagram tříd appletu Perspektivní promítání

52 Obr. B.3: Diagram tříd appletu Parametrický způsob popisu plochy

53 C OBSAH CD

Na přiloženém CD se nachází:

ˆ adresář applets – obsahuje kompletní zdrojové kódy appletu Geometrická trans- formace, Perspektivní promítání, Parametrický způsob zápisu plochy realizo- vaném ve vývojovém prostřední NetBeans 7.1.1

ˆ adresář lib – obsahuje potřebné JOGL knihovny ve formátu jar pro spuštění appletů

ˆ adresář www – obsahuje zdrojové kódy internetové stránky, kde jsou umístěné applety

ˆ adresář text – obsahuje text práce - pdf – obsahuje text uvedené práce ve formátu pdf - latex – obsahuje zdrojové kódy textu vysázeném v systému LATEX

54