• No results found

Implicitn´ıplochyvBlenderu Jiˇr´ıHn´ıdek DIPLOMOV´APR´ACE

N/A
N/A
Protected

Academic year: 2022

Share "Implicitn´ıplochyvBlenderu Jiˇr´ıHn´ıdek DIPLOMOV´APR´ACE"

Copied!
60
0
0

Loading.... (view fulltext now)

Full text

(1)

Technick´ a univerzita v Liberci

Fakulta mechatroniky a mezioborov´ ych inˇ zen´ yrsk´ ych studi´ı

DIPLOMOV ´ A PR ´ ACE

Jiˇr´ı Hn´ıdek

Implicitn´ı plochy v Blenderu

Katedra softwarov´eho inˇzen´yrstv´ı Vedouc´ı diplomov´e pr´ace: RNDr. Kl´ara C´ısaˇrov´a Studijn´ı program: Elektrotechnika a informatika Studijn´ı obor: Automatick´e ˇr´ızen´ı a inˇzen´yrsk´a informatika

Liberec 2004

(2)

Podˇekov´an´ı

Na tomto m´ıstˇe bych chtˇel podˇekovat zejm´ena sv´e vedouc´ı diplomov´e pr´ace RNDr. Kl´aˇre C´ısaˇrov´e za jej´ı trpˇelivost a d˚uvˇeru. D´ale bych zde r´ad zm´ınil nˇekter´e lidi z v´yvoj´aˇrsk´e komunity: Ton Roosendaal, Nathan Letwory, Campbell J. Barton, Matt Ebb a dalˇs´ı, kteˇr´ı mi pom´ahali v pronik´an´ı do zdrojov´ych k´od˚u. V neposledn´ı ˇradˇe bych chtˇel podˇekovat vˇsem uˇzivatel˚um, kteˇr´ı poctivˇe hl´asili m´e chyby do bugtrackeru.

Pouˇzit´y software

Tato pr´ace byla vys´azena programem LATEX pod operaˇcn´ım syst´emem SUSE Linux 9.1 s pouˇzit´ım ˇrady dalˇs´ıch pomocn´ych program˚u s GNU licenc´ı.

Kontakt

E-mail: jiri.hnidek@vslib.cz

Dom´ac´ı str´anka: http://jiri hnidek.blogspot.com

(3)

Prohl´ aˇ sen´ı

Byl jsem sezn´amen s t´ım, ˇze na mou diplomovou pr´aci se plnˇe vztahuje z´akon ˇc.

121/2000 Sb. o pr´avu autorsk´em, zejm´ena § 60 - ˇskoln´ı d´ılo

Beru na vˇedom´ı, ˇze technick´a univerzita v Liberci (TUL) nezasahuje do m´ych au- torsk´ych pr´av uˇzit´ım m´e diplomov´e pr´ace pro vnitˇrn´ı potˇrebu TUL.

Uˇziju-li diplomovou pr´aci nebo poskytnu-li licenci k jej´ımu uˇzit´ı, jsem si vˇedom povin- nosti informovat o t´eto skuteˇcnosti TUL; v tomto pˇr´ıpadˇe m´a TUL pr´avo ode mne poˇzadovat ´uhradu n´aklad˚u, kter´e vynaloˇzila na vytvoˇren´ı d´ıla, aˇz do jejich skuteˇcn´e v´yˇse.

Diplomovou pr´aci jsem vytvoˇril samostatnˇe s pouˇzit´ım uveden´e literatury a na z´akladˇe konzultac´ı s vedouc´ım diplomov´e pr´ace a konzultantem.

Datum

Podpis

(4)

Anotace

C´ılem diplomov´e pr´ace je vylepˇsit implementaci implicitn´ıch ploch v Open Source 3D animaˇcn´ım a modelovac´ım programu Blender a zajistit jejich lepˇs´ı integraci do cel´eho prostˇred´ı. P˚uvodn´ı implementace byla v´yraznˇe urychlena zaveden´ım navrˇzen´ych algo- ritm˚u a byly pˇrid´any nov´e funkce, kter´e usnadˇnuj´ı ovladatelnost implicitn´ıch ploch. Byla opravena spoustu chyb v p˚uvodn´ı implementaci. Polygonizace implicitn´ıch ploch byla urychlena pˇredevˇs´ım d´ıky pouˇzit´ı oktanov´eho stromu a line´arn´ı interpolaci. Kromˇe nov´ych ˇr´ıd´ıc´ıch primitiv (MetaEllipsoid, MetaPlane a MetaCube) bylo diskutov´ano pouˇzit´ı tˇelesa s ploˇskovou reprezentac´ı jako ˇr´ıd´ıc´ı struktury pro implicitn´ı plochy.

Abstract

The aim of the thesis is to improve implementation of implicit surfaces in Open Source 3D program Blender and provide better integration of implicit surfaces to the whole envi- ronment. Original implementation was made faster and new functions were added, which makes controllability easier. Of course, many bugs from original implementation were fixed.

Polygonisation of implicit surfaces is faster due to using optimisation of octal tree and lin- ear interpolation. New directive primitives were added (MetaEllipsoid, MetaPlane and MetaCube). Using mesh as directing structure for implicit surfaces was discussed.

(5)

Obsah

1 Uvod´ 1

2 Blender 1

2.1 Historie . . . 1

2.2 Z´aklady ovl´ad´an´ı . . . 2

2.2.1 Popis programov´eho rozhran´ı . . . 2

2.2.2 Objekty . . . 4

2.3 Vnitˇrn´ı architektura Blenderu . . . 5

2.3.1 Datov´a struktura . . . 6

3 V´yvojov´e n´astroje 7 3.1 Kompil´ator . . . 8

3.2 Sestavovac´ı syst´em . . . 8

3.2.1 Scons. . . 8

3.2.2 Make . . . 9

3.2.3 Microsoft Visual Studio . . . 10

3.3 Lad´ıc´ı n´astroje . . . 11

3.4 Syst´em pro spr´avu verz´ı . . . 11

3.4.1 CVS . . . 12

3.5 Ostatn´ı n´astroje . . . 13

3.5.1 Bug tracker . . . 13

3.5.2 Mailing list . . . 14

3.5.3 IRC . . . 14

3.5.4 Diskuzn´ı f´ora . . . 14

3.5.5 Wiki . . . 14

4 Implicitn´ı plochy 15 4.1 Implicitn´ı funkce . . . 16

(6)

4.2 Smˇeˇsovac´ı funkce . . . 16

4.3 R´ıd´ıc´ı primitivaˇ . . . 18

4.4 V´ypoˇcet vzd´alenosti od ˇr´ıd´ıc´ıho primitiva . . . 19

4.4.1 Vzd´alenost od bodu . . . 19

4.4.2 Vzd´alenost od ´useˇcky . . . 19

4.4.3 Vzd´alenost od obecn´eho troj´uheln´ıka . . . 26

4.4.4 V´ypoˇcet transformaˇcn´ı matice troj´uheln´ıka . . . 28

4.5 Zobrazov´an´ı implicitn´ıch ploch . . . 31

4.5.1 Sledov´an´ı paprsk˚u. . . 31

4.5.2 Pˇrevod na ploˇskovou reprezentaci . . . 31

4.5.3 Dalˇs´ı moˇznosti zobrazov´an´ı implicitn´ıch ploch . . . 32

4.6 Algoritmus pochoduj´ıc´ıch krychl´ı . . . 32

4.6.1 Bin´arn´ı dˇelen´ı intervalu. . . 34

4.6.2 Line´arn´ı interpolace. . . 35

4.6.3 Optimalizace pomoc´ı oktanov´eho stromu . . . 36

4.6.4 Optimalizace pomoc´ı bounding boxu . . . 37

5 Implementace implicitn´ıch ploch v Blenderu 38 5.1 Datov´e struktury . . . 38

5.1.1 Dvoucestn´e dynamick´e seznamy . . . 39

5.1.2 Objekt typu MBALL a MetaBall . . . 39

5.1.3 R´ıd´ıc´ı primitivum MetaElemˇ . . . 40

5.2 P˚uvodn´ı implementace . . . 41

5.2.1 Chyby v p˚uvodn´ı implementaci . . . 41

5.2.2 Funkˇcn´ı nedostatky v p˚uvodn´ı implementaci . . . 42

5.3 Aktu´aln´ı stav . . . 43

5.3.1 Jednotliv´e typy ˇr´ıd´ıc´ıch primitiv . . . 43

5.3.2 Ovl´adac´ı prvky . . . 43

5.3.3 Python API . . . 45

(7)

5.4 MetaMesh . . . 46

5.4.1 MetaVert . . . 47

5.4.2 MetaEdge . . . 48

5.4.3 MetaFace . . . 48

5.5 Benchmarkov´e testy. . . 49

5.6 Komunita . . . 51

6 Z´avˇereˇcn´e zhodnocen´ı 51

(8)

1 Uvod ´

Blender je komplexn´ı 3D modelovac´ı a animaˇcn´ı program. D´ıky vestavˇen´emu GameEnginu v nˇem lze vytv´aˇret i interaktivn´ı aplikace. Blender je dostupn´y na vˇsech hlavn´ıch platform´ach (Windows, Linux, Mac OSX, FreeBSD, IRIX a Solaris). Blender je ˇs´ıˇren jako Open Source pod licenc´ı GPL, coˇz znamen´a, ˇze kromˇe bin´arn´ıch soubor˚u pro jednotliv´e platformy jsou k dispozici i jeho zdrojov´e k´ody. Blender je naps´an ve tˇrech pro- gramovac´ıch jazyc´ıch. J´adro je ps´ano v programovac´ım jazyku C. GameEngine a integrace rendereruyafray1 je naps´ana v jazyku C++. Blender poskytuje python API, pomoc´ı nˇehoˇz jsou v pythonu naps´any importn´ı a exportn´ı filtry, nˇekter´e n´astroje, n´apovˇeda, rozˇs´ıˇren´ı apod. Pomoc´ı OpenGL nen´ı vykreslov´ano pouze 3D prostˇred´ı ale i vˇsechna tlaˇc´ıtka, panely apod. D´ıky implementaci cel´eho rozhran´ı v OpenGL je Blender lehce pˇrenositeln´y na jin´e platformy.

Implicitn´ı plochy, nˇekdy t´eˇz naz´yv´any Metabally, nebo nespr´avnˇe Bloby, jsou pouˇz´ıv´any pˇredevˇs´ım pro vytv´aˇren´ı nˇejak´ych ”ˇziv´ych” struktur jako jsou napˇr´ıklad ka- paliny, mraky, bl´ato, rostliny, ˇzivoˇcichov´e apod. Jejich uplatnˇen´ı vˇsak m˚uˇze b´yt mnohem ˇsirˇs´ı. Pˇrednost´ı implicitn´ıch ploch je jejich hladkost, intuitivnost modelov´an´ı a vysok´a pouˇzitelnost. Z´amˇerem bylo vylepˇsit implementaci implicitn´ıch ploch jak kvalitativnˇe (urychlen´ım jejich vykreslov´an´ı), tak kvantitativnˇe (pˇrid´an´ım nov´ych funkc´ı).

2 Blender

2.1 Historie

Blender byl p˚uvodnˇe vyv´ıjen jako intern´ı n´astroj v holandsk´em animaˇcn´ım studiu Neo- Geo jejich vlastn´ımi uˇzivateli, tak aby splˇnoval jejich poˇzadavky pˇri kaˇzdodenn´ı pr´aci na komerˇcn´ıch projektech. V roce 1998 byla zaloˇzena firma NaN s c´ılem vyv´ıjet Blender jako

1Yafray je Open Source renderer, kter´y um´ı Global Illumination a Photon mapping. Pouˇzit´ım yafraye, jako extern´ıho rendereru, m˚zeme dos´ahnout vysoce kvalitn´ıho fotorealistick´eho zobrazen´ı.

(9)

komerˇcn´ı produkt. Tato ˇcinnost se firmˇe NaN pomˇernˇe daˇrila aˇz do roku 2002, kdy zkra- chovala. Za finanˇcn´ıho pˇrispˇen´ı uˇzivatelsk´e komunity byly uvolnˇeny zdrojov´e k´ody pro- gramu Blender (neobsahovaly integraci GameEnginu) pod licenc´ı GPL. D´ıky tomu jsem se mohl st´at v roce 2003 plnohodnot´ym ˇclenem v´yvoj´aˇrsk´eho t´ymu.

Bˇehem posledn´ıch let se z´akladn´ı ˇc´ast zdrojov´eho k´odu hodnˇe zmˇenila a rozrostla.

Bˇehem obdob´ı 2000-2002 tak´e doˇslo k nˇekolika pokus˚um restrukturalizovat k´od takov´ym zp˚usobem, aby se na v´yvoji Blenderu mohlo pod´ılet v´ıce lid´ı a aby se k´od rozdˇelil do v´ıce logick´ych celk˚u. Avˇsak, d´ıky marketingov´ym poˇzadavk˚um, doh´anˇen´ı term´ın˚u a vyd´av´an´ı verz´ı, doch´azelo ke konflikt˚um: ”co je moˇzn´e a co je potˇreba udˇelat”. Nicm´enˇe vˇetˇsina restruktualizace byla dokonˇcena pˇred bankrotem firmy v roce 2002. Zdrojov´y k´od, kter´y byl uvolnˇen v roce 2002 byl skuteˇcnˇe ”sn´ımkem” prob´ıhaj´ıc´ıho v´yvoje.

2.2 Z´ aklady ovl´ ad´ an´ı

C´ılem t´eto kapitoly nen´ı kompletnˇe popsat ovl´ad´an´ı programu Blender, protoˇze by to mnohan´asobnˇe pˇres´ahlo rozsah cel´e diplomov´e pr´ace. K Blenderu existuje ofici´aln´ı 500 str´ankov´a pˇr´ıruˇcka (lze zakoupit v internetov´em obchodˇe) nebo lze z internetu st´ahnout spoustu tutori´al˚u. Jen v ˇcesk´em jazyce existuje pˇribliˇznˇe 50 velice kvalitn´ıch tutorial˚u, kter´e lze nal´ezt na www.blender3d.cz.

2.2.1 Popis programov´eho rozhran´ı

Blender pouˇz´ıv´a tzv. ”sub window” manager, kdy nedoch´az´ı k jak´emukoliv pˇrekr´yv´an´ı oken. Z´akladn´ı okno lze libovolnˇe dˇelit na menˇs´ı ”podokna”. Rozhran´ı Blenderu m˚uˇze zaˇc´ateˇcn´ıkovi pˇripadat nezvykl´e, ale v posledn´ı dobˇe nach´az´ıme ”sub window” manager i u jin´ych 3D aplikac´ı2.

Na obr´azku [1] vid´ıme, ˇze z´akladn´ı okno programu je rozdˇeleno na tˇri podokna. Horn´ı obsahuje pohled do virtu´aln´ıho 3D prostoru (3D view). kde m˚uˇzeme vidˇet objekt typu

2Pokud se pod´ıv´ame podrobnˇe na komerˇcn´ı 3D aplikace, tak zjist´ıme, ˇze Blender je jim ˇcasto v´ıce neˇz inspirac´ı i v jin´ych oblastech

(10)

Obr´azek 1: Blenderu s 3D pohledem a button window

mesh, kameru, svˇetlo, a aktivn´ı hlavn´ı kontextov´e menu 3D okna. Spodn´ı okno obsahu tzv. tlaˇc´ıtkov´e okno (button window). V tlaˇc´ıtkov´em oknˇe se nach´azej´ı panely s r˚uzn´ymi ovl´adac´ımi okny. Obsah tlaˇc´ıtkov´eho okna se interaktivnˇe mˇen´ı podle obsahu 3D okna.

Kde se ale nach´az´ı 3. okno? To je tak trochu skryto. Je to horn´ı liˇsta s hlavn´ım menu a dalˇs´ımi ovl´adac´ımi prvky.

Jak´ekoliv okno si m˚uˇzeme libovolnˇe rozdˇelit na dvˇe menˇs´ı okna, nebo m˚uˇzeme ´uplnˇe zmˇenit jeho typ, tak aby n´am napˇr´ıklad zobrazoval dalˇs´ı button window. Typ obsahu okna (dohromady je jich celkovˇe 14) lze jednoduˇse pˇrep´ınat, tak aby zobrazovala kromˇe pohledu do 3D sc´eny napˇr´ıklad okno pro neline´arn´ı animaci, textov´y editor, apod. Kaˇzd´e okno obsahuje tzv. hlaviˇcku (header), kde nalezneme jednak pˇrep´ınaˇc typu okna a pak

(11)

menu, kter´e zpˇr´ıstupˇnuje jeho specifick´e funkce. Na obr´azku [2] je plnˇe demonstrov´an ”sub window” manager v Blenderu:

Obr´azek 2: Blender se zapnut´ym outlinerem a oknem pro nastaven´ı prostˇred´ı

2.2.2 Objekty

Na pˇredchoz´ıch obr´azc´ıch jsme si mohli vˇsimnou, ˇze v 3D oknˇe se nach´azej´ı nˇejak´e objekty. Objekty mohou pˇredstavovat objekt z naˇseho re´aln´e svˇeta jako je tˇreba st˚ul, automobil, lidsk´a postava, apod. nebo mohou m´ıt souvislost s osvˇetlov´an´ım sc´eny (kamera, svˇetlo). Nakonec m´ame k dispozici speci´aln´ı objekty pro neline´arn´ı animaci (armatures) a deform´ator objekt˚u. V Blenderu m´ame moˇznost pracovat se 4 druhy objekt˚u, kter´e zobrazuj´ı re´aln´y pˇredmˇet.

(12)

1. Ploˇskov´a reprezentace (Mesh)

2. Parametrick´e kˇrivky (Bezier a Nurbs) 3. Parametrick´e plochy (Nurbs plochy) 4. Implicitn´ı plochy (MetaBally)

Ve vˇsech pˇr´ıpadech jde o objekty s hraniˇcn´ı reprezentac´ı. Takov´eto objekty se mo- hou nach´azet minim´alnˇe ve dvou m´odech, v objektov´em m´odu a editaˇcn´ım m´odu. Objekt s ploˇskovou reprezentac´ı (mesh) m´a dalˇs´ı 3 m´ody. V objektov´em m´odu m˚uˇzeme objekt transformovat (posouvat, nat´aˇcet, zvˇetˇsovat) jako celek. V editaˇcn´ım m´odu m˚uˇzeme mˇenit jeho tvar komplexnˇejˇs´ım zp˚usobem. V pˇr´ıpadˇe ploˇskov´e reprezentace m˚uˇzeme pracovat s jednotliv´ymi vertexy(body), hranami a facy(ploˇskami).

Poloha, rotace a velikost objekt˚u a vˇetˇsinu jejich parametr˚u lze animovat pomoc´ı kl´ıˇcov´an´ı. Animace m˚uˇze b´yt ovlivˇnov´ana i pomoc´ı armatur(kost´ı), de- form´ator˚u(deformaˇcn´ı mˇr´ıˇzka, deformaˇcn´ı kˇrivka, apod.) a python skript˚u.

2.3 Vnitˇ rn´ı architektura Blenderu

Blender m˚uˇzeme charakterizovat jako velkou monolitickou aplikaci. Nˇekter´e ˇc´asti Blenderu jsou modul´arn´ı. Procedur´aln´ı textury a efekty do neline´arn´ıho video editoru lze vytv´aˇret jako pluginy, coˇz jsou speci´aln´ı dynamick´e knihovny (.dll, .so)3. Funkcionalitu Blenderu lze nyn´ı velice flexibilnˇe rozˇsiˇrovat pomoc´ı python skript˚u, ale python skripty nejsou vˇsemocn´e a nav´ıc jsou v nˇekter´ych pˇr´ıpadech skuteˇcnˇe v´yraznˇe pomalejˇs´ı neˇz k´od napsan´y v C nebo C++.

Blender nem´a ´uplnˇe dokonal´y design, coˇz je zapˇr´ıˇcinˇeno dobou vzniku programu, kdy nebyly k dispozici technologie a znalosti, kter´e jsou k dispozici dnes. Zvl´aˇstˇe teorie animace postav nebyla k dispozici bˇehem p˚uvodn´ı f´aze n´avrhu, coˇz je jeden z d˚uvod˚u, proˇc jsou

3dynamick´e knihovny s pˇr´ıponou .dll se pouˇz´ıvaj´ı na platformˇe Windows, .so se pouˇz´ıvaj´ı na ostatn´ıch platform´ach (UNIX/Linux)

(13)

Armatury, Constraint4 a NLA5 st´ale dosti problematick´e. Jin´ym aspektem je vestavˇen´y Game Engine a jeho logick´e bloky, kter´e byly pˇrid´any ve spˇechu a maj´ı nˇekter´e vady. Do budoucna je nezbytn´e pˇrepsat Blender tak, aby byl plnˇe modul´arn´ı.

2.3.1 Datov´a struktura

Jedna z dalˇs´ıch vˇec´ı, kter´e je v Blenderu pomˇernˇe ˇsikovnˇe implementov´ana, je vlastn´ı datov´a struktura. Data jsou uloˇzena pomoc´ı struktury, kter´a trochu pˇripom´ın´a datab´azi, ale datov´e bloky maj´ı i nˇekter´e vlastnosti Objekt˚u. Uspoˇr´ad´an´ı dat v pamˇeti ilustruje obr´azek [3] pˇrevzat´y zwww.blender3d.org. Vˇsechna data jsou uloˇzena ve stromov´e struktuˇre, kter´a mimojin´e umoˇzˇnuje pouˇz´ıvat data z jin´ych soubor˚u a extr´emnˇe rychl´e naˇc´ıt´an´ı dat z da- tov´ych soubor˚u.

Obr´azek 3: Obr´azek ilustruj´ıc´ı uspoˇr´ad´an´ı dat v pamˇeti poˇc´ıtaˇce

Vˇsechny datov´e bloky stejn´eho typu jsou uloˇzeny v dvoucestn´em dynamick´em seznamu.

Vlastn´ı graf sc´eny (scene graph) je vytv´aˇren pomoc´ı odkaz˚u mezi jednotliv´ymi datov´ymi bloky. Kaˇzd´y datov´y blok m´a unik´atn´ı ID. Datov´y blok d´ale obsahuje odkazy na tzv. Direct Data, kter´a pˇr´ısluˇs´ı pouze dan´emu bloku. Direct Data jsou ukl´ad´ana spolu s datov´ym blokem do souboru a jsou od sv´eho datov´eho bloku neoddˇeliteln´a. Datov´y blok nem˚uˇze

4vazby mezi objekty

5non-linear animation, nebo-li neline´arn´ı animace

(14)

obsahovat ukazatel na Direct Data z jin´eho datov´eho bloku. Datov´y blok m˚uˇze obsahovat pouze ukazatel na jin´y datov´y blok. Napˇr´ıklad datov´y blok typu Mesh m˚uˇze obsahovat ukazatel na datov´y blok Material. Datov´y blok koneˇcnˇe m˚uˇze obsahovat ukazatel na nˇejak´a doˇcasn´a data, napˇr´ıklad na strukturu obsahuj´ıc´ı polygonizovanou plochu.

Obr´azek 4: Z´akladn´ı struktura datov´eho bloku

Bliˇzˇs´ı informace o vnitˇrn´ı architektuˇre Blenderu lze nal´ezt na http://www.blender3d.org/cms/Guides Standards.87.0.html

3 V´ yvojov´ e n´ astroje

V´yvojov´e n´astroje by ˇsly u ”norm´aln´ı” diplomov´e pr´ace shrnout v jednom odstavci, moˇzn´a na p´ar ˇr´adc´ıch, nikoliv vˇsak u projektu, kter´y m´a v´ıce jak 300 000 ˇr´adk˚u zdrojov´eho k´odu a na jehoˇz v´yvoji se pod´ıl´ı v´ıce jak 30 lid´ı, kteˇr´ı jsou rozeseti po cel´e planetˇe. Z toho d˚uvodu se dan´e problematice budeme vˇenovat hloubˇeji.

J´a osobnˇe jsem pro vlastn´ı v´yvoj pouˇz´ıval pouze textov´y editor vim (konkr´etnˇe jeho grafickou nadstavbu gvim) a textovou konzoli. Zkouˇsel jsem Blender vyv´ıjet i pomoc´ı r˚uzn´ych integrovan´ych v´yvojov´ych n´astroj˚u jako je Eclipse nebo KDevelop. Takov´eto n´astroje maj´ı integrovan´y debuger, CVS klienta apod., ale byly sp´ıˇse na obt´ıˇz a pr´aci v´ıce

(15)

zpomalovaly neˇz urychlovaly. To bylo d´ano t´ım, ˇze zdrojov´e k´ody Blenderu jsou skuteˇcnˇe hodnˇe velk´e a velikost moj´ı operaˇcn´ı pamˇeti pomˇernˇe mal´a.

3.1 Kompil´ ator

Pro zkompilov´an´ı Blenderu je potˇreba nˇejak´y kompil´ator jazyka C, C++. Je t´emˇeˇr jedno jak´y kompil´ator pouˇzijeme, pokud splˇnuje normu ANSI. Na vˇetˇsinˇe platforem lze pouˇz´ıt OpenSource kompil´ator gcc, kromˇe platformy IRIX, kde si kompil´ator gcc ”nerozum´ı”

s nˇekter´ymi knihovnami a je nutn´e pouˇz´ıt propriet´arn´ı kompil´ator od firmy SGI. Na plat- formˇe Windows lze kromˇe jiˇz zmiˇnovan´eho kompil´atoru gcc pouˇz´ıt tak´e kompil´ator z Mi- crosoft Visual Studia C++ dod´avan´y firmou Microsoft. Na platformˇe Windows a Linux lze Blender zkompilovat tak´e pomoc´ı kompil´atoru od firmy Intel. Tento kompil´ator dok´aˇze velice dobˇre optimalizovat v´ysledn´y k´od a m˚uˇze doj´ıt k z´asadn´ımu zv´yˇsen´ı v´ykonu v´ysledn´e aplikace.

3.2 Sestavovac´ı syst´ em

Jelikoˇz zdrojov´e k´ody Blenderu maj´ı v´ıce 300 000 ˇr´adku, tak je nutn´e pro vlastn´ı kom- pilaci pouˇz´ıt nˇejak´y sestavovac´ı program. Sestavovac´ı program se star´a o zkompilov´an´ı sou- bor˚u se zdrojov´ym k´odem, spr´avn´e slinkov´an´ı se statick´ymi a dynamick´ymi knihovnami.

Kdyˇz v´yvoj´aˇr zmˇen´ı pouze jeden soubor se zdrojov´ym k´odem, tak je naprosto nezbytn´e, aby sestavovac´ı syst´em zkompiloval pouze tento zdrojov´y soubor a postaral se o jeho slinkov´an´ı.

Nen´ı moˇzn´e pˇri zmˇenˇe jednoho souboru ˇcekat na opˇetovn´e pˇrekompilov´an´ı cel´eho pro- gramu. Chov´an´ı sestavovac´ıho programu je ovlivnˇeno konfiguraˇcn´ımi soubory, kter´e mus´ı v´yvoj´aˇri udrˇzovat spolu se zdrojov´ymi k´ody. Zdrojov´e soubory Blenderu jsou dod´av´any s konfiguraˇcn´ımi soubory pro tˇri r˚uzn´e sestavovac´ı syst´emy.

3.2.1 Scons

Scons je sestavovac´ı syst´em, kter´y je napsan´y v programovac´ım jazyku python. Vynik´a dobrou pˇrenositelnost´ı na jednotliv´e platformy a jednoduchost´ı konfiguraˇcn´ıch skript˚u.

(16)

Konfiguraˇcn´ı skripty jsou vlastnˇe python skripty. Jelikoˇz python je interpretovan´y pro- gramovac´ı jazyk, tak rychlost pˇrekladu nen´ı nijak oslniv´a. Na druhou stranu je tvorba konfiguraˇcn´ıch soubor˚u oproti syst´emu make velice jednoduch´a. Rychlost kompilace lze zv´yˇsit pouˇzit´ım nˇekter´ych optimalizaˇcn´ıch voleb, ale obecnˇe plat´ı, ˇze u v´yvoj´aˇr˚u nen´ı pro svou rychlost pˇr´ıliˇs obl´ıben´y. Tento syst´em pouˇz´ıvaj´ı pˇredevˇs´ım lid´e, kteˇr´ı si sestavuj´ı svoje vlastn´ı v´yvojov´e verze Blenderu.

N´asleduje pˇr´ıklad konfiguraˇcn´ıho souboru Sconstruct pro jednoduch´y projekt ob- sahuj´ıc´ı nˇekolik soubor˚u, kter´e se linkuj´ı do tˇrech statick´ych knihoven. Slinkov´an´ım tˇechto tˇr´ı statick´ych knihoven a matematick´e knihovny libm.so/libm.dll vznikne koneˇcn´y bin´arn´ı spustiteln´y soubor program.

L i b r a r y ( ’ knihovna1 ’ , [ ’ soubor01 .c’ , ’ soubor02 .c’ , ’ soubor03 .c’ ] ) L i b r a r y ( ’ knihovna2 ’ , [ ’ soubor04 .c’ , ’ soubor05 .c’ ] )

L i b r a r y ( ’ knihovna1 ’ , [ ’ soubor06 .c’ , ’ soubor07 .c’ , ’ soubor08 .c’ ] ) Program ( ’program ’ ,

LIBS = [ ’ knihovna1 ’ , ’ knihovna2 ’ , ’ knihovna3 ’ , ’m’ ] , LIBPATH = [ ’/ usr / lib ’ , ’/ usr / local / lib ’ ] )

Je patrn´e, ˇze syntaxe tohoto konfiguraˇcn´ıho souboru je velice jednoduch´a.

3.2.2 Make

Syst´em make je nejd´ele pouˇz´ıvan´ym sestavovac´ım syst´emem pouˇz´ıvan´ym pro kom- pilov´an´ı Blenderu. Vˇsechny konfiguraˇcn´ı soubory Makefile jsou podobn´e bash skript˚um a daj´ı se takt´eˇz pouˇz´ıt na vˇsech platform´ach. Tento sestavovac´ı syst´em je dosti obl´ıben´y u v´yvoj´aˇr˚u protoˇze pomoc´ı nˇekter´ych pˇrep´ınaˇc˚u lze velice zkr´atit dobu pˇrekladu.

CC = g c c

CFLAGS = −g − I / u s r / i n c l u d e

LDPATH = −L/ u s r / l i b / −L/ u s r /X11R6/ l i b /

LDFALGS = −g −lGL −lGLU −lm − lX11 −lXmu − l g l u t TARGET = program

(17)

# t a r g e t s

a l l : s o u b o r 0 1 . o s o u b o r 0 2 . o

g c c −o \ $ (TARGET) \$LDPATH \$LDFLAGS s o u b o r 0 1 . o s o u b o r 0 2 . o

s o u b o r 0 1 . o : s o u b o r 0 1 . c

g c c − c −o s o u b o r 0 1 . o \$CFLAGS s o u b o r 0 1 . c

s o u b o r 0 2 . o : s o u b o r 0 2 . c

g c c − c −o s o u b o r 0 2 . o \$CFLAGS s o u b o r 0 2 . c

c l e a n :

rm − f \ $ (TARGET) rm − f ∗ . o

rm − f ∗ ˜

Pˇredchoz´ı pˇr´ıklad souboru Makefile zkompiluje dva soubory do jednoho spustiteln´eho bin´arn´ıho souboru. Z pouˇzit´ych knihoven m˚uˇzeme usuzovat na to, ˇze se bude jednat o pro- gram, kter´y nˇejak´ym zp˚usobem vyuˇz´ıv´a knihovnu OpenGL a jej´ı nadstavbu OpenGLU.

V prvn´ım roce, kdy byl Blender uvolnˇen jako Open Source byla souˇc´ast´ı zdrojov´ych soubor˚u tak´e konfiguraˇcn´ı sada pro syst´em automake a autoconf. Syst´emy autoconf a automake generuj´ı vlastn´ı soubory Makefile z m´enˇe komplikovan´ych konfiguraˇcn´ıch soubor˚u a nav´ıc kontroluj´ı pˇr´ıtomnost vˇsech poˇzadovan´ych knihoven a pˇr´ısluˇsn´ych hlaviˇckov´ych soubor˚u na dan´em syst´emu. Jelikoˇz byl tento syst´em prakticky pouˇziteln´y pouze na platformˇe Linux, tak se od nˇeho upustilo a pˇreˇslo se na syst´em scons.

3.2.3 Microsoft Visual Studio

Ve zdrojov´ych souborech lze nal´ezt i konfiguraˇcn´ı soubory pro sestavovac´ı program dod´avan´y spolu s Microsoft Visual Studiem. Tento syst´em je pouˇziteln´y pouze na platformˇe Windows.

(18)

3.3 Lad´ıc´ı n´ astroje

Pro nalezen´ı pˇr´ıpadn´e chyby je nutn´e pouˇz´ıt debugger dod´avan´y s pˇrekladaˇcem, J´a jsem pouˇz´ıval debugger gdb a jeho grafickou nadstavbu ddd. Pokud v´yvoj´aˇr chce pro- gram ladit pomoc´ı gdb, tak je nutn´e Blender zkompilovat s volbou -ggdb nebo -g a bez vˇsech optimalizaˇcn´ıch voleb jako je -O2 nebo -march="<CPU>" nebo -mcpu="<CPU>"

apod., protoˇze pˇri pouˇzit´ı optimalizaˇcn´ıch voleb se debugger chov´a podivnˇe: skoky ve zdro- jov´em k´odu postr´adaj´ı n´avaznost. Kdyˇz dojde k p´adu aplikace, tak lze gdb takt´eˇz pouˇz´ıt k nalezen´ı m´ısta p´adu. V Linuxu to funguje tak, ˇze mus´ıme pomoc´ı pˇr´ıkazu ulimit nas- tav´ıme nenulovou velikost tzv. core souboru . Napˇr´ıklad:

ulimit -c 20000

n´am nastav´ı velikost core souboru na 20 MB. Pˇri p´adu aplikace se pak v aktu´aln´ım adres´aˇri vytvoˇr´ı soubor core, kter´y je obrazem pamˇeti v dobˇe p´adu aplikace. P´ad aplikace b´yv´a nejˇcastˇeji zapˇr´ıˇcinˇen snahou programu zapisovat do pamˇeti kter´a nebyla alokovan´a.

Mrtvolku je pak moˇzno pitvat pomoc´ı:

gdb ./blender ./core

K nalezen´ı pˇr´ıˇciny p´adu aplikace se hod´ı napˇr´ıklad pˇr´ıkazy backtrace (v´ypis obsahu z´apisn´ıku a pˇresn´eho m´ısta p´adu aplikace). Tento pˇr´ıkaz obvykle staˇc´ı k odhalen´ı vˇetˇsiny chyb.

3.4 Syst´ em pro spr´ avu verz´ı

Jelikoˇz se na projektu pod´ıl´ı v´ıce program´ator˚u, tak je potˇreba jejich pr´aci nˇejak´ym zp˚usobem koordinovat a zajistit aby byla co moˇzn´a nejv´ıce efektivn´ı. K tomu slouˇz´ı mnoho n´astroj˚u. Jedn´ım z nich je i syst´em CVS.

(19)

3.4.1 CVS

CVS (Concurrent Version System) umoˇzˇnuje efektivn´ı spolupr´aci nˇekolika v´yvoj´aˇr˚u na jednom projektu. Princip ˇcinnosti tohoto syst´emu spoˇc´ıv´a v tom, ˇze soubory se zdro- jov´ymi k´ody, konfiguraˇcn´ımi soubory pro sestavovac´ı programy jsou uloˇzeny v centr´aln´ım reposit´aˇri na serveru odkud si je m˚uˇze kdokoliv st´ahnout. V´yvoj´aˇri maj´ı moˇznost do tohoto reposit´aˇre i zapisovat. CVS syst´em neslouˇz´ı pouze jako centr´aln´ı ´uloˇziˇstˇe zdrojov´ych k´od˚u ke kter´ym lze jednoduˇse pˇristupovat. CVS toho um´ı mnohem v´ıc. CVS udrˇzuje vˇsechny zmˇeny, kter´e byly se soubory provedeny, takˇze lze jednoduˇse zjistit, jak´e zmˇeny byly na souborech provedeny, kdo tyto zmˇeny provedl atd.

Jak´ykoliv uˇzivatel si m˚uˇze st´ahnout aktu´aln´ı obsah reposit´aˇre se zdrojov´ymi soubory Blenderu, zad´an´ım tˇechto pˇeti pˇr´ıkaz˚u na pˇr´ıkazov´e ˇr´adce:

CVS_ROOT="-d:pserver:anonymous@cvs.blender.org:/cvsroot/bf-blender"

cvs login

cvs -z3 co blender cvs -z3 co lib cvs logout

,pak jiˇz staˇc´ı spustit program make nebo scons k zah´ajen´ı vlastn´ı kompilace.

Jelikoˇz se zdrojov´e k´ody neust´ale mˇen´ı (v´yvoj´aˇri bˇeˇznˇe provedou v´ıce jak 10 commit˚u za jeden den), tak pˇr´ıpadn´a aktualizace zdrojov´ych k´od˚u lze prov´est jednoduˇse

CVS_ROOT="-d:pserver:anonymous@cvs.blender.org:/cvsroot/bf-blender"

cvs login cvs -z3 update cvs logout

Anonymn´ı uˇzivatel m˚uˇze prov´adˇet i dalˇs´ı ”nedestruktivn´ı” operace, napˇr.: porovn´av´an´ı jednotliv´ych v´yvojov´ych verz´ı, apod..

(20)

V´yvoj´aˇri, lid´e s pr´avem z´apisu do CVS reposit´aˇre, mohou prov´adˇet spoustu dalˇs´ıch operac´ı, kter´e zde nebudu jmenovat, ale jejich ˇcinnost (pˇredevˇs´ım pˇrihl´aˇsen´ı) je nezbytn´e ˇsifrovat. K tomuto ´uˇcelu slouˇz´ı ssh a vlastn´ı ˇsifrov´an´ı je prov´adˇeno pomoc´ı RSA.

3.5 Ostatn´ı n´ astroje

V´yˇse zmiˇnovan´e n´astroje jsou nezbytn´e pro vlastn´ı v´yvoj, ale v´yvoj´aˇrsk´a komunita potˇrebuje komunikovat i na ´urovni, kter´a je bl´ızk´a napˇr´ıklad lidsk´emu rozhovoru. Pro komunikaci mezi v´yvoj´aˇri a komunikaci uˇzivatelsk´e komunity s v´yvoj´aˇri bylo mimo jin´e vytvoˇreno nˇekolik webov´ych aplikac´ı. Tyto webov´e aplikace jsou nepostradatelnou souˇc´ast´ı v´yvoje a jsou z´aroveˇn vytvoˇren´e pomoc´ı Open Source n´astroj˚u. Lidem, kteˇr´ı se staraj´ı o vˇsechny webov´e str´anky, servery a ostatn´ı servis patˇr´ı n´aˇs velk´y d´ık.

3.5.1 Bug tracker

Bug tracker je syst´em, jeˇz umoˇzˇnuje uˇzivatel˚um hl´asit chyby v programu pomoc´ı jednoduch´eho webov´eho formul´aˇre. Uˇzivatel m˚uˇze chybu ohl´asit i anonymnˇe (bez ˇr´adn´eho zaregistrov´an´ı), ale pak nen´ı upozorˇnov´an elektronickou poˇstou na v´yvoj stavu nahl´aˇsen´e chyby. Pokud se uˇzivatel zaregistruje na http://projects.blender.org, tak kromˇe upo- zorˇnov´an´ı na v´yvoj ohl´aˇsen´e chyby v bug trackeru z´ısk´a pˇr´ıstup k nˇekter´ym dalˇs´ım technologi´ım. Napˇr´ıklad si m˚uˇze na tˇechto str´ank´ach vytvoˇrit sv˚uj vlastn´ı projekt (napˇr´ıklad nˇejak´y rozˇsiˇruj´ıc´ı python skript). Registrace je tak´e velice ´uzce sv´az´ana s ´uˇctem do CVS reposit´aˇre. To ovˇsem neznamen´a, ˇze kdokoliv, kdo se zaregistruje na http://projects.blender.org z´ısk´a automaticky moˇznost z´apisu do CVS reposit´aˇre. To rozhodnˇe ne! Pokud administr´ator povol´ı z´apis do CVS reposit´aˇre, tak pˇrihlaˇsovac´ı heslo je totoˇzn´e jako na http://projects.blender.orga nezbytn´y RSA kl´ıˇc se takt´eˇz vkl´ad´a pomoc´ı webov´eho formul´aˇre na tˇechto str´ank´ach. Cel´a technologie tˇechto str´anek je postaven´a na gforge.org.

(21)

3.5.2 Mailing list

Mailing list sv´ym ´uˇcelem a funkcionalitou dosti pˇripom´ın´a news diskuzn´ı skupiny s t´ım rozd´ılem, ˇze uˇzivatel se mus´ı zaregistrovat na:

http://projects.blender.org/mailman/listinfo/bf-committers

Registrace neslouˇz´ı k odrazen´ı pˇr´ıpadn´ych uˇzivatel˚u, ale je zde proto, aby uˇzivatel´e mailing listu nebyli zahlceni spamem. K ˇcemu v˚ubec takov´y mailing list slouˇz´ı? Uˇzivatel´e pomoc´ı nˇej mohou sledovat zmˇeny v CVS reposit´aˇri, pos´ılat n´avrhy na zmˇenu a zlepˇsen´ı funkcionality, zas´ılat opravn´e patche apod.

3.5.3 IRC

IRC (Internet Relay Chat) je chatovac´ı program, kde m˚uˇze diskutovat nˇekolik uˇzivatel˚u najednou. Kaˇzd´y vˇetˇs´ı Open Source projekt m´a vlastn´ı diskuzn´ı m´ıstnost na nˇejak´em volnˇe pˇr´ıstupn´em IRC serveru. Blender m´a takov´ych diskuzn´ıch m´ıstnost´ı hned nˇekolik. Pro v´yvoj´aˇre je urˇcena m´ıstnost #blendercoders na serveru irc.freenode.net. Nˇekdo by mohl povaˇzovat chatov´an´ı za podˇradn´y zp˚usob komunikace, ale v´yvoj´aˇri ji naopak povaˇzuji za nejpruˇznˇejˇs´ı a nejrychlejˇs´ı.

3.5.4 Diskuzn´ı f´ora

Na internetu lze nal´ezt spoustu diskuzn´ıch f´or se zamˇeˇren´ım na Blender. Pro v´yvoj Blenderu jsou ale nejd˚uleˇzitˇejˇs´ı dvˇe diskuzn´ı f´ora: www.blender.org a www.elysiun.com, kde lze nal´ezt f´ora pro zas´ıl´an´ı nov´ych n´avrh˚u na zmˇenu funkcionality.

3.5.5 Wiki

Wiki je Open Source technologie pro tvorbu webov´ych str´anek, kter´a umoˇzˇnuje komuko- liv mˇenit jejich obsah. Nejzn´amˇejˇs´ı str´anka vytvoˇren´a pomoc´ı wiki je webov´a encyklopedie wikipedia.com. Wiki opˇet nen´ı v´ysadou Blenderu, ale vyuˇz´ıvaj´ı ji i dalˇs´ı Open Source projekty jako je napˇr. Gimp, Ubuntu Linux, apod. Webov´e str´anky nejsou ps´any pomoc´ı

(22)

jazyka HTML, ale maj´ı vlastn´ı syntaxi. Wiki je velice univerz´aln´ı, lze v nˇem vytv´aˇret dokumentaci, ps´at n´avrhy, apod. Pro pr´aci ve wiki je nutn´a registrace. Wiki Blenderu lze nal´ezt na str´ance:

http://wiki.blender.org

4 Implicitn´ı plochy

Implicitn´ı plocha je mnoˇzina bod˚u P v tˇr´ıdimenzion´aln´ım prostoru, kter´e maj´ı stejnou hodnotu implicitn´ı funkce

F (P ) = 0 (1)

Pˇr´ıkladem takov´e mnoˇziny je kulov´a plocha, jej´ıˇz implicitn´ı funkce m´a n´asleduj´ıc´ı tvar:

F (P ) = x2+ y2+ z2+ r2 (2)

Pro vyj´adˇren´ı implicitn´ı plochy s rozd´ıln´ym tvarem bychom potˇrebovali jin´y matem- atick´y pˇredpis. Efektivn´ı pr´ace s plochami, kter´e jsou vyj´adˇreny pouze matematick´ymi pˇredpisy by byla komplikovan´a a neefektivn´ı. S implicitn´ı plochou proto pracujeme po- moc´ı ˇr´ıd´ıc´ıch kostry podobnˇe jako v pˇr´ıpadˇe parametrick´ych kˇrivek nebo ploch. Z´akladn´ı myˇslenka je takov´a, ˇze pouˇz´ıvan´a kostra je tvoˇrena jednoduch´ymi prvky (bod, ´useˇcka, poly- gon apod.) a v´ysledn´a plocha vznikne ”nafouknut´ım” kostry. M˚uˇzeme si pomoci fyzik´aln´ı pˇredstavou tak, ˇze kostra je elektricky nabit´a a v´ysledn´a plocha je jakoby jednou z izoploch elektrick´eho potenci´alu. Izoplocha nemus´ı b´yt souvisl´a a jednotliv´e ˇr´ıd´ıc´ı primitiva mohou m´ıt jinou velikost elektrick´eho n´aboje. Nˇekter´a z nich mohou b´yt polarizov´ana opaˇcnˇe neˇz ostatn´ı.

Pouˇzit´ı kostry m´a v´yhodu v tom, ˇze je pomˇernˇe jednoduchou a intuitivn´ı aproximac´ı v´ysledn´eho objektu (napˇr. lidsk´e tˇelo m´a kostru). Kostra b´yv´a jednoduˇse ovladateln´a.

Pˇrestoˇze bˇehem n´avrhu nevid´ıme vlastn´ı implicitn´ı plochu, tak m´ame pomˇernˇe dobrou pˇredstavu o jej´ım v´ysledn´em tvaru.

(23)

4.1 Implicitn´ı funkce

Kolem kaˇzd´eho ˇr´ıd´ıc´ıho primitiva se nach´az´ı skal´arn´ı pole, kter´e m´a maxim´aln´ı intenzitu na povrchu a jeho intenzita se vzd´alenost´ı kles´a. Pˇr´ıspˇevky od jednotliv´ych ˇr´ıd´ıc´ıch primitiv se sˇc´ıtaj´ı a celkov´a intenzita pole v bodˇe P je urˇcena funkc´ı

F (P ) =

n

X

i=1

ciFi(ri) (3)

kde ci je m´ıra vlivu i-t´eho ˇr´ıd´ıc´ıho primitiva. Tato hodnota m˚uˇze nab´yvat hodnoty od 0 do 1. ri je vzd´alenost bodu P od i-t´eho ˇr´ıd´ıc´ıho primitiva a Fi(ri) je hodnota smˇeˇsovac´ı funkce.

4.2 Smˇ eˇ sovac´ı funkce

Pro implicitn´ı plochy lze pouˇz´ıt nˇekolik smˇeˇsovac´ıch funkc´ı, kter´e se liˇs´ı ve sv´ych koe- ficientech. V Blenderu byla pouˇzita n´asleduj´ıc´ı smˇeˇsovac´ı funkce (blending function).

Fi(ri) = −r R

6

+ 3r R

4

− 3r R

2

+ 1 (4)

V´yhoda t´eto smˇeˇsovac´ı funkce je, ˇze obsahuje celoˇc´ıseln´e koeficienty d´ıky nimˇz lze vztah zjednoduˇsit:

Fi(ri) =



1 −r R

23

(5) V´yznam jednotliv´ych parametr˚u funkce je n´asleduj´ıc´ı. Parametr r je nejmenˇs´ı vzd´alenost bodu P od i-t´eho ˇr´ıd´ıc´ıho primitiva. Parametr R pˇredstavuje maxim´aln´ı r´adius, kde m´a ˇr´ıd´ıc´ı primitivum vliv. Za touto hranic´ı je hodnota smˇeˇsovac´ı funkce nulov´a. Zmˇena polohy jednoho ˇr´ıd´ıc´ıho primitiva t´ım p´adem neovlivˇnuje tvar cel´e plochy.

Naˇse smˇeˇsovac´ı funkce m´a nˇekter´e zaj´ımav´e vlastnosti, kter´e jsou patrn´e na obr´azku [5].

(24)

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0

0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

r/RF

F(r)

Obr´azek 5: Smˇeˇsovac´ı funkce pouˇzit´a v programu Blender

V krajn´ıch bodech m´a nulovou derivaci a je spojit´a ve vˇsech bodech. V jin´ych aplikac´ıch se m˚uˇzete setkat se smˇeˇsovac´ı funkc´ı, kter´a m´a pˇredpis

Fi(ri) = −4 9

r R

6

+ 17 9

r R

4

−22 9

r R

2

+ 1 (6)

Takov´a funkce je nav´ıc symetrick´a podle bodu [0, 5; 0, 5] a m´a ˇsirˇs´ı oblast, kde lze pouˇz´ıt line´arn´ı interpolaci pro v´ypoˇcet bodu leˇz´ıc´ıho na povrchu. Na druhou stranu d´ıky neceloˇc´ıseln´ym koeficient˚um nelze optimalizovat v´ysledn´y algoritmus.

Srovn´an´ı obou pr˚ubˇeh˚u smˇeˇsovac´ıch funkc´ı nalezneme v obr´azku [6].

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

r/RF

F(r)

Obr´azek 6: Porovn´an´ı dvou typ˚u smˇeˇsovac´ıch funkc´ı (modr´a je pouˇzita v programu Blender)

(25)

Na obr´azku [6] m˚uˇzeme vidˇet nejd˚uleˇzitˇejˇs´ı ˇc´ast pr˚ubˇehu, ale mohlo by n´as tak´e zaj´ımat, jak vypad´a pr˚ubˇeh smˇeˇsovac´ı funkce v m´ıstech, kdy plat´ı r > R. Pr˚ubˇeh obou variant smˇeˇsovac´ıch funkc´ı m˚uˇzeme vidˇet na obr´azku [7].

−2 −1.5 −1 −0.5 0 0.5 1 1.5 2

−0.5 0 0.5 1

r/R

F(r)

Obr´azek 7: Porovn´an´ı obou funkc´ı ve vˇetˇs´ım rozsahu

Z obr´azku je patrn´e, ˇze n´ami pouˇzit´a funkce (4) m´a pouze dva inflexn´ı body a je klesaj´ıc´ı pro r > R. Kdeˇzto funkce (6) m´a 4 inflexn´ı body a nen´ı vˇzdy klesaj´ıc´ı pro r > R.

4.3 R´ıd´ıc´ı primitiva ˇ

R´ıd´ıc´ı primitiva se liˇs´ı pouze ve funkc´ıch, kter´ˇ e se pouˇz´ıvaj´ı pro v´ypoˇcet vzd´alenosti bodu P od jejich povrchu. ˇR´ıd´ıc´ım primitivem m˚uˇze b´yt teoreticky jak´ykoliv geometrick´y

´

utvar, ale je ˇz´adouc´ı aby byl jednoduch´y a snadno ovladateln´y. Nejlepˇs´ı je, kdyˇz m˚uˇzeme interaktivnˇe ovl´adat jak jeho tvar, tak i parametry (r´adius Ri a jeho vliv ci) pˇr´ımo v 3D prostˇred´ı. Z´aroveˇn je kladen poˇzadavek na vysokou pouˇzitelnost. Nen´ı pˇr´ıliˇs praktick´e m´ıt rozs´ahlou sadu primitiv jako je kruh, kv´adr, apod. a vym´yˇslet pro kaˇzd´e z nich sloˇzit´e ovl´adac´ı prvky.

Pokud si zvol´ıme za ˇr´ıd´ıc´ı primitiva pouze bod (vertex), ´useˇcku (hranu) a troj´uheln´ık (ploˇsku) tak pomoc´ı nich m˚uˇzeme vytv´aˇret libovoln´e tvary a nav´ıc je jejich interaktivn´ı ovl´ad´an´ı velice jednoduch´e. Non-manifoldn´ı6 mesh skuteˇcnˇe m˚uˇze b´yt pouˇzit jako ˇr´ıd´ıc´ı

6Non-manifoldn´ı mesh je objekt kter´y nen´ı realistick´y. M´a napˇr´ıklad nekoneˇcnˇe ostr´e hrany, osamocen´e

(26)

primitivum. Na prvn´ı pohled by se mohlo zd´at, ˇze v´ypoˇcet vzd´alenosti od troj´uheln´ıka bude pˇr´ıliˇs komplikovan´y, ale pokus´ım se uk´azat, ˇze v´ypoˇcet se d´a velice zefektivnit.

4.4 V´ ypoˇ cet vzd´ alenosti od ˇ r´ıd´ıc´ıho primitiva

V´ypoˇcet vzd´alenosti je nejuˇzˇs´ı hrdlo cel´eho procesu polygonizace. Naˇs´ı snahou je prov´est co moˇzn´a nejv´ıce v´ypoˇctu pˇred cel´ym procesem polygonizace (aproximaˇcn´ı metoda poˇc´ıtaˇcov´e grafiky pro pˇrechod od vstupn´ıch dat k zobrazen´ı ploch nebo objemov´ych el- ement˚u ve 3D), tˇreba i za cenu vˇetˇs´ıch pamˇet’ov´ych n´arok˚u na datov´e struktury, a pˇri vlastn´ım procesu polygonizace, kdy se prov´ad´ı enormn´ı mnoˇzstv´ı v´ypoˇctu vzd´alenosti, z tˇechto v´ypoˇct˚u maxim´alnˇe tˇeˇzit.

4.4.1 Vzd´alenost od bodu

Pokud je ˇr´ıd´ıc´ım primitivem pouze bod, tak je v´ypoˇcet vzd´alenosti velice jednoduch´y

R(x, y, z) =p

x2+ y2+ z2 (7)

V´yhoda v´ypoˇctu vzd´alenosti od bodu je ta, ˇze hodnota je invariantn´ı k natoˇcen´ı a zvˇetˇsen´ı ˇr´ıd´ıc´ıho primitiva.

4.4.2 Vzd´alenost od ´useˇcky

V´ypoˇcet vzd´alenosti od ´useˇcky (hrany) se trochu zkomplikuje, protoˇze vzd´alenost nen´ı z´avisl´a pouze na poloze ´useˇcky v prostoru, ale tak´e na jej´ı velikosti a natoˇcen´ı. Pro v´ypoˇcet vzd´alenosti se m˚uˇze pouˇz´ıt nˇekolik metod. Nejprve bude uk´az´ana metodu, kter´a nen´ı tolik efektivn´ı, ale mohla by se jevit jako nejlepˇs´ı, nebo dokonce jako jedin´a moˇzn´a.

ploˇsky nebo vertexy, apod.

(27)

Prvn´ı zp˚usob v´ypoˇctu vzd´alenosti vych´az´ı z parametrick´e rovnice pˇr´ımky:

c0 = (1 − t).a0+ b0.t t ∈ (−∞, ∞) c1 = (1 − t).a1+ b1.t t ∈ (−∞, ∞) c2 = (1 − t).a2+ b2.t t ∈ (−∞, ∞)

(8)

kde A = [a0, a1, a2] a B = [b0, b1, b2] jsou krajn´ı body ´useˇcky, kter´a je souˇc´ast´ı pˇr´ımky.

Parametr t nab´yv´a u pˇr´ımky hodnot od −∞ do ∞. Modifikac´ı rovnice (8) m˚uˇzeme dostat parametrickou rovnici ´useˇcky:

c0 = (1 − t).a0+ b0.t t ∈ (0, 1) c1 = (1 − t).a1+ b1.t t ∈ (0, 1) c2 = (1 − t).a2+ b2.t t ∈ (0, 1)

(9)

Pokud chceme spoˇc´ıtat nejmenˇs´ı vzd´alenost mezi bodem P a pˇr´ımkou, tak potˇrebujeme zn´at parametr tI kolm´eho pr˚umˇetu bodu do pˇr´ımky:

tI = (b0− a0)(p0− a0) + (b1− a1)(p1− a1) + (b2− a2)(p2− a2)

p(b0− a0)2+ (b1− a1)2 + (b2 − a2)2 (10) Pokud vypoˇcten´y parametr tI splˇnuje podm´ınku:

tI ∈ (0, 1) , (11)

pak m˚uˇzeme vzd´alenost bod˚u P a kolm´eho pr˚umˇetu C(tI) = [c0, c1, c2] spoˇc´ıtat podle n´asleduj´ıc´ıho vztahu:

d(P, C) =p

(p0− c0)2+ (p1− c1)2+ (p2− c2)2 (12) Pokud podm´ınka (11) nen´ı splnˇen´a (kolm´y pr˚umˇet neprot’al ´useˇcku), tak je tˇreba spoˇc´ıtat vzd´alenost od obou jej´ıch krajn´ıch bod˚u.

d(P, A) =p

(p0 − a0)2+ (p1− a1)2+ (p2− a2)2 (13)

(28)

d(P, B) =p

(p0− b0)2+ (p1 − b1)2+ (p2− b2)2 (14) Vzd´alenost bodu P od ´useˇcky je pak:

d(P, AB) = min(d(P, A), d(P, B)) (15)

Takto jsme matematicky popsali v´ypoˇcet vzd´alenosti, kter´y m´a pro naˇse ´uˇcely nˇekter´e nev´yhody, kter´e budou zm´ınˇeny aˇz vyloˇz´ıme druhou moˇznost v´ypoˇctu vzd´alenosti bodu od ´useˇcky.

Druh´y zp˚usob v´ypoˇctu vd´alenosti bodu od ´useˇcky spoˇc´ıv´a v tom, ˇze si nejdˇr´ıve trans- formujeme ´useˇcku i bod P pomoc´ı transformaˇcn´ı matice, tak aby ´useˇcka leˇzela v poˇc´atku soustavy souˇradn´e. V´ypoˇcet vzd´alenosti se t´ım dosti zjednoduˇs´ı a urychl´ı. Krajn´ı body

´

useˇcky by byly A = [−2l, 0, 0] a B = [2l, 0, 0], kde l je d´elka ´useˇcky.

Pro v´ypoˇcet vzd´alenosti samotnou ´useˇcku transformovat nemus´ıme, protoˇze o n´ı v´ıme, ˇ

ze bude leˇzet v poˇc´atku soustavy souˇradn´e. Mus´ıme pouze transformovat bod P , tak aby poloha transformovan´eho bodu P0 v˚uˇci ´useˇcce v poˇc´atku soustavy souˇradn´e byla totoˇzn´a s polohou bodu P v˚uˇci p˚uvodn´ı ´useˇcce. Celou situaci l´epe ilustruje obr´azek [8].

Souˇradnice bodu P0 = [x0, y0, z0, w0] z´ısk´ame z p˚uvodn´ıch souˇradnic bodu P = [x, y, z, w]

pomoc´ı

P0 = M−1.P (16)

rozepsan´y vztah

 x0 y0 z0 w0

=

m0,0 m0,1 m0,2 0 m1,0 m1,1 m1,2 0 m2,0 m2,1 m2,2 0 m3,0 m3,1 m3,2 1

 .

 x y z w

(17)

(29)

Abychom mohli spoˇc´ıtat polohu bodu P0, tak nejdˇr´ıve mus´ıme zn´at inverzn´ı trans- formaˇcn´ı matici. Inverzn´ı transformaˇcn´ı matici jednoduˇse spoˇc´ıt´ame z transformaˇcn´ı mat- ice ´useˇcky. Ot´azka je, jak zjistit transformaˇcn´ı matici ´useˇcky z polohy jej´ıch krajn´ıch bod˚u A = [a0, a1, a2] a B = [b0, b1, b2]? Nejprve si spoˇc´ıt´ame d´elku ´useˇcky:

l = p

(a0 − b0)2+ (a1− b1)2+ (a2− b2)2, (18) Poloha stˇredu ´useˇcky S = [s0, s1, s2]:

s0 = (a0− b0)/2 s1 = (a1− b1)/2 s2 = (a2− b2)/2

(19)

Transformaˇcn´ı matice pro pro posun stˇredu ´useˇcky:

AM =

1 0 0 0

0 1 0 0

0 0 1 0

s0 s1 s2 1

(20)

Natoˇcen´ı ´useˇcky lze vyj´adˇrit pomoc´ı natoˇcen´ı kolem dvou r˚uzn´ych os. Napˇr´ıklad kolem osy y a z. ´Uhel natoˇcen´ı kolem osy z lze vyj´adˇrit pomoc´ı:

θ = arctanb1− a1

b0− a0 (21)

´

uhel natoˇcen´ı kolem osy y se pak spoˇc´ıt´a:

φ = arctancos θ.(b2− a2)

b0− a (22)

(30)

Transformaˇcn´ı matice pro natoˇcen´ı kolem osy z m´a tvar:

ARz =

cos θ sin θ 0 0 sin θ cos θ 0 0

0 0 1 0

0 0 0 1

(23)

Transformaˇcn´ı matice pro natoˇcen´ı kolem osy y m´a tvar:

ARy =

cos φ 0 − sin φ 0

0 1 0 0

sin φ 0 cos φ 0

0 0 0 1

(24)

V´yslednou transformaˇcn´ı matici pro danou ´useˇcku dostaneme vyn´asoben´ım jednos- tliv´ych transformaˇcn´ıch matic:

AT = AM.ARz.ARy (25)

N´asleduj´ıc´ı obr´azek [8] ilustruje transformaci ´useˇcky do poˇc´atku soustavy souˇradn´e.

Obr´azek 8: Transformace ´useˇcky do poˇc´atku soustavy souˇradn´e

(31)

Pokud by byl objekt typu MBALL7 d´ale transformov´an a poˇc´ıtalo by se s t´ım, ˇze jed- notliv´e objekty typu MBALL budou moci spolu interreagovat, tak by se transformaˇcn´ı mat- ice ˇr´ıd´ıc´ıho elementu musela vyn´asobit dalˇs´ımi transformaˇcn´ı maticemi. V´ysledn´a trans- formaˇcn´ı matice pro danou ´useˇcku by se spoˇc´ıtala pomoc´ı:

AT c= AT.AOT.A−1BOT (26)

kde AOT je transformaˇcn´ı matice dan´eho objektu a A−1BOT je inverzn´ı transformaˇcn´ı matice z´akladn´ıho (base) objektu typu MBALL. Vyn´asoben´ı pomoc´ı t´eto matice je reali- zov´ano z toho d˚uvodu, ˇze v z´akladn´ım (base) objektu se ukl´ad´a v´ysledn´a polygonizovan´a plocha.

V´ypoˇcet transformaˇcn´ı matice (26) se provede pˇred vlastn´ım procesem polygonizace.

Kdyˇz se n´aslednˇe vektor polohy kaˇzd´eho vyˇsetˇrovan´eho bodu P = [p0, p1, p2] vyn´asob´ı matic´ı A−1T c

P0 = P.A−1T c, (27)

tak se koneˇcnˇe m˚uˇzeme dostat k vlastn´ımu v´ypoˇctu vzd´alenosti.

Jsou-li x-ov´e souˇradnice bodu P0 = [p00, p01, p02] v intervalu < −2l;2l > tak vzd´alenost spoˇc´ıt´ame pomoc´ı

d = q

p021 + p022 (28)

Nach´az´ı-li se x-ov´a souˇradnice p00 v intervalu (2l; ∞), tak od x-ov´e souˇradnice odeˇcteme polovinu d´elky ´useˇcky. Naopak, nach´az´ı-li se x-ov´a souˇradnice v intervalu (−∞; −2l), tak k x-ov´e souˇradnice pˇriˇcteme polovinu d´elky ´useˇcky. Vzd´alenost se pak spoˇcte podle vztahu:

d = q

p020 + p021 + p022 (29)

V´ysledn´y zdrojov´y k´od pro v´ypoˇcet hodnoty implicitn´ı funkce je velmi kr´atk´y a efek- tivn´ı:

7typ objektu, kter´y obsahuje dynamick´y seznam ˇr´ıd´ıc´ıch primitiv implicitn´ı plochy

(32)

/∗ s i m p l i f i c a t e d d e n s f u n c ( ) i n m b a l l . c

∗ v e c . . . . c o o r d i n a t e s o f p o i n t X

∗ b a l l . . . segment p r i m i t i v e ∗/

f l o a t d e n s f u n c ( MetaElem ∗ b a l l , f l o a t ∗ v e c ) {

f l o a t d i s t 2 ;

Mat4MulVecfl ( b a l l −>imat , v e c ) ; i f ( v e c [ 0 ] > ml−>expx ) {

v e c [0] −= ml−>expx ;

d i s t 2 = ( v e c [ 0 ] ∗ v e c [ 0 ] + v e c [ 1 ] ∗ v e c [ 1 ] + v e c [ 2 ] ∗ v e c [ 2 ] ) ; }

e l s e i f ( v e c [0] < − ml−>expx ) { v e c [ 0 ] + = mll−>expx ;

d i s t 2 = ( v e c [ 0 ] ∗ v e c [ 0 ] + v e c [ 1 ] ∗ v e c [ 1 ] + v e c [ 2 ] ∗ v e c [ 2 ] ) ; }

e l s e d i s t 2 = ( v e c [ 1 ] ∗ v e c [ 1 ] + v e c [ 2 ] ∗ v e c [ 2 ] ) ; /∗ d i s t 2 . . . o n l y p o w e rs o f d i s t a n c e s q u a r e d

∗ a r e u s e d i n b l e n d i n g f u n c t i o n ∗/

/∗ c a l c u l a t i o n o f b l e n d i n g f u n c t i o n ∗/

d i s t 2 = 1 . 0 f −( d i s t 2 / b a l l −>r a d 2 ) ; i f ( d i s t 2 < 0 . 0 ) return 0 . 5 f ;

return 0 . 5 f −b a l l −>s ∗ d i s t 2 ∗ d i s t 2 ∗ d i s t 2 ; }

N´asleduj´ıc´ı zjednoduˇsen´a ilustrace [9] ukazuje, jak by mohla vypadat implicitn´ı plocha, jej´ımˇz ˇr´ıd´ıc´ım elementem je osamocen´a ´useˇcka:

Dalˇs´ı v´yhoda plynouc´ı z pouˇzit´ı t´eto metody je moˇznost vyuˇz´ıt instrukc´ı nov´ych proce- sor˚u (MMX, SSE, 3DNow), kter´e dok´aˇz´ı maticov´e operace velice urychlit. V naˇsem pˇr´ıpadˇe se jedn´a pˇredevˇs´ım o funkci Mat4MulVecfl, kter´a prov´ad´ı zmiˇnovanou maticovou transfor- maci.

(33)

Obr´azek 9: 2D implicitn´ı plocha, jej´ımˇz ˇr´ıd´ıc´ım primitivem je ´useˇcka

4.4.3 Vzd´alenost od obecn´eho troj´uheln´ıka

Jednotliv´e vrcholy troj´uheln´ıka si oznaˇc´ıme A = [a0, a1, a2], B = [b0, b1, b2], C = [c0, c1, c2]. V´ypoˇcet vzd´alenosti od obecn´eho troj´uheln´ıka bude demonstrov´an opˇet na dvou pˇr´ıkladech. Jednak pomoc´ı klasick´ych vztah˚u analytick´e geometrie a pak pro pˇr´ıpad, kdy si troj´uheln´ık i vyˇsetˇrovan´y bod P transformujeme pomoc´ı transformaˇcn´ı matice (17) do poˇc´atku soustavy souˇradn´e.

Obr´azek 10: Transformace obecn´eho troj´uheln´ıka do poˇc´atku soustavy souˇradn´e

Obecnˇe se vˇsak mus´ı nejprve vypoˇc´ıtat projekce bodu P = [p0, p1, p2] do roviny ρ, ve kter´e leˇz´ı dan´y troj´uheln´ık. Pokud zjist´ıme, ˇze spoˇcten´y bod leˇz´ı uvnitˇr troj´uheln´ıka, tak spoˇc´ıt´ame vzd´alenost tˇechto dvou bod˚u. Pokud ne, tak mus´ıme spoˇc´ıtat vzd´alenosti bodu P ke vˇsem hran´am troj´uheln´ıka a stanovit, kter´a je nejmenˇs´ı.

(34)

Rovinu ρ si vyj´adˇr´ıme pomoc´ı rovnice

ax + by + cz + d = 0 (30)

kde ~n = (a, b, c) je norm´alov´y vektor roviny ρ.

Troj´uheln´ık transformovan´y do poˇc´atku soustavy souˇradn´e n´am situace opˇet zjednoduˇs´ı. Odpadne napˇr´ıklad dosti komplikovan´y vztah pro v´ypoˇcet projekce Q = [q0, q1, q2] bodu P do roviny ve kter´e troj´uheln´ık leˇz´ı:

Q = P − a.p0+ b.p1+ c.p2+ d

|~n|2 .~n, (31)

protoˇze souˇradnice bodu projekce jsou Q = [p0, p1, 0]. Test polohy bodu projekce v˚uˇci troj´uheln´ıku prov´ad´ıme pomoc´ı n´asleduj´ıc´ıho vektorov´eho n´asoben´ı:

N~0 = AB × ~~ BQ N~1 = BC × ~~ CQ N~2 = CA × ~~ AQ

(32)

Pokud maj´ı vˇsechny vektory ~N0, ~N0i ~N0stejn´y smˇer, tak bod Q leˇz´ı uvnitˇr troj´uheln´ıku.

Pokud troj´uheln´ık a bod P pˇred v´ypoˇctem transformuje, tak se n´am v´ypoˇcet (32) znovu znaˇcnˇe zjednoduˇs´ı, protoˇze z-ov´a sloˇzka vˇsech vektor˚u bude nulov´a.

Pakliˇze bod Q leˇz´ı uvnitˇr troj´uheln´ıku, tak vzd´alenost bod˚u P a Q spoˇc´ıt´ame pomoc´ı:

|P Q| =p

(p0− q0)2+ (p1− q1)2 + (p2− q2)2 (33) a ted’ povaˇzte, jak se v´ypoˇcet vd´alenosti zjednoduˇs´ı, pokud jsme si troj´uheln´ık a bod P pˇredem transformovali. Vzd´alenost je rovna pouze z-ov´e sloˇzce transformovan´eho bodu P0.

Kdyˇz bod Q leˇz´ı mimo troj´uheln´ık, tak je nutn´e spoˇc´ıtat vzd´alenosti ke vˇsem jeho hran´am. Postup k v´ypoˇctu vd´alenosti ke hranˇe/´useˇcce je v podstatˇe stejn´y tak, jak byl pops´an v ˇc´asti vˇenovan´e v´ypoˇctu vzd´alenosti od ´useˇcky. Pouze pokud je troj´uheln´ık nejprve transformov´an pomoc´ı transformaˇcn´ı matice, tak se n´am situace trochu zjednoduˇs´ı, protoˇze

(35)

uˇz nen´ı potˇreba prov´adˇet transformaci pomoc´ı matice 4x4 ale pomoc´ı matice 3x3, jelikoˇz hrany troj´uheln´ıku leˇz´ı v rovinˇe x-y. Takov´eto matice je ale nutn´e spoˇc´ıtat pro kaˇzd´y troj´uheln´ık zvl´aˇst’.

Obr´azek 11: 2D Ilustrace, demonstruj´ıc´ı tvar implicitn´ı plochy, jej´ımˇz ˇr´ıd´ıc´ım primitivem je osamocen´y troj´uheln´ık

4.4.4 V´ypoˇcet transformaˇcn´ı matice troj´uheln´ıka

Pro v´ypoˇcet transformaˇcn´ı matice si budeme muset nejprve spoˇc´ıtat stˇred troj´uheln´ıku S = [s0, s1, s2]:

s0 = (a0+ b0+ c0)/3 s1 = (a1+ b1+ c1)/3 s2 = (a2+ b2+ c2)/3

(34)

z nˇeho m˚uˇzeme urˇcit transformaˇcn´ı matici posunut´ı:

AM =

1 0 0 0

0 1 0 0

0 0 1 0

s0 s1 s2 1

(35)

(36)

D´ale je potˇreba spoˇc´ıtat norm´alov´y vektor ~N = [n0, n1, n2] troj´uheln´ıka:

n0 = (b1 − a1).(c2− a2) − (c1− a1).(b2− a2) n1 = −(b0− a0).(c2− a2) + (c0− a0).(b2− a2) n2 = (b0 − a0).(c1− a1) − (c0− a0).(b1− a1)

(36)

kter´y pouˇzijeme pro v´ypoˇcet ´uhl˚u natoˇcen´ı troj´uheln´ıka kolem osy x:

φ = arctann2

n1 (37)

a kolem osy y:

θ = − arctancos φ.n2

n1 (38)

transformaˇcn´ı matice vyjadˇruj´ıc´ı natoˇcen´ı kolem osy x m´a tvar:

ARx =

1 0 0 0

0 cos φ sin φ 0 0 − sin φ cos φ 0

0 0 0 1

(39)

a natoˇcen´ı kolem osy y:

ARy =

cos θ 0 − sin θ 0

0 1 0 0

sin θ 0 cos θ 0

0 0 0 1

(40)

v´yslednou transformaˇcn´ı matici pro dan´e primitivum pak spoˇc´ıt´ame podle vztahu:

AT = AM.ARy.ARx (41)

Pokud by bylo moˇzn´e aby takov´e primitivum mohlo interreagovat s ostatn´ımi elementy, tak by bylo nutn´e tuto transformaˇcn´ı matici upravit podle vztahu (26).

(37)

D´ale je v´yhodn´e pˇredpoˇc´ıtat vˇsechny vektory hran (32) dan´eho troj´uheln´ıka a uloˇzit je do pˇr´ısluˇsn´ych datov´ych struktur.

Transformaˇcn´ı matice pro jednotliv´e hrany budou m´ıt rozmˇery 3x3, jelikoˇz troj´uheln´ık leˇz´ı v rovinˇe a bude potˇreba transformovat pouze x-ov´e y-ov´e souˇradnice bodu P0. Stˇred SAB0 = [s00, s01] hrany A0B0 je:

s00 = (a0− b0)/2 s01 = (a1− b1)/2

(42) translaˇcn´ı transformaˇcn´ı matice m´a tvar

AM h =

1 0 0

0 1 0

s00 s01 1

(43)

Uhel natoˇ´ cen´ı hrany kolem osy z:

φ = arctanb0− a0

b1− a1 (44)

transformaˇcn´ı matice pro natoˇcen´ı hrany:

ARh =

cos φ sin φ 0

− sin φ cos φ 0

0 0 1

(45)

V´yslednou transformaˇcn´ı matici dostaneme vyn´asoben´ım matice AM h a ARh:

AT h = AM h.ARh (46)

Analogicky jsou vytvoˇreny transformaˇcn´ı matice pro ostatn´ı dvˇe hrany.

Transformace troj´uheln´ıka do poˇc´atku soustavy souˇradn´e pˇrin´aˇs´ı lepˇs´ı optimalizaci neˇz v pˇr´ıpadˇe transformace ´useˇcky. Znovu m˚uˇzeme tˇeˇzit z toho, ˇze nov´e procesory obsahuj´ı instrukce jako jsou MMX, SSE nebo 3DNow.

(38)

4.5 Zobrazov´ an´ı implicitn´ıch ploch

Implicitn´ı plochy je mnoˇzina bod˚u, kter´e vyhovuj´ı vztahu (3). Naˇs´ım probl´emem je tyto body co nejrychleji naj´ıt a zobrazit. Pokud uˇzivatel prov´ad´ı interaktivn´ı n´avrh tvaru implic- itn´ı plochy, tak nav´ıc nast´av´a probl´em tyto plochy zobrazovat v re´aln´em ˇcase s rozumnou ˇ

casovou odezvou. Naˇse poˇzadavky m˚uˇzeme ˇreˇsit zobrazov´an´ım pomoc´ı sledov´an´ı paprsk˚u, pˇrevodem na ploˇskovou reprezentaci, pˇrevodem na parametrick´e plochy ˇci subsurf (hyper- Nurbs) plochy.

4.5.1 Sledov´an´ı paprsk˚u

Jednou z moˇznost´ı je zobrazovat implicitn´ı plochy metodou sledov´an´ı paprsku. Metoda sledov´an´ı paprsk˚u d´av´a bezchybn´e v´ysledky, ale jej´ı nev´yhoda spoˇc´ıv´a ve velk´e ˇcasov´e n´aroˇcnosti v´ypoˇctu. I zobrazov´an´ı tˇeles s ploˇskovou reprezentac´ı je za souˇcasn´ych podm´ınek v re´aln´em ˇcase prakticky nerealizovateln´e. Pokud se tato metoda pouˇzije, tak je nutn´e algo- ritmus sledov´an´ı paprsk˚u optimalizovat. Takov´a optimalizace by zahrnovala ”zapouzdˇren´ı”

jednotliv´ych ˇr´ıd´ıc´ıch element˚u do ohraniˇcuj´ıc´ıch kv´adr˚u (bounding box). Nejprve by se testoval pr˚useˇc´ık paprsku s t´ımto ohraniˇcuj´ıc´ım kv´adrem a aˇz n´aslednˇe by se hledal vlastn´ı povrch implicitn´ı plochy pomoc´ı nˇekter´ych numerick´ych metod. Nejˇcastˇeji se pro tento ´uˇcel pouˇz´ıv´a Newtonova numerick´a metoda. Samozˇrejmˇe se algoritmus optimalizuje i pomoc´ı oktanov´eho stromu apod. Pouˇzit´ı metody sledov´an´ı paprsk˚u je nutno zv´aˇzit v tom pˇr´ıpadˇe, ze se snaˇz´ıme o fotorealistick´e zobrazen´ı virtu´aln´ı sc´eny pˇri renderingu8.

4.5.2 Pˇrevod na ploˇskovou reprezentaci

Implicitn´ı plochy se pˇrev´ad´ı na ploˇskovou reprezentaci jednak proto, ˇze je to pomˇernˇe rychl´e a jednoduch´e ale pˇredevˇs´ım z toho d˚uvodu, ˇze modern´ı grafick´e akceler´atory umoˇzˇnuj´ı hardwarovou akceleraci zobrazov´an´ı tˇeles s ploˇskovou reprezentac´ı. Pˇrevod na ploˇskovou reprezentaci m˚uˇzeme uskuteˇcnit pomoc´ı algoritmu pochoduj´ıc´ıch krychl´ı (Marching Cubes) nebo pomoc´ı algoritmu pochoduj´ıc´ıch ˇctyˇrstˇen˚u (Marching Tetrahedra).

8fotorealistick´e zobrazen´ı sc´eny

(39)

Moˇzn´a existuj´ı i dalˇs´ı zp˚usoby pˇrevodu na ploˇskovou reprezentaci, ale osobnˇe jsem se s nimi nesetkal. Vˇetˇsina souˇcasn´ych 3D program˚u pouˇz´ıv´a algoritmus pochoduj´ıc´ıch krychl´ı, je- likoˇz je rychlejˇs´ı a d´av´a lepˇs´ı v´ysledky neˇz algoritmus pochoduj´ıch ˇctyˇrstˇen˚u. M´a ovˇsem jednu nev´yhodu a tou je skuteˇcnost, ˇze je v USA patentov´an.

4.5.3 Dalˇs´ı moˇznosti zobrazov´an´ı implicitn´ıch ploch

Pˇrevod implicitn´ıch ploch na parametrick´e plochy se pˇr´ıliˇs nerozˇs´ıˇril, stejnˇe tak pˇrevod na subsurf plochy, jelikoˇz pˇr´ısluˇsn´e algoritmy jsou velmi komplikovan´e a ned´avaj´ı uspoko- jiv´e v´ysledky.

Dalˇs´ı moˇznost´ı zobrazov´an´ı implicitn´ıch ploch je pouˇz´ıt tzv. zobecnˇen´y v´alec (gener- alized cylinder). ˇR´ıd´ıc´ım primitivem v takov´em pˇr´ıpadˇe b´yv´a nˇejak´a parametrick´a kˇrivka.

K vyhled´av´an´ı bod˚u implicitn´ı plochy doch´az´ı v rovin´ach kolm´ych na ˇr´ıd´ıc´ı kˇrivku. Pˇrestoˇze budeme kˇrivku ”vzorkovat” dostateˇcnˇe jemnˇe tak nezabr´an´ıme vzniku nehladk´ych ˇc´ast´ı, kter´e vznikaj´ı v m´ıstech ostr´eho ohybu kˇrivky.

4.6 Algoritmus pochoduj´ıc´ıch krychl´ı

Existuj´ı dva typy algoritm˚u pochoduj´ıc´ıch krychl´ı. Prvn´ı, kter´y n´as nebude pˇr´ıliˇs zaj´ımat, se pouˇz´ıv´a pro diskr´etn´ı (namˇeˇren´a) data. Tento typ algoritmu je vyuˇziteln´y pro r˚uzn´e druhy vizualizace. N´as bude zaj´ımat algoritmus pro zobrazov´an´ı spojit´ych skal´arn´ıch hodnot, kter´e jsou definovan´e implicitn´ı funkc´ı (3).

Pˇred popisem vlastn´ıho algoritmu pochoduj´ıch krychl´ı, je dobr´e zm´ınit, ˇze dan´y algo- ritmus m´ırnˇe modifikuje smˇeˇsovac´ı funkci. Od vztahu (4) je odeˇctena hodnota 0, 5 tak aby line´arn´ı ˇc´ast proch´azela nulou.

Algoritmus zaˇc´ın´a t´ım, ˇze si cel´y prostor ”rozdˇel´ıme” pomoc´ı prostorov´e mˇr´ıˇzky na krychliˇcky o stranˇe a.9 Pro kaˇzd´y ˇr´ıd´ıc´ı element nalezneme nˇekolik bod˚u v jeho bl´ızkosti, kter´e leˇz´ı na povrchu implicitn´ı plochy. Pro kaˇzd´y ˇr´ıd´ıc´ı element hled´ame 6 aˇz 14 takov´ychto bod˚u. Jejich poˇcet z´avis´ı na typu ˇr´ıd´ıc´ıho elementu (bod, ´useˇcka, atd.) a jeho vlastnostech

9Orientace mˇr´ıˇzky je d´ana orientac´ı z´akladn´ıho objektu, kde se ukl´ad´a polygonizovan´a plocha

References

Related documents

Zkoumanému podniku navrhujete změnu organizačního schématu společnosti na agilnější variantu v podobě společnosti orientované na projekty?. Myslíte, že tato změna bude

Hodnocen´ı navrhovan´ e vedouc´ım diplomov´ e pr´ ace: výborně Hodnocen´ı navrhovan´ e oponentem diplomov´ e pr´ ace: výborně.. Pr˚ ubˇ eh obhajoby diplomov´ e

Bezprostˇrednˇ e po v´ ybˇ eru z´ akladov´ eho frameworku bylo nutn´ e vytvoˇrit koncept cel´ e architektury nov´ ych frameworkov´ ych souˇ c´ ast´ı, kter´ e umoˇ zn´ı

Není u tohoto dílu větší odpor vzduchu oproti hladkému

Hodnocen´ı navrhovan´ e vedouc´ım diplomov´ e pr´ ace: velmi dobře Hodnocen´ı navrhovan´ e oponentem diplomov´ e pr´ ace: výborně minus.. Pr˚ ubˇ eh obhajoby diplomov´

Hodnocen´ı navrhovan´ e vedouc´ım diplomov´ e pr´ ace: výborně Hodnocen´ı navrhovan´ e oponentem diplomov´ e pr´ ace: výborně.. Pr˚ ubˇ eh obhajoby diplomov´ e

Martin Bílek, Ph.D.: Jaké maximální otáčky byly použity pro pohon vřetene?. -Z- Jaké napětí jste používal

Předseda komise (doc. Tomáš Kasper, Ph.D.) pověřil vedením komise členku komise (PhDr. Magda Nišponská, Ph.D.). Klasifikace: