• No results found

Finite Elements Visualization

N/A
N/A
Protected

Academic year: 2021

Share "Finite Elements Visualization"

Copied!
50
0
0

Loading.... (view fulltext now)

Full text

(1)

Vizualizace kone ˇcn ´ych prvk ˚u

Finite Elements Visualization

(2)
(3)
(4)
(5)

Abstract

The main aim of this thesis is the implementation of the advanced visualization plug-in/addition to the application for viewing finite element method bodies. In particular, it is the techniques of body smoothing, advanced shading models, decomposition bodies on their subbodies etc. One of the secondary tasks is for example editing user interface. The thesis also includes performance tests and their evaluation.

(6)

DP – diplomov´a pr´ace

FPS – frame per second

(7)

3.1 Reprezentace tˇeles . . . 14 3.2 Zobrazovac´ı metody . . . 17 4 Implementace 23 4.1 Qt . . . 23 4.2 Struktura aplikace . . . 23 4.3 Implementovan´e algoritmy . . . 24 5 Testov´an´ı 36 5.1 Testov´an´ı - fps . . . 38 5.2 Testov´an´ı - CPU . . . 40 5.3 Testov´an´ı - Pamˇet . . . 40 6 Z´avˇer 42 7 Reference 43

(8)
(9)

8 Stavba hraniˇcn´ıho modelu . . . 14 9 Troj ´uheln´ık . . . 15 10 CSG . . . 16 11 Mˇr´ıˇzka . . . 16 12 Raytracing . . . 19 13 Bounding box . . . 19

14 Hiearchie bounding boxu . . . 20

15 Octree . . . 20

16 Uk´azka Raytracingu . . . 21

17 Sch´ema vypoˇctu radiosity . . . 21

18 Uk´azka dekompozice . . . 24 19 Uk´azka vyhlazen´ı . . . 34 20 Uk´azka QtTreePropertyBrowser . . . 35 21 Uk´azka model 1 . . . 36 22 Uk´azka model 2 . . . 37 23 Uk´azka model 3 . . . 37

24 Testov´an´ı fps - stav v klidu . . . 38

25 Testov´an´ı fps -pracovn´ı stav . . . 38

26 Testov´an´ı fps s pr ˚uhlednost´ı . . . 39

27 Testov´an´ı CPU . . . 39

28 Testov´an´ı pamˇeti . . . 40

(10)

Seznam v ´ypis ˚u zdrojov ´eho k ´odu

1 Algoritmus pro rozklad Simple (UpdateMatrix) . . . 25

2 Pseudo algoritmus pro rozklad Tree (CreateLogic) . . . 26

3 Pseudo algoritmus pro rozklad Tree (CallUroven) . . . 27

4 Pseudo algoritmus pro rozklad Tree (NajdiShlukyRodic) . . . 27

5 Pseudo algoritmus pro rozklad Tree (UpdateMatrix) . . . 28

6 Pseudo algoritmus pro rozklad Springs (CreateLogic) 1/4 . . . 28

7 Pseudo algoritmus pro rozklad Springs (CreateLogic)2/4 . . . 29

8 Pseudo algoritmus pro rozklad Springs (CreateLogic)3/4 . . . 30

9 Pseudo algoritmus pro rozklad Springs (CreateLogic)4/4 . . . 31

10 Pseudo algoritmus pro rozklad Springs (UpdateMatrix) . . . 31

11 Pseudo algoritmus pro otoˇcen´ı norm´aly . . . 33

(11)

FEM je numerick´a metoda ˇreˇsen´ı, kter´a se snaˇz´ı poskytnout pˇribliˇzn´e ˇreˇsen´ı. Tato metoda je ˇsiroce vyuˇz´ıvan´a pˇri ˇreˇsen´ı statick ´ych i dynamick ´ych probl´em ˚u v r ˚uzn ´ych odvˇetv´ıch, jako jsou napˇr´ıklad mechanika kapalin, biomedicina, elektromagnetick ´ych jev ˚u apod. Hlavn´ım principem t´eto metody je diskretizace spojit´eho prostoru na koneˇcn´e mnoˇzstv´ı prvk ˚u a n´asledn´e interpolace mezi d ˚uleˇzit ´ymi parametry, kter´e jsou ve vrcho-lech tˇechto prvk ˚u.

Tato pr´ace si mimo z´akladn´ıch c´ıl ˚u, kter´e byly vyjmenov´any v ´yˇse, klade i dalˇs´ı c´ıl, a to zachov´an´ı nebo vylepˇsen´ı urˇcit ´ych vlastnost´ı aplikace, ze kter´e vych´az´ı. Mezi tyto vlastnosti patˇr´ı hlavnˇe rychlost vykreslen´ı v ´ysledk ˚u a vyuˇzit´ı pamˇeti RAM.

Tato diplomov´a pr´ace navazuje na jiˇz existuj´ıc´ı projekt Ing. Petra Gajdoˇse, Ph.D. a dopl ˇnuje ho o v ´yˇse uveden´e funkce.

Hlavn´ı struktura pr´ace je:

1. Pˇredstaven´ı hlavn´ıch postup ˚u a metod pro vizualizaci koneˇcn ´ych prvk ˚u. 2. Anal ´yza a n´avrh vybran ´ych vizualizaˇcn´ıch modul ˚u.

3. Implementace.

(12)

2

N ´avrh a anal ´yza

V t´eto kapitole jsou informace o n´ahledu na strukturu modelu, kter´a je zobrazov´ana v aplikaci. Nalezneme zde z´akladn´ı pohled na reprezentaci modelu, takt´eˇz jsou zde pops´any zdroje dat pro modely, se kter ´ymi dok´aˇze aplikace zach´azet. V posledn´ı ˇc´asti t´eto kapitoly nalezneme popis zp ˚usobu uloˇzen´ı dat v pamˇeti poˇc´ıtaˇce.

2.1 Data

2.1.1 Reprezentace modelu

Objekt, kter ´y je v aplikaci vykreslov´an a na kter´em se prov´ad´ı v ´ypoˇcty, je tvoˇren mo-delem skl´adaj´ıc´ı se ze z´akladn´ıch element´arn´ıch ˇcast´ı. Model se skl´ad´a z dom´en, kter´e slouˇz´ı k rozdˇelen´ı sloˇzit ´ych model ˚u na menˇs´ı ˇc´asti. Nad dom´enami se prov´ad´ı operace posun, rotace nebo rozklad. Dom´ena jiˇz nejde d´ale dˇelit, jedinou v ´yjimkou je ˇrezan´ı po-moc´ı oˇrezov´e roviny nebo schov´av´an´ı vybran ´ych element ˚u.

Obr´azek 1: Geometrick´a tˇelesa

Kaˇzd´a dom´ena se skl´ad´a z geometri´ı. Geometrie jsou geometrick´e objekty, kter´e mo-hou nab ´yvat tvaru tetrahedron, pentahedron, hexahedron a octahedron. Z´akladn´ı geo-metrick´e objekty jsou vyobrazeny na obr´azku 1, kde objekt A je tetrahedron, B je penta-hedron, C je hexahedron a D je octahedron.

Soused´ıc´ı strany jednotliv ´ych geometri´ı mus´ı na sebe pˇresnˇe pˇril´ehat. Nen´ı moˇzn´e, aby nˇejak´a strana geometri´ı mˇela dva sousedy. Kaˇzd´a geometrie se pak skl´ad´a z ele-ment ˚u. Eleele-menty jsou jednoduch´e z´akladn´ı objekty, jako je troj ´uheln´ık a ˇctverec. Na obr´azku 2 je uk´azan´a stavba hexahedronu. Hexahedron se skl´ad´a z 6 obd´eln´ıku. Kaˇzd ´y element se pak skl´ad´a z tˇr´ı pˇr´ıpadnˇe ˇctyˇr vrchol ˚u a v kaˇzd´em vrcholu nebo na ploˇse je norm´ala, kter´a se pouˇz´ıv´a pro osvˇetlov´an´ı pˇri vykreslov´an´ı.

Kaˇzd ´y model m ˚uˇze obsahovat jeˇstˇe dodateˇcn´e informace. Tyto informace se v´aˇz´ı k vrchol ˚um geometri´ı a maj´ı informaˇcn´ı charakter, kter ´y tˇreba slouˇz´ı k v ´ypisu namˇeˇren ´ych hodnot teplot nebo hustoty.

2.1.2 Zdroje dat

Data lze nahr´avat z lok´aln´ıho disku nebo z online datab´aze. Nahr´av´an´ı z disku podporuje form´aty .geo a speci´aln´ı form´at. Pro nahr´av´an´ı z online datab´aze je potˇreba b ´yt pˇrihl´aˇsen na ˇskoln´ı s´ıti VˇSB-TUO.

(13)

Obr´azek 2: Hexahedron

Form ´at geo Form´at .geo se skl´ad´a z jednoho souboru, ve kter´em jsou obsaˇzeny vˇsechna data o modelu. Nejsou zde vˇsak obsaˇzen´e dodateˇcn´e informace. Strukturu form´atu .geo obsahuje:

• n ´azev modelu

• datum vytvoˇren´ı modelu • nody

• elementy • vrcholy • aj..

Speci ´aln´ı form ´at Skl´ad´a se ze 2 textov ´ych souboru p.txt, t.txt. Neobsahuje dodateˇcn´e informace. V souboru p.txt se nach´az´ı seznam vrcholu. Soubor t.txt je seznam element ˚u.

2.1.3 Strukt ˚ura dat

Pro uloˇzen´ı dat v pamˇeti byla zachov´ana struktura modelu, ve kter´em je naˇc´ıt´ana (pen-tahedron, hexahedron, oc(pen-tahedron,. . . ). Pro rychlejˇs´ı poˇc´ıtan´ı nˇekter ´ych probl´em ˚u byla struktura lehce upravena. Pˇrilehl´e elementy dvou geometri´ı byly nahrazeny jedn´ım je-din ´ym elementem a znalost´ı geometri´ı, ke kter ´ym patˇr´ı.

Takov´ato struktura umoˇz ˇnuje rychlejˇs´ı v ´ypoˇcet viditelnosti okrajov ´ych ploch. A pˇri klasick´em zobrazen´ı zobrazovat pouze tyto plochy. Vlastnost´ı teto struktury je jedna norm´ala pro dvˇe strany. Ned´a se tedy urˇcit, na kterou stranu je element natoˇcen ´y. Tato vlastnost bude jeˇstˇe pˇripomenuta pˇri popisu implementace osvˇetlen´ı.

Byla zachov´ana i struktura dom´en, kdy kaˇzd´a geometrie spad´a do nˇejak´e dom´eny. Dom´eny slouˇz´ı pouze k rozdˇelen´ı sloˇzit´eho modelu, napˇr´ıklad pro rozpad ˇci jinou ma-nipulaci. Nakonec jsou vˇsechny elementy pˇrerozdˇeleny do seznamu. Kaˇzd ´y seznam m´a sv ˚uj pˇr´ıznak, podle kter´eho se urˇcuje, kam maj´ı b ´yt elementy d´any a tak´e se podle flagu ˇr´ıd´ı vykreslov´an´ı. Flag obsahuje:

(14)

• GFT_LINE - Zda se jedn ´a o ´useˇcku.

• GFT_TRIANGLE - Zda se jedn ´a o troj ´uheln´ık. • GFT_QUAD - Zda se jedn ´a o ˇctverec.

• GFM_NONE - ˇZ´adn ´y flag nen´ı nastaven.

• GFM_IS_SELECTED - Urˇcuje, zda je dan ´y element vybr´an. • GFM_IS_BOUNDARY - Urˇcuje, zda je dan ´y element hraniˇcn´ım.

• GFM_IS_REDUNDANT - Slou ˇz´ı pro prvotn´ı v ´ypoˇcet. D´ale v programu nen´ı pouˇzit.

2.2 Dekompozice 2.2.1 Uloha dekompozice´

U velk ´ych a sloˇzit ´ych model ˚u b ´yv´a potˇreba zobrazit jejich ˇc´asti tak, aby byly l´epe vidˇet a nespokoj´ıme se s pouh ´ym schov´an´ım nˇekter ´ych ˇc´asti. Proto pouˇz´ıv´ame dekompozici, tedy obvykl´e rozloˇzen´ı ˇc´asti modelu, tak aby kaˇzd´a ˇc´ast byla l´epe vidˇet. Povˇetˇsinou se to prov´ad´ı posunut´ım nebo rotac´ı ˇc´asti modelu.

Dekompozici prov´ad´ıme na dom´en´ach modelu, protoˇze rozdˇelen´ı modelu na ˇcist´e elementy by bylo ˇspatnˇe realizovateln´e. Z tˇechto dom´en si bereme pouze jejich pozici (centrum) a pracujeme pouze s n´ı, jako s bodem.

2.2.2 Typy dekompozice

Byly navrhnuty tˇri typy technik pro dekompozici, kter´e se liˇs´ı svou komplexnost´ı. Od nejjednoduˇsˇs´ı, kter´a je jednoduch´a na ovl´ad´an´ı, ale nenab´ız´ı prostor k manipulaci, aˇz po komplexn´ı, kter´a je vhodn´a na sloˇzit´e typy modelu nebo specifick´e ovl´ad´an´ı rozpadu.

Simple Jedn´a se o jednoduchou dekompozici, kde se jednotliv´e dom´eny transformuji od poˇc´atku stejnˇe rychle a nen´ı moˇznost je jakkoli ovlivnit ˇci zasahovat do ˇc´asti modelu. Jedin´e moˇzn´e ovl´ad´an´ı je rychlost rozpadu vˇsech ˇc´ast´ı po os´ach x, y a z.

Tree Dekompozice Tree je oproti dekompozici Simple rozˇs´ıˇrena o jednoduchou logiku sdruˇzov´an´ı dom´en do shluk ˚u a kontrolov´an´ı tˇechto shluk ˚u.

Algoritmus se skl´ad´a ze tˇr´ı krok ˚u. Z poˇc´ateˇcn´ıch dom´en se vytvoˇr´ı shluky a z tˇechto shluk ˚u se vytvoˇr´ı dalˇs´ı shluky. V tˇret´ı vlnˇe se z jiˇz vytvoˇren ´ych shluk ˚u vytvoˇr´ı jeden velk ´y shluk. Dost´av´ame tak strom o hloubce tˇri, kde listy stromu jsou dom´eny objektu. A uzly stromu reprezentuj´ı shluky.

Shluky se prov´ad´ı na jednoduch´em algoritmu, kter ´y poˇc´ıt´a vzd´alenost´ı mezi dom´enami. Pokud je nalezen potencion´aln´ı shluk, ve kter´em je nejdelˇs´ı vzd´alenost mezi dom´enami menˇs´ı neˇz pˇredem stanovena hranice, a pokud je poˇcet dom´en v tomto potencion´aln´ım shluku vetˇs´ı neˇz poˇzadovan´a hodnota, tak se z tˇechto dom´en vytvoˇr´ı shluk.

(15)

Obr´azek 3: Dekompozice Tree

Obdobnˇe tento algoritmus funguje i ve druh´em kroku, kdy z vypoˇcten ´ych shluk ˚u tvoˇr´ıme dalˇs´ı shluky. Pro v ´ypoˇcet pozice u shluku se pouˇz´ıv´a aritmetick ´y pr ˚umˇer vˇsech pozic dom´en ve shluku. Na obr´azku 3a lze vidˇet poˇc´ateˇcn´ı sc´enu s 11 dom´enami a obr´azek 3b ukazuje, jak vypad´a logick´e spojen´ı dom´en ve stromˇe pomoc´ı shluku po v ´ypoˇctu.

N´asledn´a manipulace se stromem prob´ıh´a tak, ˇze si uˇzivatel m ˚uˇze oznaˇcit uzly nebo listy stromu, u kter ´ych chce, aby se na nˇe dekompozice projevila nebo ne. Pot´e m ˚uˇze pouˇz´ıt rozpad po os´ach x, y a z, kter ´y se projev´ı jen na ty dom´eny, kter´e si uˇzivatel zvolil. Byly prov´adˇeny pokusy o nalezen´ı jin ´ych geometrick ´ych ´utvar ˚u, neˇz je shluk, pˇresnˇeji kruˇznice, pˇr´ımka a rovina. Bohuˇzel od tˇechto technik bylo upuˇstˇeno, protoˇze ned´avaly dobr´e v ´ysledky.

Springs Pˇredch´azej´ıc´ı dekompozice stavˇely sv´e dom´eny do jednoduch ´ych strom ˚u. Coˇz vˇsak nemus´ı vyhovovat u nˇekter ´ych sloˇzit ´ych model ˚u. Proto byla navrhnuta tˇret´ı de-kompozice, kter´a stav´ı dom´eny do grafu. V ide´aln´ım stavu je kaˇzd´a dom´ena spojena s nejbliˇzˇs´ımi dom´enami hranami v grafu.

Graf je vytvoˇren pomoc´ı techniky zamet´an´ı roviny. Na zaˇc´atku mˇejme dva seznamy. V jednom seznamu mˇejme seˇrazeny vˇsechny dom´eny v nˇejak´e ose. Druh ´y seznam bude slouˇzit pro uchov´av´an´ı pr´avˇe zpracov´avan ´ych dom´en. Seznam bude umˇet uloˇzit odkaz na dom´enu a k t´eto dom´enˇe dalˇs´ı tˇri odkazy na dom´eny, kter´e budou reprezentovat do-sud nalezen´e tˇri nejbliˇzˇs´ı dom´eny. Oznaˇcme tento seznam jako P.

N´aslednˇe proch´az´ıme se zametac´ı rovinou prvn´ım seznamem seˇrazen ´ych dom´en. U kaˇzd´e dom´eny se zastav´ıme a provedeme tˇri kroky.

V prvn´ım kroku zjist´ıme, zda se v seznamu P nenach´az´ı dom´eny, u kter ´ych uˇz m ˚uˇzeme ˇr´ıct, ˇze jsme naˇsli tˇri nejbliˇzˇs´ı dom´eny. Pokud dom´ena m´a uˇz nˇejak´e tˇri nejbliˇzˇs´ı dom´eny

(16)

Obr´azek 4: Pˇr´ıklad v ´ypoˇctu hran pomoc´ı zametac´ı roviny.

Obr´azek 5: Tuhost pruˇzin

vyplnˇen´e a vzd´alenost od dom´eny k zametac´ı rovinˇe je delˇs´ı neˇz vzd´alenost dom´eny a tˇret´ı nejbliˇzˇs´ı dom´eny, tak jsme jiˇz pro danou dom´enu nalezli 3 nejbliˇzˇs´ı dom´eny a m ˚uˇzeme ji vyˇradit a vytvoˇrit hrany.

V druh´em kroku spoˇc´ıt´ame pro kaˇzdou dom´enu v seznamu P vzd´alenost s dom´enou na zametac´ı rovinˇe a za pˇredpokladu, ˇze je aspo ˇn tˇret´ı nejbliˇzˇs´ı , ji vloˇz´ıme do seznamu nejbliˇzˇs´ıch dom´en.

V tˇret´ım kroku pˇrid´ame do seznamu P dom´enu ze zametac´ı roviny.

Nakonec, aˇz projdeme cel ´y seznam seˇrazen ´ych dom´en, tak vytvoˇr´ıme pro zb ´yvaj´ıc´ı body seznamu P hrany s dosud nalezen ´ymi nejbliˇzˇs´ımi dom´enami.

Takto vytvoˇren ´y graf ovl´ad´ame tak, ˇze vybereme dom´enu, kterou chceme posouvat, a pomoc´ı rozkladu ji posouv´ame po os´ach x, y a z. Dom´eny, jenˇz jsou na tuto dom´enu pˇripojen´e , se posouvaj´ı o urˇcitou konstantu pomaleji. Dalˇs´ı dom´eny, kter´e jsou pˇripojeny k dom´enˇe, kter´a se posouvala, se posouvaj´ı zase o urˇcitou konstantu pomaleji, atd. Po-sun jednotliv ´ych dom´en je zn´azornˇen vzorcem. Dom´eny jsou br´any vˇzdy s nejkratˇs´ı vzd´alenosti od vybran´e dom´eny.

(17)

Pro lepˇs´ı objasnˇen´ı uved’me uk´azku. Na obr´azku 4 je situace, kdy v seznamu P je jiˇz bod d1, d2, d3, d4. Na zametac´ı rovinˇe je pr´avˇe poˇc´ıtan ´y bod d5. Bod d1 m´a ve sv´em seznamu nejbliˇzˇs´ıch dom´en hrany e1, e2, e3. N´aslednˇe se spoˇc´ıt´a vzd´alenost d1 a d5 a zjist´ı se, ˇze hrana e4 je bl´ıˇze neˇz e1, a proto se nahrad´ı.

2.3 Vedlej ˇs´ı ´ulohy

Pˇri tvorbˇe diplomov´e pr´ace vznikaly mal´e, ale d ˚uleˇzit´e vedlejˇs´ı ´ulohy, kter´e bylo potˇreba ˇreˇsit.

2.3.1 Vyhlazov ´an´ı

Pro lepˇs´ı vizu´aln´ı vjem m ˚uˇze vzniknout poˇzadavek na vyhlazen´ı povrchu modelu. Pro v ´ypoˇcet algoritmu na vyhlazen´ı povrchu mus´ıme sjednotit norm´aly vrchol ˚u, jenˇz jsou identick´e, jenom kaˇzd ´y patˇr´ı jin´e geometrii. Pˇri sjednocen´ı norm´al zapoˇc´ıt´ame nejdˇr´ıv pr ˚umˇernou norm´alu a pot´e kaˇzd´e norm´ale pˇriˇrad´ıme tuto pr ˚umˇernou norm´alu. Ne vˇsechny norm´aly se ale pr ˚umˇeruj´ı, obvykle se urˇc´ı ´uhel mezi dvˇema norm´alami, kter ´y urˇcuje mez, pˇri kter´e dan´a norm´ala se zpr ˚umˇeruje nebo se vynech´a. O zbytek se postaraj´ı shadery. Ne kaˇzd ´y shader vˇsak um´ı interpolovat norm´aly, z´aleˇz´ı, jak je dan ´y shader naps´an. Na obr´azku 6, lze vidˇet, jak se ze 4 vrcholu na sobˇe leˇz´ıc´ıch zpr ˚umˇeruj´ı norm´aly.

Toto vˇsak nen´ı jedin´a metoda pronarovn´an´ı norm´al“, dalˇs´ı metodou m ˚uˇze b ´yt pˇriˇrazen´ı v´ahy kaˇzd´e norm´ale, podle toho, jak je dan ´y polygon, jehoˇz je norm´ala vrcholu souˇc´ast´ı, velk ´y a pot´e, pˇri rovn´an´ı normal se norm´aly s vetˇs´ı v´ahou pod´ılej´ı v´ıce neˇz norm´aly s menˇs´ı v´ahou.

2.3.2 Shadery

Grafick´e karty umoˇz ˇnuj´ı programovat ˇc´ast grafick´eho ˇretˇezce grafick´e karty. Takov ´ymto program ˚um ˇr´ık´ame shadery. Shadery se programuj´ı pomoc´ı speci´aln´ıch programovac´ıch jazyk ˚u, napˇr. GLSL, Cg, HLSL. V dneˇsn´ı dobˇe m´ame nˇekolik typu shaderu. Mezi z´akladn´ı patˇr´ı vertex shader, pixel shader a geometri shader. Vertex shader - Na vstupu pˇreb´ır´a je-den vrchol a na v ´ystupu vrac´ı jeje-den vrchol. Uvnitˇr funkce se obvykle realizuje nˇejak´a transformace dan´eho vrcholu. Geometry shader - Oproti vertex shader um´ı generovat nebo odeb´ırat vrcholy. Tento shader m ˚uˇzeme pouˇz´ıt tˇreba ke generov´an´ı vegetace. Pixel shader - Pouˇz´ıv´a se u rasterizace a urˇcuje v ´yslednou barvu pixelu.

(18)

Obr´azek 6: Pr ˚umˇerov´an´ı norm´al

Tato diplomov´a pr´ace pouˇz´ıv´a pouze vertex a pixel shader. Pro v´ıce informac´ı o sha-derech doporuˇcuji pˇreˇc´ıst [2],[3],[4],[5] a [6].

Phong ˚uv osv ˇetlovac´ı model Phonguv osvˇetlovac´ı model na rozd´ıl od Gauradovoho st´ınovan´ı interpoluje norm´aly nam´ısto pouh´e interpolace barvy, a t´ım dosahuje lepˇs´ı vizu´aln´ı vjem, hlavnˇe spekul´arn´ı sloˇzka je poˇc´ıt´ana l´epe. Pˇri v ´ypoˇctu se do sebe zapoˇc´ıt´av´a difusn´ı, ambientn´ı a spekul´arn´ı sloˇzka.

Difusn´ı sloˇzka Difuzn´ı sloˇzka n´am ud´av´a, jak se odr´aˇz´ı svˇetlo od dan´eho materi´alu.

Id= Cd∗ (I ∗ n) ∗ Ld (1)

Ambientn´ı sloˇzka Ud´av´a, jak moc dan ´y materi´al emituje vlastn´ı svˇetlo.

Ia= Ca∗ La (2)

Spekul ´arn´ı sloˇzka Spekul´arn´ı sloˇzka je zde pro v ´ypoˇcet odlesku materi´alu.

Is= Cs∗ Ls∗ cosα(γ) (3)

Celkov´a intenzita se poˇc´ıt´a pro kaˇzdou sloˇzku RBG zvl´aˇst’.

(19)
(20)

3

Metody vizualizace

V t´eto kapitole jsou pops´any zakladn´ı typy dat. Prob´ır´any jsou hraniˇcn´ı reprezentace pˇres CGS aˇz po voxelovou reprezentaci. N´aslednˇe jsou pops´any techniky pro zobrazov´an´ı hraniˇcn´ıch tˇeles a objemov ´ych tˇeles. U hraniˇcn´ıch tˇeles to je hlavnˇe z´akladn´ı zobrazovac´ı ˇretˇezec, ray tracing a radiozita.

3.1 Reprezentace t ˇeles 3.1.1 Hrani ˇcn´ı reprezentace

Nejbˇeˇznˇejˇs´ı reprezentaci objektu, se kterou se m ˚uˇzeme setkat, je hraniˇcn´ı reprezentace. Objekt je reprezentov´an pouze obalem. Pro zobrazen´ı nen´ı potˇreba vˇedˇet, co je uvnitˇr objektu, a tak se s informac´ı o vnitˇrn´ı reprezentaci objektu nepoˇc´ıt´a. Obal nesm´ı b ´yt ni-kde pˇreruˇsen, mus´ıme b ´yt schopni rozliˇsit mezi bodem, kter ´y by byl uvnitˇr nebo venku modelu.

Na obr´azku 8 vid´ıme, jak vypad´a napˇr´ıklad hraniˇcn´ı model krychle.

Obr´azek 8: Stavba hraniˇcn´ıho modelu

Nejˇcastˇeji se takov ´yto model skl´ad´a z bod ˚u, hran a stˇen. Pokud by mˇela b ´yt vyob-razena nˇejak´a zakˇriven´a plocha, tak se aproximuje na troj ´uheln´ıky. Dalˇs´ı potˇrebnou in-formac´ı je norm´ala bodu a stˇeny. Tato informace nen´ı potˇrebn´a pro konstrukci modelu, ale neobejdeme se bez n´ı pˇri vykreslen´ı modelu. Hraje ned´ılnou souˇc´ast v pokroˇcil ´ych osvˇetlovac´ıch modelech jako je Phong ˚uv osvˇetlovac´ı model.

Nejstarˇs´ı hraniˇcn´ı reprezentaci je hranov´a reprezentace. Skl´ad´a se pouze ze seznamu bod ˚u a seznamu hran. V ´yhodou hranov´e reprezentace je jej´ı ´uspora, avˇsak nev ´yhodou je nejednoznaˇcnost objektu. D´ıky chybˇej´ıc´ı informaci o ploch´ach m ˚uˇze nastat pˇr´ıpad, kdy m´a v´ıce r ˚uzn ´ych reprezentac´ı tˇeles.

Rozˇs´ıˇren´ım hranov´e reprezentace o informaci s plochami dostaneme ploˇskovou re-prezentaci. Seznam hran nahrad´ıme seznamem ploch. Nejˇcastˇeji se body plochy zapisuji

(21)

Obr´azek 9: Troj ´uheln´ık

proti smˇeru hodinov ´ych ruˇciˇcek, abychom byli schopni odvodit spr´avnou norm´alu plo-chy a nemuseli tak uchov´avat tuto informaci zvl´aˇst’.

Nejz´akladnˇejˇs´ı ploˇskou je pouˇzit troj ´uheln´ık, protoˇze m´a dobr´e vlastnosti, napˇr´ıklad vˇsechny jeho body jsou vˇzdy v rovinˇe, je nejmenˇs´ı moˇznou plochou a m ˚uˇze se dobˇre dˇelit.

Bodov´a reprezentace je speci´aln´ım pˇr´ıpadem. Uchov´av´ame pouze body na povrchu tˇelesa. K bodu obvykle pˇrid´av´ame nˇejakou dodateˇcnou informaci, napˇr´ıklad barvu. Obecnˇe ale tˇechto bod ˚u jsou miliony (aˇz stovky GB) a tedy tato metoda m´a velkou pamˇet’ovou n´aroˇcnost. Bodovou reprezentaci nejˇcastˇeji najdeme u skenov´an´ı objekt ˚u.

Okˇr´ıdlen ´e plo ˇsky Tato reprezentace uchov´av´a u hran informaci o bodech na zaˇc´atku a konci, o vˇsech pˇrilehl ´ych hran´ach, sousedn´ıch ploch´ach a libovolnou dalˇs´ı hranu. V ´yhody: rychl´e nalezen´ı sousedn´ıch ploch, rychl´e nalezen´ı smyˇcky hran, plocha nemus´ı b ´yt kon-vexn´ı, plocha m ˚uˇze obsahovat d´ıry.

Konstruktivn´ı geometrie t ˇeles Z jednoduch ´ych geometrick ´ych tˇeles jako je kv´adr, v´alec, jehlan, ale i NURBs plocha, vytvoˇr´ıme pomoc´ı mnoˇzinov ´ych operac´ı v ´ysledn´e tˇeleso. Mezi mnoˇzinov´e operace ˇrad´ıme pr ˚unik, sjednocen´ı a rozd´ıl. Operace a jednoduch´a tˇelesa ˇrad´ıme do stromu, tak abychom dostali oˇcek´avan´e komplexn´ı tˇeleso.

3.1.2 Objemov ´a reprezentace

Pro vizualizaci mraku nebo v ´ysledku z tomografu se hraniˇcn´ı reprezentace nehod´ı. Proto se pouˇz´ıv´a objemov´a reprezentace. Data se vˇetˇsinou uchov´avaj´ı v mˇr´ıˇzce. Mˇr´ıˇzka m ˚uˇze nab ´yvat 7 r ˚uzn ´ych podob:

• kart´ezsk ´a • pravideln ´a

(22)

Obr´azek 10: CSG • pravo ´uhl´a • strukturovan ´a • nestrukturovan ´a • blokovˇe strukturovan ´a • hybridn´ı

Nejˇcastˇeji se setk´ame s pravideln ´ymi prostorov ´ymi mˇr´ıˇzkami. Hodnotou v mˇr´ıˇzce je z´akladn´ım elementem voxel, kter ´y nab ´yv´a nejˇcastˇeji tvaru kv´adru. M´a v cel´em sv´em ob-jemu stejnou hodnotu. Je to analogicky protˇejˇsek k pixelu v 2D grafice. Pro v´ıce informac´ı o objemov´e reprezentaci tˇeles doporuˇcuji pˇreˇc´ıst [27].

(23)

oboje. Vˇzdy je potˇreba se rozhodnout, kterou strategii zvol´ıme, napˇr´ıklad pro modelo-vac´ı editor budeme cht´ıt rychle vykreslen´ı, ide´alnˇe 60 sn´ımk ˚u za sekundu. Naopak, pro v ´ysledn ´y render celoveˇcern´ıho animovan´eho filmu budeme cht´ıt v ´ysledek kvalitn´ı, na hranici realistiˇcnosti. Pro v´ıce informac´ı o zobrazovac´ıch metod´ach doporuˇcuji pˇreˇc´ıst [21],[22],[23],[24] a [25].

3.2.1 Standartn´ı zobrazovac´ı ˇret ˇezec

Jedn´a se o metodu, kter´a m´a za c´ıl vykreslit obraz rychle na ´ukor realistiˇcnosti. Je to z´akladn´ı stavebn´ı k´amen, napˇr´ıklad pro CAD programy, poˇc´ıtaˇcov´e hry nebo modelo-vac´ı editor Blender. ˇRetˇezec se skl´ad´a z 8 krok ˚u, kter´e se vˇsak m ˚uˇzou odliˇsovat podle konkr´etn´ı situace, napˇr´ıklad podle toho, jak ´y zvol´ıme osvˇetlovac´ı model (Phong, atd.).

Na zaˇc´atku mus´ıme m´ıt popis sc´eny, kterou chceme vykreslit. Obsahuje mnoˇzinu ob-jekt ˚u, kter´e chceme vykreslit. D´ale mnoˇzinu svˇetel, kter´e se ve sc´enˇe nach´az´ı, a popis, jak danou sc´enu chceme vykreslit (m´ısto, odkud se chceme d´ıvat, atd...).

Prvn´ım krokem je vygenerov´an´ı ploch (nejl´epe vygenerov´an´ı troj ´uheln´ık ˚u) ze vˇsech objekt ˚u ve sc´enˇe, kter´e aproximuj´ı jejich povrch. Pokud se jiˇz naˇse tˇeleso skl´ad´a z tˇechto ploch, tak m ˚uˇzeme tento krok pˇreskoˇcit, pokud vˇsak je naˇse tˇeleso pops´ano jako koule o pr ˚umˇeru r, tak je tˇreba zvolit dobrou aproximaˇcn´ı techniku, kter´a udˇel´a z koule mnoˇzinu troj ´uheln´ık ˚u s body a norm´alami ve vrcholech.

Druh ´ym krokem je odstranˇen´ı tˇech ploch, kter´e zcela jist´e nep ˚ujdou vidˇet. Kaˇzd ´y troj ´uheln´ık ve sc´enˇe m´a svou vlastn´ı norm´alu, tato norm´ala n´am urˇcuje smˇer natoˇcen´ı troj ´uheln´ıka. Pokud je norm´ala ve stejn´em smˇeru jako pohled, kter ´ym se na sc´enu d´ıv´ame. Tak lze pˇredpokl´adat, ˇze dan ´y troj ´uheln´ık se nach´az´ı na protˇejˇs´ı stranˇe objektu, a tud´ıˇz nebude vidˇet. Odtud tedy m ˚uˇzeme zjistit, kter´e troj ´uheln´ıky v tomto kroku m ˚uˇzeme vyˇradit. K v ´ypoˇctu pouˇzijeme skal´arn´ı souˇcin norm´aly plochy a smˇeru naˇseho vykres-lovac´ıho pohledu.

Tˇret´ım krokem je v ´ypoˇcet osvˇetlen´ı ve vrcholech kaˇzd´e plochy. Osvˇetlen´ı je jedn´ım z d ˚uleˇzit ´ych krok ˚u, protoˇze urˇcuje, jak budeme vn´ımat dan´e tˇeleso. Mezi nejjednoduˇsˇs´ı techniky ˇrad´ıme konstantn´ı st´ınov´an´ı, kter´e jednotliv´e ploˇsky vypln´ı stejnou barvou. Po-kroˇcilejˇs´ı je Gouradovo st´ınovan´ı, kter´e vypoˇcte v kaˇzd´em vrcholu vlastn´ı barvu, a pot´e ji interpoluje po cel´e ploˇsce. Rozˇs´ıˇren´ım je Phongovo st´ınov´an´ı, kter´e interpoluje norm´aly z vrcholu, a aˇz pot´e vypoˇc´ıt´av´a barvu dan´eho pixelu. Osvˇetlen´ı se ovˇsem net ´yk´a vrh´an´ı st´ınu. Na st´ıny se pouˇz´ıvaj´ı jin´e techniky.

(24)

ˇ

Ctvrt ´ym krokem je proveden´ı transformace pro vˇsechny vrcholy. Pˇredem vypoˇctenou prom´ıtac´ı matici vyn´asob´ıme s vrcholem v homogenn´ıch souˇradnic´ıch.

P´at ´ym krokem je oˇrez´an´ı zorn ´ym objemem. Zde se odstran´ı dalˇs´ı plochy, kter´e nep ˚ujdou vidˇet. D´ıky tomu se nebudou muset kreslit plochy, kter´e n´aˇs pohled nezab´ır´a, a dojde t´ım ke zrychlen´ı vykreslovac´ıho ˇretˇezce.

ˇSest´ym krokem je pˇrechod od homogenn´ıch souˇradnic k afinn´ım souˇradnic´ım.

Sedm ´ym krokem je transformace souˇradnic vrcholu na souˇradnice v ´ystupn´ıho zaˇr´ızen´ı. Posledn´ım osm ´ym krokem je rasterizace. Pro viditelnost se pouˇz´ıv´a Z-buffer.

3.2.2 Monte Carlo metody

Monte carlo je stochastick´a metoda. Vyuˇz´ıv´a pseudon´ahodn´e ˇc´ıslo, kter´e aproximuje ˇreˇsen´ı. V ´yhodou tˇechto metod je, ˇze pouˇz´ıvaj´ı tzv. sledov´an´ı paprsku. Lze v nich snadno vypoˇc´ıtat zrcadlov ´y obraz, empirick´a sloˇzitost je log (n) a maj´ı n´ızkou pamˇet’ovou n´aroˇcnost.

Rekurzivn´ı sledov ´an´ı paprsku Z poˇc´atku byly metody zaloˇzen´e na sledov´an´ı paprsku od zdroje svˇetla. Tyto metody jsou zaloˇzen´e na sledov´an´ı paprsku od zdroje svˇetla k po-zorovateli. Bohuˇzel, mnoho paprsku od zdroje nedoraz´ı k pozorovateli, a tedy poˇc´ıtaj´ı se zbyteˇcnˇe. Proto se v ´ypoˇcet obr´atil, a poˇc´ıtaj´ı se paprsky od pozorovatele ke zdroji svˇetla, takov´eto metodˇe ˇr´ık´ame rekurzivn´ı sledov´an´ı paprsku. V ´yhodou t´eto techniky je auto-matick´e poˇc´ıt´an´ı svˇeteln ´ych odraz ˚u a st´ın ˚u. Tak´e je implementaˇcnˇe velmi jednoduch´a.

Nev ´yhodou je pr´ace pouze s bodov ´ymi svˇetly a tud´ıˇz st´ıny, kter´e tvoˇr´ı, jsou ostr´e. Ray tracing, jak se tak´e nˇekdy tato metoda naz ´yv´a, poskytuje kvalitn´ı v ´ysledky oproti standartn´ımu zobrazovac´ımu ˇretˇezci.

Algoritmus pro v ´ypoˇcet je velmi snadn ´y. Od pozorovatele vyˇsleme paprsek skrz poˇc´ıtan ´y pixel. Na tomto paprsku najdeme nejbliˇzˇs´ı pr ˚useˇc´ık s objektem ve sc´enˇe. Po-kud nen´ı ˇz´adn ´y pr ˚useˇc´ık, vr´at´ıme barvu pozad´ı. V opaˇcn´em pˇr´ıpadˇe se na nalezen´em pr ˚useˇc´ıku vypoˇc´ıt´a barva. Barva se poˇc´ıt´a ze samotn´eho objektu a z pˇr´ıspˇevk ˚u od okoln´ıch svˇetel. N´aslednˇe se vypoˇc´ıt´a paprsek odrazu, a pokud je objekt pr ˚usvitn ´y, tak i lomen ´y paprsek a cel´e se to rekurzivnˇe opakuje. Poˇcet odraˇzen´ı jednoho paprsku se obvykle ome-zuje, protoˇze ˇc´ım v´ıcekr´at se paprsek odr´aˇz´ı, t´ım m´enˇe dan ´y odraz pˇrisp´ıv´a do v ´ysledn´eho pixelu.

Na nalezen´em pr ˚useˇc´ıku se poˇc´ıt´a barva podle vzorce.

I(P ) = IL(P ) + IG(P ) = IL(P ) + KnoI(Po) + KnpI(Pp)

Kde:

P - pr ˚useˇc´ık

Po- dalˇs´ı pr ˚useˇc´ık odraˇzen´eho paprsku

Pp- dalˇs´ı pr ˚useˇc´ık lomen´eho paprsku

Kno- koeficient odrazu

Knp- koeficient lomu

Metoda rekurzivn´ı sledov´an´ı paprsk ˚u je n´aroˇcn´a na v ´ykon. Proto se v ´ypoˇcet snaˇz´ıme zefektivnit. Tˇelesa uzav´ır´ame do jednoduch ´ych bounding boxu. Pˇr´ıkladem m ˚uˇze b ´yt

(25)

ku-Obr´azek 12: Raytracing

lov´a plocha, kter´a obep´ın´a cel´e tˇeleso co nejtˇesnˇeji. Pˇri hledan´ı nyn´ı nejdˇr´ıve provedeme v ´ypoˇcet paprsku s bounding boxem a pokud se nalezne pr ˚useˇc´ık, tak aˇz teprve potom dˇel´ame sloˇzitˇejˇs´ı pr ˚useˇc´ık paprsku s tˇelesem.

Obr´azek 13: Bounding box

Techniku m ˚uˇzeme zdokonalit t´ım, ˇze do boundin boxu uzavˇreme v´ıce tˇeles, kter´e jsou bl´ızko u sebe. M ˚uˇzeme takto rekurzivnˇe vytvoˇrit v´ıce bounding boxu a vytvoˇrit strom, ve kter´em bude hledan´ı pr ˚useˇc´ıku snaˇzˇs´ı.

Jin´a metoda pouˇz´ıv´a pro rychlejˇs´ı hled´an´ı pr ˚useˇc´ık ˚u Octree. Jde o kvadrantov ´y strom, kter ´y prostor rekurzivnˇe dˇel´ı na 8 dalˇs´ıch podprostoru. Kaˇzd ´y podprostor je tvaru krychle se seznamem tˇeles, kter´e do toho podprostoru spadaj´ı. Dˇelen´ı je ukonˇceno, pokud je prostor pr´azdn ´y, nebo se tam nach´az´ı jen jedno tˇeleso, nebo dˇelen´ı prostoru pˇrekroˇcilo urˇcitou mez. N´asledn´e skl´ad´an´ı pr ˚useˇc´ıku se nejdˇr´ıv prov´ad´ı s hled´an´ım pr ˚useˇc´ıku v podprostoru, a aˇz pokud je nalezen pr ˚useˇc´ık s podprostorem, je hled´an pr ˚useˇc´ık s tˇelesem v tomto podprostoru. D´ıky v ´yhod´am stromu je vyhled´an´ı pr ˚useˇc´ıku zrychleno.

(26)

Obr´azek 14: Hiearchie bounding boxu

Obr´azek 15: Octree

Jednou z nev ´yhod je i vznik aliasingu. Paprsek se obvykle vys´ıl´a stˇredem pixelu, to m ˚uˇze m´ıt za pˇr´ıˇcinu vzniku nehezk ´ych zub ˚u, napˇr´ıklad na okraji koule. Aliasingu se m ˚uˇzeme zbavit vys´ıl´an´ım v´ıce paprsku v r ˚uzn ´ych bodech pixelu a v ´ysledn ´y pixel vytvoˇrit zpr ˚umˇerov´an´ım vyslan ´ych paprsk ˚u. Nebo m ˚uˇzeme pouˇz´ıt metodu tˇresen´ı pa-prsku, kdy se vys´ıl´a jen jeden paprsek, ale vys´ıl´a se n´ahodn ´ym m´ıstem pixelu.

3.2.3 Radiozita

Radiozita je jedna z dalˇs´ıch metod pro vykreslen´ı sc´eny. Oproti sledov´an´ı paprsku vˇsak jej´ı v ´ypoˇcet nez´avis´ı na pozici pozorovatele. Staˇc´ı ji pro sc´enu jednou zapoˇc´ıtat a pot´e je moˇzn´e rychl´e vykreslen´ı v jak´ekoliv pozici pozorovatele. Tato metoda se nejl´epe hod´ı na interi´ery. Nezvl´ad´a vˇsak vykreslovat zrcadlov ´y odraz.

Cel´a sc´ena je pokryta ploˇskami. Kaˇzd´a ploˇska reprezentuje, jak je dan´a ˇc´ast sc´eny osv´ıcena. V oblastech, kde nedoch´az´ı k ˇz´adn ´ym velk ´ym zmˇen´am, jsou ploˇsky velk´e, na-opak v oblastech, kde doch´az´ı k velk ´ym zmˇen´am osvˇetlen´ı (okraje st´ınu, apod... ), jsou

(27)

Obr´azek 16: Uk´azka Raytracingu

mal´e. Na zaˇc´atku je rozdˇelen´ı ploˇsek ve sc´enˇe udˇel´ano intuitivnˇe, v dalˇs´ıch kroc´ıch je ale dˇelen´ı upraveno, tak aby l´epe vyhovovalo v ´ysledku vykreslen´ı.

Pro kaˇzdou ploˇsku je vypoˇc´ıtan´a intenzita osvˇetlen´ı, kter´a na ploˇsku dopad´a ze vˇsech ploˇsek, a kter´a je ploˇskou vyˇrazena do prostoru, at’ uˇz odrazem, nebo pokud sama inten-zitu vyˇrazuje.

Obr´azek 17: Sch´ema vypoˇctu radiosity

Protoˇze by na hranˇe mezi sousedn´ımi ploˇskami vznikala viditeln´a hrana, tak se u vrchol ˚u, kter´e nejsou na hranˇe vrcholu ˇz´adn´eho objektu, zpr ˚umˇeruje intenzita vˇsech pˇril´ehaj´ıc´ıch ploˇsek. Nakonec m ˚uˇzeme v ´ysledek vykreslit pomoc´ı Gouradova st´ınovan´ı.

3.2.4 Objemov ´e algoritmy

Algoritmy, zobrazuj´ıc´ı povrchy Algoritmy, zobrazuj´ıc´ı povrchy, ˇrad´ıme mezi nepˇr´ım´e algoritmy. Ze vstupn´ıch dat se spoˇc´ıt´a pomocn´a geometrie, kter´a se pak d´ale zobrazuje a s p ˚uvodn´ımi daty se d´al nepoˇc´ıt´a. Vytvoˇren´a pomocn´a geometrie je povrch, jenˇz

(28)

aproxi-muje povrch p ˚uvodn´ıch dat. To tak´e znamen´a, ˇze jsme se pˇresunuli z objemov ´ych tˇeles k hraniˇcn´ım tˇeles ˚um. A m ˚uˇzeme v ´ysledek vykreslit, napˇr´ıklad pomoc´ı technik uveden ´ych v ´yˇse.

Pˇr´ım ´e objemov ´e algoritmy Naproti tomu jsou pˇr´ım´e zobrazovac´ı objemov´e algoritmy, kter´e se snaˇz´ı zobrazovat vstupn´ı objemov´a data pˇr´ımo. Mezi takov´eto algoritmy ˇrad´ıme napˇr´ıklad raytracer POV-Ray.

(29)

4.1 Qt

Grafick´e uˇzivatelsk´e rozhran´ı (GUI) je naps´ano v knihovnˇe QT. QT je jedna z nejpo-pul´arnˇejˇs´ıch multiplatformn´ıch knihoven pro Windows, Linux a Mac. Byla vytvoˇrena v roce 1999 spoleˇcnosti Trolltech. A v roce 2008 prod´ana spoleˇcnosti Nokia.

Qt knihovna byla naps´ana pro jazyk c++, ale existuj´ı verze i pro jin´e programovac´ı jazyky, napˇr´ıklad pro python,... . Mezi jej´ı pˇrednosti kromˇe multiplatformosti ˇrad´ıme i dobrou dokumentaci. Pro v´ıce informac´ı o Qt doporuˇcuji pˇreˇc´ıst [8],[9],[10],[11] a [12].

Aplikace byla naps´ana pro QT verzi 4.7.2.

4.2 Struktura aplikace

Cel´a aplikace se skl´ad´a z d´ılˇc´ıch projekt ˚u.

• Projekt Database slou ˇz´ı k nahr´av´an´ı modelu z datab´aze.

• Projekt DataCore obsahuje z ´akladn´ı prvky SceneData, SceneTree, parentNode a en-tityNode, kter´e slouˇz´ı k obecn´emu vykreslen´ı objektu pomoc´ı hierarchie stromu. Tak´e zde nalezneme podporu shader programu a speci´aln´ı entitu pro ˇrezan´ı mo-delu pomoc´ı cliping plane.

• Projekt FemDataCore rozˇsiˇruje tˇr´ıdy parentNode a enitityNode o potˇrebn´e elementy pro vykreslov´an´ı naˇsich konkr´etn´ıch modelu. Nalezneme zde jiˇz zm´ınˇen´e rozˇs´ıˇren´ı entity_Mesha entity_Meshpart, samotn´e data modelu v tˇr´ıd´ach Mesh a Me-shPart a tˇr´ıdy pro v ´ypoˇcet a proveden´ı rozpadu tˇeles.

• Projekt FemManager hlavn´ı projekt, jen ˇz se star´a o manager. A obsahuje funkci main.

• Projekt Renderer projekt, jen ˇz obsahuje tˇr´ıdu SimpleViewer, kter´a se star´a o vykres-lovac´ı okno OpenGL.

• Projekt QGLViewer projekt, jen ˇz upravuje QGLviewer pro potˇreby aplikace • Projekt GGradientViewer obsahuje v ´ychoz´ı tˇr´ıdu pro SimpleViewer.

(30)

4.2.1 Popis struktury

Hlavn´ım projektem je FemManager, ve kter´em se nach´az´ı tˇr´ıda Manager. Tˇr´ıda Manager, vych´azej´ıc´ı z tˇr´ıdy QMainWindow, m´a na starost hlavn´ı okno, sign´aly pro manipulaci s nahr´av´an´ım objektu, gui prvky a tak´e drˇz´ı d ˚uleˇzitou strukturu SceneData.

Tˇr´ıda SceneData, jak uˇz z n´azvu vypl ´yv´a, zapouzdruje data aplikace. Je navrˇzena jako pseudo singleton. Tak´e uchov´av´a stavy pro urˇcen´ı, jak ´ym zp ˚usobem se m´a dan ´y model vykreslit, a nastaven´ı glob´aln´ıho vykreslen´ı. Toto nastaven´ı nalezneme v tˇr´ıdˇe DrawMo-delFlags. Glob´aln´ı nastaven´ı se skl´ad´a z barvy pozad´ı, hran, bod ˚u, velikost´ı alfa koefici-entu, pro pr ˚uhledn´e vykreslov´an´ı. Samotn´e data jsou obsazena v tˇr´ıdˇe SceneTree.

Stromem, kter ´y drˇz´ı ˇc´ast´ı modelu, je SceneTree. Obsahuje ukazatel na koˇren stromu, ˇc´ast´ı vykreslovan´eho modelu a LogicInterface, kter ´y ud´av´a zp ˚usob rozkladu. Uzly stromu jsou tvoˇreny tˇr´ıdou SceneTreeNode. Z t´eto tˇr´ıdy se odvozuji parentNode, jenˇz pˇredstavuje vnitˇrn´ı uzly stromu a entityNode, kter ´y pˇredstavuje listy stromu. Z parentNode se odvo-zuje Entity Mesh, kter ´y pˇredstavuje cel ´y model, a z EntityNode se odvoodvo-zuje Entity meshpart, jenˇz pˇredstavuje jednotliv´e dom´eny modelu.

4.3 Implementovan ´e algoritmy 4.3.1 Dekompozice

Tˇr´ıda LogicInterface Jedn´a se o virtu´aln´ı tˇr´ıdu, z n´ıˇz se dˇed´ı tˇr´ıdy pro popis rozkladu modelu. I kdyˇz je v n´azvu slovo interface, tak se nejedn´a o interface, jak ´y je napˇr´ıklad k nalezen´ı v jave. Jedn´a se o abstraktn´ı datov ´y typ, kter ´y pouze urˇcuje jak´e hlavn´ı funkce je tˇreba implementovat pro v ´ypoˇcet rozkladu.

Obr´azek 18: Uk´azka dekompozice

Tˇr´ıda je navrˇzena jako n´avrhov ´y vzor Abstraktn´ı tov´arna. Tˇr´ıda ´uzce spolupracuje s jedn´ım GUI prvkem. Tento prvek je QTreeWidget a zajiˇst’uje zobrazen´ı logick´e struk-tury rozkladu pro snadnˇejˇs´ı manipulaci ( vyb´ıran´ı kl´ıˇcov ´ych dom´en/skupin pro rozpad).

(31)

• CreateLogic() - nejd ˚uleˇzitˇejˇs´ı funkce, jenˇz m´a za ´ukol vytvoˇrit logiku pro v ´ypoˇcet rozkladu. Tato funkce je volan´a pokaˇzd´e po funkci LoadPoint()

• FillTable() - Funkce pro GUI napl ˇnuje tabulku s daty pro manipulaci s ˇc´astmi ob-jektu. Tato funkce je volan´a pokaˇzd´e po funkci CreateLogic()

• ClickTable() - Zpracov ´an´ı ud´alost´ı pˇri kliknut´ı na nˇejak ´y item v tabulce. Funkce se vol´a pokaˇzd´e pˇri interakci s GUI pro rozklad.

• Reset() - Funkce pro obnoven´ı v ´ychoz´ı pozice modelu. Je volan´a po stisknut´ı pˇr´ısluˇsn´eho tlaˇc´ıtka v menu, nebo pˇri zapnut´ı oˇrezov´e roviny.

Tˇr´ıda d´ale obsahuje seznam bod ˚u, kter ´y se vypl ˇnuje pomoc´ı funkce LoadPoint. Tento seznam bod ˚u reprezentuje seznam dom´en v modelu. Pro jednoduchost jsme se omezili pouze na centra dom´en a vypustili jsme informaci o prostorov´e velikosti dom´eny. D´ale zde nalezneme seznam matic, jenˇz reprezentuj´ı transformaci jednotliv ´ych ˇc´ast´ı modelu z rozkladu, a seznam element ˚u, kter´e pˇredstavuj´ı vnitˇrn´ı logiku dan´eho rozkladu.

Simple Jedn´a se o nejjednoduˇsˇs´ı zp ˚usob rozkladu. Pro svou jednoduchost nepotˇrebuje funkci CreateLogic. Proto tato funkce z ˚ust´av´a pr´azdn´a. D ˚uleˇzitou ˇc´ast´ı je ale funkce pro v ´ypoˇcet aktu´aln´ı pozice dom´en:

void LISimple::UpdateMatrix(float s,float x, float y, float z)

{

matice.clear () ; glPushMatrix();

for( int i = 0; i < seznamElementu.size(); i++)

{

glLoadIdentity () ;

cLIElement∗u = seznamElementu.at(i);

if (u−>bRozpadUse)

glTranslated(u−>centrum.x∗x + u−>centrum.x∗s ,u−>centrum.y∗y + u−>centrum.y∗s , u−>centrum.z∗z + u−>centrum.z∗s);

MATRIX4x4 mat;

glGetFloatv(GL MODELVIEW MATRIX, mat.m);

if (matice.size () > i)

matice[i ] = mat;

else

(32)

}

glPopMatrix(); }

V ´ypis 1: Algoritmus pro rozklad Simple (UpdateMatrix)

Ve funkci nejprve vyˇcist´ıme seznam matic. Pro zachov´an´ı zobrazovac´ı matice ji uloˇz´ıme. Na 5. ˇr´adku projdeme v cyklu pˇres vˇsechny elementy (dom´eny) a vytvoˇr´ıme matici s jed-noduch ´ym posunem z´avisej´ıc´ım na v ´ychoz´ı pozici modelu a s´ıly posunu rozkladu. Tato matice je pot´e vloˇzena do seznamu matic. Nakonec vyt´ahneme zobrazovac´ı matici zpˇet z pamˇeti, aby bylo vˇse v poˇr´adku.

Tree Rozˇs´ıˇren ´y algoritmus pro d´ılˇc´ı ovl´ad´an´ı modelu. Pˇresn ´y popis algoritmu je naps´an v kapitole 2.2.2.

void LIStrom::CreateLogic()

{

vybrany = NULL; vector<cUzelv2∗> base;

for( int i =0; i <seznamElementu.size(); i++)

base.push back((cUzelv2∗)seznamElementu[i]); vector<cUzelv2∗>∗ uroven0 = CallUroven(&base,0.003); vector<cUzelv2∗>∗ uroven1 = CallUroven(uroven0,0.003); koren = new cUzelv2Rodic();

cVector c (0,0,0) ;

for( int i =0; i < uroven1−>size(); i++)

{

koren−>seznam.push back(uroven1−>at(i)); cUzelv2∗pom = uroven1−>at(i);

cVector vecPom(pom−>centrum.x, pom−>centrum.y, pom−>centrum.z); c += vecPom; } c = c∗ (1.0/( double)uroven1−>size()); koren−>centrum = c; UpdateRodic(koren); }

V ´ypis 2: Pseudo algoritmus pro rozklad Tree (CreateLogic)

Seznam bodu (center dom´en) se nejdˇr´ıve pˇrekop´ıruje do pomocn´eho seznamu base. N´aslednˇe je pomoc´ı funkce CallUroven nad t´ımto seznamem vytvoˇren seznam shluk ˚u (uroven0). A pot´e je i nad seznamem shluk ˚u (uroven0) vytvoˇren seznam shluk ˚u (uroven1). Jako pˇredposledn´ı akce je vytvoˇren´ı hlavn´ıho uzlu a vyplnˇen´ı jeho seznamu potomk ˚u se-znamem uroven1. Takto jsme z´ıskali stromovou strukturu s hloubkou 3, hlavn´ım uzlem (koˇren) a listy stromu reprezentuj´ıc´ı centra dom´en modelu. Nakonec je zavolan´a funkce UpdateRodic, kter´a vˇsem uzl ˚um nastav´ı spr´avn´eho rodiˇce, pro snazˇs´ı pr ˚uchod stromu.

(33)

naj´ıt nejdˇr´ıve mal´e shluky a pot´e vetˇs´ı shluky. Nakonec je cel ´y seznam vr´acen.

N´asleduj´ıc´ı v ´ypis funkce NajdiShlukyRodic() byla kv ˚uli sv´e velikosti zredukov´ana jen na podstatn´e ˇc´ast´ı a zredukovan´e ˇc´ast´ı byly nahrazeny tˇremi teˇckami a koment´aˇrem o funkci, kterou plnily.

void LIStrom::NajdiShlukyRodic(double d,vector<cUzelv2∗>∗ sezU,vector<cUzelv2∗>∗ sezL, int meze)

{

vector<int> ∗ maxSez = new vector<int>; for( int i =0; i < sezL−>size(); i++)

{ ...

// vytvoren cVector a reprezentujici shluk z i−teho prvku sezname sezL

for( int mm=0; mm < sezL−>size(); mm++)

{ ...

// vypocet vzdalenost´ı delka mm−teho prvku z seznamu sezL k reprezentantu

if (delka <= d) { sez−>push back(mm); pocet++; } } ...

// Pokud nalezeny seznam splnuje pozadavky na minimalni hodnotu a je nejvetsi nalezeny stava se maxSez, jinak je smazan

} ...

// Vytvoreni uzlu predstavujici rodice nalezeneho shluku ...

// Vpocet stredu shluku z aritmetickeho prumemeru vsech prvku z seznamu maxSez ...

// Vyrazeni nalezenych prvku z seznamu sezL NajdiShlukyRodic(d, sezU, sezL, meze); }

(34)

Funkce NajdiShlukyRodic nejprve vyhled´a v cyklu nejvˇetˇs´ı moˇzn ´y shluk. N´aslednˇe pro takov ´yto shluk vytvoˇr´ı rodiˇce a nalezen´e prvky do nˇej pˇriˇrad´ı. Nakonec jsou nalezen´e prvky ze seznamu vyˇrazeny a cyklus se rekurzivnˇe provede znovu, dokud nen´ı seznam sezL pr´azdn ´y nebo uˇz nejde vytvoˇrit shluky.

void LIStrom::UpdateMatrix(float s,float x, float y, float z)

{

matice.clear () ; glPushMatrix();

for( int i = 0; i < seznamElementu.size(); i++)

{

glLoadIdentity () ;

if ((( cUzelv2 ∗)seznamElementu[i])−>setTransformation(s,x,y,z))

{

MATRIX4x4 mat;

glGetFloatv(GL MODELVIEW MATRIX, mat.m);

if (matice.size () > i) matice[i ] = mat; else matice.push back(mat); } } glPopMatrix(); }

V ´ypis 5: Pseudo algoritmus pro rozklad Tree (UpdateMatrix)

Ve funkci nejprve vyˇcist´ıme seznam matic. Pro zachov´an´ı zobrazovac´ı matice ji uloˇz´ıme. Na 5. ˇr´adku projdeme v cyklu pˇres vˇsechny elementy(dom´eny) a vytvoˇr´ıme matici s transformac´ı podle funkce setTransformation, kter´a se provede podle vnitˇrn´ı logiky vy-tvoˇren´eho rozpadu. Tato matice je pot´e vloˇzena do seznamu matic. Nakonec vyt´ahneme zobrazovac´ı matici zpˇet z pamˇeti, aby bylo vˇse v poˇr´adku.

Springs Teoretick ´y popis fungovan´ı Springs rozpadu je naps´an v kapitole 2.2.2. Tˇr´ıda cLIElement, jenˇz reprezentuje vnitˇrn´ı prvek rozpadu a ˇc´asteˇcnˇe tak definuje chov´an´ı cel´e tˇr´ıdy pro rozpad, byla rozˇs´ıˇrena na tˇr´ıdu cSpring. Do tˇr´ıdy cSpring byl pˇrid´an seznam ukazatel ˚u na dalˇs´ı tˇr´ıdy. Seznam ukazatel ˚u pˇredstavuje logick´e spojen´ı dvou dom´en. Pˇri pˇrirovn´an´ı ke grafu je to jednosmˇern´a hrana grafu.

D´ale byla navrhnuta struktura sTMPBod pro v ´ypoˇcet nalezen´ı nejbliˇzˇs´ıch dom´en. Ob-sahuje kromˇe informace, ke kter´e dom´enˇe patˇr´ı (cSpring), tak´e pole d´elky tˇri pˇredstavuj´ıc´ı nejbliˇzˇs´ı nalezen´e dom´eny. Pro v ´ypoˇcet aktualizace transformaˇcn´ıch matic byla pˇrid´ana struktura sTMPMinBod, kter´a obsahuje informaci o dom´enˇe a o s´ıle, kter´a na tuto dom´enu p ˚usob´ı.

N´asleduj´ıc´ı k ´od, popisuj´ıc´ı algoritmus pro rozpad pomoc´ı Springs, byl kv ˚uli sv´e veli-kosti rozdˇelen na 4 ˇc´asti.

void LISprings::CreateLogic()

{

(35)

Nejprve je vytvoˇren pomocn ´y vektor tmpList, do kter´eho je pˇrekop´ırov´an obsah se-znamu center dom´en seznamElementu. D´ale je tento seznam seˇrazen podle jedn´e z os. Pomoc´ı standartn´ı funkce sort je zavol´ana funkce sortFce, kter´a zaˇrizuje porovn´av´an´ı. T´ımto krokem pˇripravujeme algoritmus na pr ˚uchod zametac´ı rovinou po d ˚uleˇzit ´ych bo-dech ze seznamu tmpList. Tak´e je vytvoˇren seznam aktu´alnˇe zpracov´avan ´ych bod ˚u lis-tZBod.

for( int i =0; i < tmpList.size() ; i ++)

{

cSpring∗ tmpBod = tmpList.at(i) ; plane = tmpBod−>centrum.z;

for( int j =0; j < listZBod.size () ; j ++)

{

sTMPBod∗ bod = &listZBod.at(j); // 1. vyradit body z seznamu // podminka pro maxVzdalenost

if (bod−>pocet == 3)

if (( plane − bod−>bod−>centrum.z) > bod−>nejblizsi[2].vzdalenost)

{ // vyradit bod−>bod−>pruziny.push back(bod−>nejblizsi[0].bod); bod−>bod−>pruziny.push back(bod−>nejblizsi[1].bod); bod−>bod−>pruziny.push back(bod−>nejblizsi[2].bod); bod−>nejblizsi[0].bod−>pruziny.push back(bod−>bod); bod−>nejblizsi[1].bod−>pruziny.push back(bod−>bod); bod−>nejblizsi[2].bod−>pruziny.push back(bod−>bod); // smazat z listu listZBod.erase(listZBod.begin()+j ) ; j−−; continue; }

V ´ypis 7: Pseudo algoritmus pro rozklad Springs (CreateLogic)2/4

T´ımto setˇr´ıdˇen ´ym seznamem tmpList zaˇcneme proch´azet a posouvat zametac´ı rovinu podle aktu´aln´ıho prvku ze seznamu. Pro kaˇzd ´y posun zametac´ı roviny se projde seznam aktu´alnˇe zpracov´avan ´ych bod ˚u listZBod. A jestliˇze je splnˇena podm´ınka pro vyˇrazen´ı

(36)

to-hoto bodu, je bod vyˇrazen. Podm´ınky pro vyˇrazen´ı jsou dvˇe. Prvn´ı podm´ınka: poˇcet za-znamenan ´ych nejbliˇzˇs´ıch bod ˚u je roven tˇrem, a druh´a, d ˚uleˇzitˇejˇs´ı podm´ınka: vzd´alenost roviny od bodu z aktu´alnˇe zpracov´avan´eho seznamu listZBod je vˇetˇs´ı neˇz vzd´alenost bodu z aktu´alnˇe zpracov´avan´eho seznamu listZBod k tˇret´ımu nejbliˇzˇs´ımu nalezen´emu bodu.

Vyˇrazen´ı bodu se prov´ad´ı t´ım, ˇze se nejprve vytvoˇr´ı logick´e vazby mezi bodem, kter ´y se vyˇrazuje, a tˇremi nejbliˇzˇs´ımi nalezen ´ymi body. Nakonec je bod smaz´an ze seznamu listZbod. Podm´ınka je ukonˇcena pˇr´ıkazem continue, protoˇze se jiˇz d´ale t´ımto aktu´aln´ım bodem zab ´yvat nemus´ıme.

// 2. spocitat vzdalenposti k tmp

float vzd = sqrt ( bod−>bod−>centrum.z∗ tmpBod−>centrum.z +

bod−>bod−>centrum.y∗ tmpBod−>centrum.y + bod−>bod−>centrum.x∗ tmpBod−>centrum.x); // jestlize je pocet mensi jak 3 tak pridat

if (bod−>pocet < 3) { bod−>nejblizsi[bod−>pocet].vzdalenost = vzd; bod−>nejblizsi[bod−>pocet].bod = tmpBod; bod−>pocet++; continue; } if (vzd < bod−>nejblizsi[0].vzdalenost) { bod−>nejblizsi[2] = bod−>nejblizsi[1]; bod−>nejblizsi[1] = bod−>nejblizsi[0]; bod−>nejblizsi[0].vzdalenost = vzd; bod−>nejblizsi[0].bod = tmpBod; continue; } if (vzd < bod−>nejblizsi[1].vzdalenost) { bod−>nejblizsi[2] = bod−>nejblizsi[1]; bod−>nejblizsi[1].vzdalenost = vzd; bod−>nejblizsi[1].bod = tmpBod; continue; } if (vzd < bod−>nejblizsi[2].vzdalenost) { bod−>nejblizsi[2].vzdalenost = vzd; bod−>nejblizsi[2].bod = tmpBod; continue; } } // 3. pridat tmp do seznamu sTMPBod novy;

(37)

se vˇsak tento bod nal´ez´a v bl´ızkosti, tak je zaˇrad´ıme na pˇr´ısluˇsn´e m´ısto do seznamu nejbliˇzˇs´ıch bod ˚u. Nakonec je bod ze seznamu tmpList zkop´ırov´an do seznamu listZbod, aby se i pro nˇej nalezly nejbliˇzˇs´ı body.

for( int j =0; j < listZBod.size () ; j ++)

{

sTMPBod∗ bod = &listZBod.at(j);

for( int i =0; i < bod−>pocet; i++)

{

bod−>bod−>pruziny.push back(bod−>nejblizsi[i].bod); bod−>nejblizsi[i ]. bod−>pruziny.push back(bod−>bod); }

}

matice.clear () ;

for( int i =0; i < seznamElementu.size();i++)

{

glLoadIdentity () ; MATRIX4x4 mat;

glGetFloatv(GL MODELVIEW MATRIX, mat.m); matice.push back(mat);

} }

V ´ypis 9: Pseudo algoritmus pro rozklad Springs (CreateLogic)4/4

Po skonˇcen´ı cyklu proch´azej´ıc´ı seznam tmpList se m ˚uˇzou nach´azet v seznamu aktu´alnˇe zpracov´avan ´ych bodu listZbod body, pro kter´e nebyly vytvoˇreny logick´e vazby a nebyly vyˇrazeny. Proto je nutn´e pro tyto body vytvoˇrit logick´e vazby a vyˇradit je. A nakonec je jeˇstˇe vytvoˇren seznam matic pro v ´ypoˇcet transformac´ı.

Funkce pro aktualizaci transformaˇcn´ıch matic je oproti dekompozici Tree sloˇzitˇejˇs´ı. Funkce pracuje n´asledovnˇe: poˇc´ateˇcn´ı stav mˇejme takov ´y, ˇze jedna z dom´en byla vybr´ana a posunuta v prostoru nˇejak ´ym smˇerem. Oˇcek´avejme, ˇze d´ıky Springs dekompozici se n´aslednˇe posunou i ostatn´ı dom´eny stejn ´ym smˇerem, ale jinou s´ılou. S´ıla, o kterou se dom´eny posunou, bude z´aviset na jejich vzd´alenosti od prvn´ı vybran´e posunut´e dom´eny.

ˇ

C´ım vzd´alenˇejˇs´ı budou dom´eny, t´ım by mˇela b ´yt s´ıla menˇs´ı. V ´ypoˇcet vzd´alenosti zde nahrad´ıme vazbami mezi jednotliv ´ymi dom´enami (pruˇzinkami). D´ıky tomu ve v ´ysledku nemus´ı na vzd´alenosti z´aviset s´ıla, ale pouze na logick´em propojen´ı mezi dom´enami.

(38)

{

glPushMatrix();

vector<int> pouziteUzly;

vector<sTMPMinBod∗> cekaNaZpracovani;

cSpring∗ b = (cSpring ∗)seznamElementu.at(vybrany); pouziteUzly.push back(vybrany);

for( int i =0; i < b−>pruziny.size(); i++)

{

sTMPMinBod∗ zrp = new sTMPMinBod; zrp−>bod = b−>pruziny.at(i); zrp−>vzdalenost = 0.9; cekaNaZpracovani.push back(zrp); } // Vykonat posunuti glLoadIdentity () ;

glTranslated(b−>centrum.x∗x∗10 ,b−>centrum.y∗y∗10, b−>centrum.z∗z∗10); MATRIX4x4 mat;

glGetFloatv(GL MODELVIEW MATRIX, mat.m); matice[vybrany] = mat;

for (; cekaNaZpracovani.size() != 0 ;)

{

sTMPMinBod∗ pr = cekaNaZpracovani.at(0);

cekaNaZpracovani.erase(cekaNaZpracovani.begin());

if (std :: find (pouziteUzly.begin(), pouziteUzly.end() ,pr−>bod−>node−>getID()) !=

pouziteUzly.end()) continue; pouziteUzly.push back(pr−>bod−>node−>getID()); // Vykonat posunuti glLoadIdentity () ; glTranslated(b−>centrum.x∗x∗pr−>vzdalenost∗10 ,b−>centrum.y∗y∗pr−>vzdalenost∗10, b −>centrum.z∗z∗pr−>vzdalenost∗10); MATRIX4x4 mat2;

glGetFloatv(GL MODELVIEW MATRIX, mat2.m); matice[pr−>bod−>node−>getID()] = mat2;

for( int i =0; i < pr−>bod−>pruziny.size(); i++)

{

sTMPMinBod∗ zrp = new sTMPMinBod; zrp−>bod = pr−>bod−>pruziny.at(i); zrp−>vzdalenost = 0.8∗ pr−>vzdalenost; cekaNaZpracovani.push back(zrp); } } glPopMatrix(); }

(39)

cekaNaZpracovani, kter ´y bude zajiˇstovat, v jak´em poˇrad´ı se maj´ı uzly zpracov´avat. D´ale provedeme prvn´ı v ´ypoˇcet posunut´ı pro vybranou prim´arn´ı dom´enu (uzel). Nej-prve vezme vˇsechny logick´e vazby, jdouc´ı od tohoto uzlu k jin ´ym, a pˇrid´ame je do se-znamu cekaNaZpracovani. Pro tyto ´uˇcely vyuˇzijeme strukturu sTMPMinBod, kter´a je obohacena o koneˇcnou s´ılu p ˚usob´ıc´ı na dom´enu, kter´a je na druh´e stranˇe logick´e vazby (pruˇziny). Posl´eze vypoˇcteme transformaˇcn´ı matici pro vybranou dom´enu a uloˇz´ıme ji.

Potom v cyklu proch´az´ıme seznam cekaNaZpracovani. Pro kaˇzd ´y cyklus vezmeme aktu´aln´ı prvek ze seznamu. Projdeme seznam pouziteUzly a pokud se v tomto seznamu n´aˇs aktu´aln´ı uzel nenach´az´ı, tak ho tam pˇrid´ame. D´ale vypoˇcteme pro tento uzel trans-formaˇcn´ı matici a uloˇz´ıme ji. Nakonec vyt´ahneme z aktu´aln´ıho prvku seznam vˇsech lo-gick ´ych vazeb, kter´e u sebe m´a, a uloˇz´ıme je do seznamu cekaNaZpracovani.

Cyklus konˇc´ı v okamˇziku, kdy nen´ı ˇz´adn ´y prvek v seznamu cekaNaZpracovani.

4.3.2 Shader - phong

Teoreticky popis Phongova st´ınovan´ı je naps´an v kapitole 2.3.2.

Navrˇzen´a struktura pro vykreslen´ı modelu m´a v urˇcit´em pohledu jednu vlasnost, kter´a je potˇreba vyˇreˇsit pˇred samotn ´ym vykreslen´ım. Vnitˇrn´ı stˇena mezi dvˇema pˇrilehaj´ıc´ımi dom´enami se duplikuje. Takto sice vzniknou dvˇe stˇeny, kaˇzd´a u jedn´e dom´eny, ale tyto stˇeny sd´ılej´ı jednu norm´alu. Pˇri posunut´ı ˇci otoˇcen´ı dom´eny m ˚uˇze b ´yt vidˇet, jak se neko-rektnˇe st´ınuj´ı tyto stˇeny. Proto pˇri vykreslov´an´ı v shaderu se kaˇzd´a norm´ala troj ´uheln´ıku, kter´a by byla ve stejn´em smˇeru jak je pohled kamery, ot´aˇc´ı. jak zn´azor ˇnuje v ´y ˇnatek k ´od ˚u z vertex shaderu.

if (dot(vViewVec, vNormal) < 0.0)

vNormal∗= −1.0;

V ´ypis 11: Pseudo algoritmus pro otoˇcen´ı norm´aly Zde uk´azan ´y k ´od z pixel shaderu je zredukovan ´y jen na podstatn´e ˇc´ast´ı.

...

void main (void)

{ ...

(40)

if (lambertTerm > 0.0)

{

final color += color ∗ lambertTerm; vec3 E = normalize(vViewVec);

vec3 R = reflect (−normalize(vViewVec), vNormal);

float specular = pow( max(dot(R, E), 0.0), 30);

final color += MSpecular∗(specular/5.0); }

gl FragColor = final color ; }

V ´ypis 12: Pixel shader

Nejprve se vypoˇcte ´uhel mezi smˇerem kamery a norm´alou vykreslovan´e stˇeny. Pot´e se rozhodne, zda je stˇena osv´ıcen´a. Nakonec se pˇrid´a reflexn´ı sloˇzka a spekul´arn´ı sloˇzka.

4.3.3 Vyhlazov ´an´ı

Popis algoritmu pro vyhlazov´an´ı byl naps´an v kapitole 2.3.1.

Pro potˇreby algoritmu pro vyhlazov´an´ı bylo potˇreba zajistit spr´avn´e pˇrisazen´ı re´aln ´ych ID vrchol ˚u jednotliv ´ych element ˚u, protoˇze se v pr ˚ubˇehu zpracov´av´an´ı modelu ID vr-cholu mˇenily. ˇReˇsen´ım tohoto probl´emu bylo vytvoˇren´ı speci´aln´ıho pole integeru s n´azvem RealID. Toto pole se pot´e vyplnilo re´aln ´ymi indexy vrchol ˚u ve funkci InitializeMeshParts tˇr´ıdy FEMCreator z dat GeometryInfo.

N´asledn´e vyhlazen´ı prob´ıh´a po zavol´an´ı funkce smooth, kter´a je funkc´ı tˇr´ıdy Sce-neTree. Pro zrychlen´ı algoritmu je pole RealID setˇr´ıdˇeno. A ve funkci pomSSrovnej se provede samotn´e vyhlazen´ı.

(41)

Obr´azek 20: Uk´azka QtTreePropertyBrowser

Pouˇzit´ı t´eto tˇr´ıdy najdeme uvnitˇr tˇr´ıdy visualDockWidget. K t´eto tˇr´ıdˇe byla navrhnuta speci´aln´ı tˇr´ıda visualVariantItem, kter´a byla zdˇedˇena z QtVariantProperty a pˇredstavuje jednotliv´e poloˇzky ze seznamu nastaven´ı. Interakce s t´ımto GUI prvkem byla zprostˇredkov´ana skrze funkci valueChangedProp, kter´a byla spojena pomoc´ı funkce connect s slotem va-lueChanged.

(42)

5

Testov ´an´ı

Tato posledn´ı kapitola je vˇenov´ana testov´an´ı aplikace. Nalezneme zde popis modelu, konfiguraci PC, na kter ´ych byly provedeny testy. Testy byly provedeny ve tˇrech vlastnos-tech. Jako vlastnosti, kter´e budou otestov´any, byly vybr´any fps, vyt´ıˇzen´ı pamˇeti a z´atˇeˇz CPU. U kaˇzd´eho testu nalezneme pˇrehledn ´y graf a zhodnocen´ı v ´ysledk ˚u tohoto testu.

Testov´an´ı je ned´ılnou souˇc´ast´ı kaˇzd´e aplikace. Na t´eto diplomov´e pr´aci (aplikaci) byly prov´adˇeny testy tˇr´ı vlastnost´ı. Prvn´ı vlastnost´ı bylo poˇcet frame per second (sn´ımku za sekundu), d´ale oznaˇcov´ano jen jako fps. Druhou vlastnost´ı byla vyt´ıˇzenost CPU a tˇret´ı vlastnost´ı bylo sledov´an´ı pamˇeti RAM.

Obr´azek 21: Uk´azka model 1

Aplikace byla testovan´a na poˇc´ıtaˇci s konfiguraci Intel Core2 Duo CPU 2.10 GHz, NVIDIA GeForce G205M, 4 GB RAM a syst´em Windows 7.

Jako testovac´ı modely byly zvoleny 3 z´akladn´ı modely, jenˇz se naˇc´ıtaly z disku a byly ve speci´aln´ım form´atu. Modely vypadaj´ı totoˇznˇe, jenom se liˇs´ı v detailnosti propracov´an´ı a poˇctu dom´en.

Prvn´ı model zab´ır´a na disku 1,94 MB. M´a 3045 vrchol ˚u a skl´ad´a se z 13 dom´en. Na obr´azku 21 si m ˚uˇzete prohl´ednout, jak model vypad´a.

Druh ´y model zab´ır´a na disku 15,7 MB. M´a 90081 vrchol ˚u a skl´ad´a se ze 17 dom´en. Na obr´azku 22 si m ˚uˇzete prohl´ednout, jak model vypad´a.

Tˇret´ı a nejsloˇzitˇejˇs´ı model ze vˇsech testovan ´ych model ˚u zab´ır´a na disku 52,6 MB. M´a 273976 vrchol ˚u a skl´ad´a se z 64 dom´en. Na obr´azku 23 si m ˚uˇzete prohl´ednout, jak model vypad´a.

K testov´an´ı fps byly pouˇzity ´udaje, kter´e poskytuje sama aplikace, pro testovac´ı ´uˇcely byla vypnuta vertik´aln´ı synchronizace. Takˇze rychlost fps neodpov´ıd´a skuteˇcn´e rychlosti zobrazov´an´ı na monitoru, ale ud´av´a potenci´aln´ı rychlost v ´ypoˇctu pro zobrazen´ı na mo-nitoru. Na testov´an´ı vyt´ıˇzenosti CPU byl pouˇz´ıt program Samurize, jenˇz je k dispozici pod licenc´ı Freeware. Autorem tohoto programu je Gustav & Oscar Lundh. K monito-rov´an´ı pamˇeti RAM byl pouˇz´ıt program RAM graf verze 1.999, kter ´y je taky k dispozici pod licenc´ı Freeware. Autorem programu RAM Graf je DExUS.

(43)

Obr´azek 22: Uk´azka model 2

Obr´azek 23: Uk´azka model 3

FPS tedy poˇcet sn´ımku za sekundu je, jak uˇz n´azev vypov´ıd´a, d ˚uleˇzit ´y pro rychlost vykreslov´an´ı. Rychlost vykreslovan´ı je jedn´ım z nejd ˚uleˇzitˇejˇs´ıch faktoru pro poˇc´ıtaˇcovou grafiku. N´ızk´a hodnota fps m ˚uˇze zp ˚usobovat sek´an´ı obrazu nebo kazit iluzi pohybu. Pro bezprobl´emov´e sledovan´ı pohybu objektu pro naˇse oko je nejmenˇs´ı ud´avanou hodnotou 25 fps. Naprosto dostaˇcuj´ıc´ı hodnota b ´yv´a 60 fps.

V ´ykon CPU je takt´eˇz d ˚uleˇzit ´y. Vˇetˇs´ı v ´ykon CPU znamen´a vˇetˇs´ı n´amahu na poˇc´ıtaˇc a nˇekdy znamen´a i poˇr´ızen´ı rychlejˇs´ıho CPU a tedy draˇzˇs´ı n´aklady.

Velikost spotˇrebov´avan´e pamˇeti by mˇela j´ıt ruku v ruce s velikost´ı naˇc´ıtan´eho objektu. Takˇze i zde by mˇela b ´yt snaha o co nejmenˇs´ı spotˇrebu pamˇeti, protoˇze velk´a spotˇreba pamˇeti znamen´a vˇetˇs´ı pamˇet’, a to zase navyˇsuje potˇrebu vˇetˇs´ı investice penˇez.

(44)

5.1 Testov ´an´ı - fps

Testov´an´ı fps prob´ıhalo ve tˇrech kroc´ıch. Prvn´ım krokem bylo zmˇeˇren´ı fps v klidov´em stavu, kdy se s modelem nijak nemanipulovalo. Druh ´y test se zamˇeˇril na mˇeˇren´ı fps pˇri n´ahodn´e manipulaci s modelem. Ve tˇret´ım testu bylo mˇeˇreno fps pˇri manipulaci s ˇc´asteˇcnˇe pr ˚uhledn ´ym modelem. Testy prob´ıhaly nad shaderem typu phong.

Obr´azek 24: Testov´an´ı fps - stav v klidu

V grafu vid´ıme, ˇze model 1 a model 2 je jeˇstˇe nad hranic´ı dobr´e rychlosti fps. Model 3 je vˇsak uˇz pod hranic´ı, poˇcet fps se pohybuje okolo 24 sn´ımk ˚u za sekundu, coˇz je pˇribliˇznˇe frekvence sn´ımk ˚u u filmu, ale u poˇc´ıtaˇcov´e grafiky je to uˇz na hranˇe se sek´an´ım obrazu. Model 3 m´a vˇsak 91kr´at v´ıce vrchol ˚u neˇz model 1 a vzhledem k tomu je 24 fps dostaˇcuj´ıc´ı.

Obr´azek 25: Testov´an´ı fps -pracovn´ı stav

Na grafu 2 vid´ıme m´ırn ´y propad fps pˇri manipulaci s modelem. To je pochopiteln´e a oˇcekavateln´e, protoˇze pˇri manipulaci s objektem se vykresluj´ı nav´ıc dalˇs´ı grafick´e prvky,

(45)

Obr´azek 26: Testov´an´ı fps s pr ˚uhlednost´ı

Na grafu 3 lze vidˇet pˇrekvapuj´ıc´ı zv ´yˇsen´e fps oproti norm´alu. Oˇcek´avali bychom pro-pad fps, protoˇze vykreslov´an´ı s pr ˚uhlednost´ı je sloˇzitˇejˇs´ı. Avˇsak pr ˚uhlednost je pouˇzita na objekty, u kter ´ych je vypnuta manipulace, a d´ale jsou tyto modely zjednoduˇsenˇe vykres-lov´any. Proto je v ´ysledn´e vykreslen´ı obrazovky u ˇc´asteˇcnˇe pr ˚uhledn ´ych model ˚u rychlejˇs´ı neˇz norm´aln´ı vykreslen´ı.

(46)

5.2 Testov ´an´ı - CPU

Testov´an´ım vyt´ıˇzenosti CPU (obr´azek 27) bylo zjiˇstˇeno, ˇze nejsloˇzitˇejˇs´ı model 3, jenˇz m´a 91kr´at v´ıce vrchol ˚u neˇz model 1, zatˇeˇzuje CPU dvakr´at tak v´ıce neˇz model 1.

5.3 Testov ´an´ı - Pam ˇet

Pˇri testu pamˇeti bylo hlavn´ım c´ılem zjistit jej´ı vyuˇzit´ı pˇred a po naˇcten´ı jednotliv ´ych mo-delu. Testy byly prov´adˇeny dva. Jeden na zjiˇstˇen´ı, kolik dan ´y model zab´ır´a v pamˇeti m´ısta. A druh ´y test, jenˇz byl vypoˇcten z prvn´ıho, byl zamˇeˇren na zjiˇstˇen´ı pomˇeru vyuˇzit´ı pamˇeti modelem k poˇctu vrchol ˚u, ze kter ´ych se model skl´ad´a.

Obr´azek 28: Testov´an´ı pamˇeti

Graf 28 n´am ukazuje absolutn´ı vyuˇzit´ı pamˇeti. Tento graf n´am vˇsak neˇrekne skoro nic, proto je lepˇs´ı pod´ıvat se na dalˇs´ı graf 29, kde je zobrazen pomˇer vyuˇzit´ı pamˇeti k poˇctu vrchol ˚u modelu. Zde vid´ıme, ˇze se hodnota pohybuje okolo ˇc´ısla dvˇe. Z toho vypl ´yv´a, ˇze r ˚ust velikosti modelu v pamˇeti je line´arn´ı k velikosti modelu.

(47)
(48)

6

Z ´av ˇer

Vˇsechny c´ıle byly splnˇeny. Po implementaˇcn´ı str´ance byly navrhnuty a vypracov´any vˇsechny zadan´e ´ukoly, jmenovitˇe dekompozice Simple,Tree,Springs, vyhlazov´an´ı, sha-der, ´uprava a pˇrid´an´ı GUI rozhran´ı a pˇrid´an´ı alfa kan´alu. Testy na fps prok´azaly, ˇze si aplikace porad´ı s mal ´ymi a stˇrednˇe velk ´ymi modely. U velk ´ych model ˚u testy prok´azaly, ˇze zobrazovac´ı rychlost fps je na hranˇe pˇr´ıpustn´e ´urovnˇe, ale st´ale dostaˇcuj´ıc´ı. Testy na pamˇet n´am uk´azaly, ˇze spotˇrebovan´a pamˇet roste linearnˇe s velikost´ı model ˚u. Velkou roli pro rychlost fps tak´e pˇrispˇelo permanetn´ı nastaven´ı kreslen´ı pouze vnˇejˇs´ıch element ˚u. Doposud se kreslily i vnitˇrn´ı elementy.

Implementace dekompozice do aplikace se zdaˇrila. Vˇsechny tˇri dekompozice maj´ı navrhnut´e vlastnosti a schopnosti. Dekompozice Simple je jednoduchou alternativou, kter´a je vhodn´a pro rychlou dekompozici pro jednoduch´e modely. Dekompozice Tree je vhodnou volbou pro sloˇzitˇejˇs´ı modely, jenˇz potˇrebuj´ı pˇri rozpadu ˇc´asteˇcnou kontrolu nad modelem. Posledn´ı tˇret´ı dekompozice Springs se uk´azala jako vhodn´a volba pro sloˇzit´e modely, pro kter´e jsou predeˇsl´e dvˇe dekompozice nedostaˇcuj´ıc´ı.

V ´ypoˇcet vyhlazen´ı modelu je rychl ´y a norm´aly ve vrcholem spr´avnˇe nastavuj´ı. Vyhla-zov´an´ı a navrhnut ´y shader zlepˇsuje obrazov ´y vjem modelu. Pˇridan´e prvky grafick´eho uˇzivatelsk´eho rozhran´ı byly ˇr´adn´e um´ıstˇeny do oblasti, kam by mˇely intuitivnˇe patˇrit, takt´eˇz jejich ovl´ad´an´ı je jednoduch´e a pˇrehledn´e.

Vykonan´e testy uk´azaly dobrou kvalitu aplikace. Testy na fps prok´azaly dostateˇcnˇe rychle vykreslen´ı i pro sloˇzit´e modely. Testy na vyuˇzit´ı pamˇeti provˇeˇrily dobr´e hospodaˇren´ı s pamˇeti, tedy vyuˇzit´ı pamˇeti roste line´arnˇe s velikost´ı modelu. A CPU testy nezazname-naly, ˇz´adn´e velk´e zat´ıˇzen´ı procesoru. Celkov´e je aplikace sviˇzn´a a rychl´a.

(49)

[4] Mike Bailey: Using GPU Shaders for Visualization, IEEE Computer Graphics and Ap-plications, 2009.

[5] Yinlong Sun, Qiqi Wang: Interference Shaders of Thin Films, Comput. Graph. Forum, 2008.

[6] Mike Bailey: Teaching OpenGL shaders: Hands-on, interactive, and immediate feedback, Computers and Graphics, 2007.

[7] Wolfgang Engel: GPU Pro: Advanced Rendering Techniques, ISBN-10: 1568814720, 2010.

[8] Alan Ezust, Paul Ezust: Introduction to Design Patterns in C++ with Qt (2nd Edition), Prentice Hall, 2008.

[9] Jasmin Blanchette and Mark Summerfield: C++ GUI Programming with Qt 4 (2nd Edition) - The official C++/Qt book, Prentice Hall, 2008.

[10] Mark Summerfield: Advanced Qt Programming: Creating Great Software with C++ and Qt 4, Prentice Hall, 2010.

[11] Johan Thelin: Foundations of Qt Development, Apress, 2007.

[12] Frank H. P. Fitzek, Tommi Mikkonen, Tony Torp: Qt for Symbian, Forum Nokia, 2010. [13] Boudewijn Rempt: Python: Qt Edition, OpenDocs, LLC , 2002.

[14] J. N. Reddy: Introduction to the Finite Element Method, McGraw-Hill Science/Enginee-ring/Math; 2 edition, 1993.

[15] David Moratal: Finite Element Analysis, Sciyo, August, 2010

[16] S.S. Bhavikatti: Finite Element Analysis, New Age International, 2007.

[17] Daryl L. Logan: A First Course in the Finite Element Method, Cengage Learning, 2007 [18] Thomas J. R. Hughes: The Finite Element Method: Linear Static and Dynamic Finite

(50)

[19] Tirupathi R. Chandrupatla, Ashok D. Belegundu: Introduction to finite elements in en-gineering, Prentice Hall, 1997.

[20] Eduard Sojka, Poˇc´ıtaˇcov´a grafika II: metody a n´astroje zobrazov´an´ı 3D sc´en, VˇSB-TUO. [21] Andrew S. Glassner: An Introduction to Ray Tracing, Morgan Kaufmann, 1989. [22] Peter Shirley, R. Keith Morley: Realistic Ray Tracing, A K Peters Ltd, 2009.

[23] Tomas M ¨oller, Eric Haines, Naty Hoffman: Real-Time Rendering, CRC Press, 2008. [24] Matt Pharr, Greg Humphreys, Greg Humphreys (Ph. D.): Physically Based Rendering:

From Theory To Implementation, Morgan Kaufmann, 2004.

[25] Henrik Wann Jensen: Realistic image synthesis using photon mapping, A K Peters, 2001. [26] John R. Wallace: Radiosity and Realistic Image Synthesis, Morgan Kaufmann, 1993. [27] Arie Kaufman: Volume visualization, IEEE Computer Society Press, 1991.

[28] Min Chen, Arie Kaufman, Roni Yagel: Volume graphics, Springer, 2000.

[29] Erhard Neher, Alistair Savage, Weiqiang Wang: Geometric Representation Theory and Extended Affine Lie Algebras, American Mathematical Soc., 2011.

[30] Michael Richard Gosz: Finite Element Method: Applications in Solids, Structures, And Heat Transfer, Taylor and Francis, 2006.

[31] Young W. Kwon, Hyochoong Bang: The Finite Element Method Using Matlab, CRC Press, 2000.

References

Related documents

Working in conjunction with the Stroke Association this service provides a community approach in rehabilitation supporting those with an acquired brain injury and/or

Furthermore, traditional livestock farming directly fosters the usage of groundwater and dug wells (Oshikweyo) and indirectly reduces the water supply security by, for in-

or information about their expertise, which is repeated mainly with Negation feedback. Social: we mean context information related to a user’s role at work, and

The first part you define is the control arm. You begin by building its hardpoints. You can later modify these hardpoints to determine their effects on your vehicle. Next, you

Physician Greater Pittsburgh Neurosurgical Assocs UPMC 5115 Centre Avenue Third Floor Pittsburgh PA 15232 Allegheny Physician Greater Pittsburgh Neurosurgical Assocs UPMC 532

Furthermore Winograd (1987) explains that for achieving language understanding, a computer that “as a language machine, manipulates symbols without respect to

6 Minta daftar persediaan yang mencakup nama barang, kualitas, dan harga per tanggal neraca serta cocokkan dengan buku besar.. 7 Lakukan penelaah analitis (analytical review)

Looking to both feminist linguistic and social-science research, I argue that Pinterest exhibits a unique traffic in visual and verbal codes—an emerging online rhetoric that allows