• Nebyly nalezeny žádné výsledky

Bakal´aˇrsk´a pr´ace Detekce obrys˚u 3D objekt˚u pro VRUT

N/A
N/A
Protected

Academic year: 2022

Podíl "Bakal´aˇrsk´a pr´ace Detekce obrys˚u 3D objekt˚u pro VRUT"

Copied!
51
0
0

Načítání.... (zobrazit plný text nyní)

Fulltext

(1)

Z´ apadoˇcesk´ a univerzita v Plzni Fakulta aplikovan´ ych vˇed

Katedra informatiky a v´ ypoˇcetn´ı techniky

Bakal´ aˇ rsk´ a pr´ ace

Detekce obrys˚ u 3D objekt˚ u

pro VRUT

(2)

Prohl´ aˇ sen´ı

Prohlaˇsuji, ˇze jsem bakal´aˇrskou pr´aci vypracoval samostatnˇe a v´yhradnˇe s po- uˇzit´ım citovan´ych pramen˚u.

V Plzni dne 11. srpna 2011

Luk´aˇs Kurz

(3)

Abstract

The goal of the work is to create a module for detection of the 3D objects contours in the VRUT application. Used vectors approach for contours de- tection is based on limiting the group of the model edges only to those which meet the conditions of contour edges. The module was implemented in the C++ language and tested on the three models. The module found the right edges and these edges meet the requirement of the contour edges. The only problem is that the visibility of the contour edges is not properly solved. This could be, however, solved by the full implementation of the Appel’s algorithm which is also described in this work.

(4)

Obsah

1 Uvod´ 1

2 VRUT 2

2.1 Z´akladn´ı charakteristiky . . . 2

2.2 J´adro . . . 2

2.3 Spr´ava a distribuce ud´alost´ı . . . 2

2.4 Graf sc´eny . . . 3

2.5 Hierarchie ob´alek . . . 4

2.6 Moduly . . . 5

2.7 Geometrie . . . 6

2.8 V´yvoj . . . 8

3 Detekce obrys˚u 9 3.1 Rastrov´a detekce obrys˚u . . . 9

3.2 Vektorov´a detekce obrys˚u . . . 10

3.3 Viditelnost obrysov´ych hran . . . 10

3.3.1 Roberts˚uv algoritmus . . . 11

3.3.2 Appel˚uv algoritmus . . . 11

3.3.3 Weiler-Atherton˚uv algoritmus . . . 12

4 PostScript 14 4.1 Z´akladn´ı charakteristiky . . . 14

4.2 Syntaxe . . . 15

4.3 Z´akladn´ı pˇrehled oper´ator˚u . . . 16

4.4 Definice promˇenn´ych a nov´ych pˇr´ıkaz˚u . . . 17

4.5 Souˇradn´y syst´em . . . 17

5 N´avrh 19 5.1 Nalezen´ı vˇsech hran . . . 19

5.2 Nalezen´ı skuteˇcn´ych hran . . . 20

5.3 Nalezen´ı obrysov´ych hran . . . 20

(5)

5.4 Sestaven´ı lomen´ych ˇcar . . . 21

5.5 Viditelnost obrysov´ych hran . . . 22

5.6 Export obrys˚u . . . 25

5.7 Vznik faleˇsn´ych hran . . . 25

6 Proveden´ı 27 6.1 Uˇzivatelsk´e rozhran´ı modulu . . . 27

6.2 Popis pouˇzit´ych tˇr´ıd . . . 28

6.2.1 Tˇr´ıda DrawingScene . . . 28

6.2.2 Tˇr´ıda DrawingEdges . . . 30

6.2.3 Tˇr´ıda DrawingGeometry . . . 31

6.2.4 Tˇr´ıda PostScriptTools . . . 32

6.2.5 Tˇr´ıda VertexHashMap . . . 33

6.3 Popis exportovan´eho souboru . . . 33

7 Experimenty 35 7.1 Rychlost zobrazen´ı n´ahledu . . . 35

7.2 Kvalita v´ystupu . . . 35

8 Z´avˇer 42

(6)

1 Uvod ´

C´ılem t´eto pr´ace je do jiˇz exituj´ıc´ı aplikace VRUT (viz [V´aclav Kyba(2010)]) vytvoˇren´e ve spolupr´aci ˇSKODA AUTO a.s. a ˇCVUT vytvoˇrit modul, kter´y um´ı u nahran´eho modelu detekovat obrysy, tyto obrysy zobrazovat (pokud moˇzno v re´aln´em ˇcase), a umoˇznit export nalezen´ych hran do PostScript (v´ysledkem bude 2D vektorov´y obr´azek).

Nejprve ˇcten´aˇre sezn´am´ım s aplikac´ı VRUT, aby z´ıskal pˇredstavu o jej´ı struktuˇre, moˇznosti rozˇs´ıˇren´ı jej´ıch vlastnost´ı pomoc´ı nov´ych modul˚u a zp˚u- sobu komunikace modul˚u pomoc´ı zpr´av, a pˇribl´ıˇz´ım moˇznosti programova- c´ıho jazyka PostScript (viz [Ado(1999)] a [Ado(1985)]), kter´y je pouˇzit pro v´ysledn´y export nalezen´ych hran.

D´ale jsou zde pops´any nˇekter´e moˇznosti detekce obrys˚u, zp˚usob imple- mentace nov´eho modulu pro aplikaci VRUT a popis jeho d˚uleˇzit´ych ˇc´ast´ı, a popis v´ysledn´eho souboru v jazyce PostScript.

(7)

2 VRUT

2.1 Z´ akladn´ı charakteristiky

VRUT (Virtual Reality Universal Toolkit) je aplikace pro vizualizaci a editaci 3D dat, vytv´aˇren´a ve spolupr´aci ˇSKODA AUTO a.s. a ˇCVUT. Je urˇcen k zobrazen´ı grafick´ych dat s podporou modul˚u, umoˇzˇnuj´ıc´ıch rozˇs´ıˇrit funkci hlavn´ı aplikace.

Aplikace se d´a rozdˇelit na dvˇe ˇc´asti – hlavn´ı aplikace neboli j´adro, kter´e je samo o sobˇe z uˇzivatelsk´eho hlediska nepouˇziteln´e, a z´akladn´ı bal´ıˇcek modul˚u, kter´e se staraj´ı napˇr´ıklad o zobrazen´ı sc´eny ˇci jej´ı import a export.

2.2 J´ adro

J´adro slouˇz´ı pro spr´avu modul˚u, spr´avu grafick´ych dat, poskytuje pomocn´e prvky pro spr´avn´y bˇeh aplikace a tak´e zajiˇst’uje spr´avu ud´alosti slouˇz´ıc´ı jako komunikaˇcn´ı kan´al mezi jednotliv´ymi ˇc´astmi aplikace a moduly.

Spr´avce modulu spuˇstˇen´ı modulu a jeho propojen´ı s j´adrem. Moduly jsou aktivov´any jen na ˇz´adost v pˇr´ıpadˇe potˇreby. Spr´avce modul˚u obsahuje d´ılˇc´ı ˇ

c´asti, z nichˇz kaˇzd´a je urˇcena pro obsluhu podskupiny modul˚u stejn´eho nebo kompatibiln´ıho typu. Nˇekter´e moduly, u nichˇz je vˇetˇs´ı prov´azanost s j´adrem, vyˇzaduj´ı zvl´aˇstn´ı zach´azen´ı, proto typy spr´avc˚u do znaˇcn´e m´ıry odpov´ıdaj´ı typ˚um podporovan´ych modul˚u.

2.3 Spr´ ava a distribuce ud´ alost´ı

Aplikace je rozdˇelena na objekty, pˇredevˇs´ım jednotliv´e moduly, kter´e jsou na sobˇe zpravidla nez´avisl´e. Tyto ˇc´asti vˇsak spolu potˇrebuj´ı komunikovat.

Zvolen´y zp˚usob komunikace je postaven nezas´ıl´an´ı ud´alost´ı. V´yhodou tohoto zp˚usobu je, ˇze nen´ı potˇreba zn´at rozhran´ı jednotliv´ych objekt˚u, ale staˇc´ı, aby kaˇzd´y objekt umˇel pˇrijmout a zpracovat ud´alost. Nev´yhodou vˇsak je ob- t´ıˇzn´a synchronizace, protoˇze zas´ıl´an´ı ud´alost´ı je pouze jednosmˇern´a operace.

(8)

VRUT Graf sc´eny

Synchronizace se ˇreˇs´ı tak, ˇze zaslan´a ud´alost vyvol´a odezvu v podobˇe jin´e ud´alosti, na kterou objekty poˇckaj´ı v blokuj´ıc´ım m´odu.

Ud´alosti jsou zas´ıl´any centr´aln´ımu spr´avci ud´alost´ı, kter´y se nach´az´ı v j´a- dru, a ten je pot´e distribuuje pˇr´ısluˇsn´ym objekt˚um. Kaˇzd´y z objekt˚u m˚uˇze pˇrij´ımat libovoln´y typ ud´alost´ı, staˇc´ı pouze, aby se u spr´avce ud´alost´ı zare- gistroval k odbˇeru dan´eho typu ud´alost´ı. Kaˇzd´y novˇe vytvoˇren´y modul tam m˚uˇze ihned reagovat na st´avaj´ıc´ı ud´alosti.

2.4 Graf sc´ eny

Graf sc´eny je hlavn´ı ´uloˇziˇstˇe grafick´ych dat. Protoˇze se jedn´a o ˇc´ast, ke kter´e je potˇreba pˇristupovat ˇcasto a z r˚uzn´ych m´ıst, je um´ıstˇen pˇr´ımo v j´adˇre a nen´ı ho moˇzn´e nahradit extern´ım modulem. Jeho datov´e struktury jsou jednoznaˇcnˇe urˇcen´e a jsou spoleˇcn´e pro vˇsechny moduly, kter´e s n´ım pracuj´ı.

Z´akladn´ım prvkem grafu sc´eny je uzel. M˚uˇze obsahovat pˇr´ımo grafick´a data a m˚uˇze m´ıt libovoln´y poˇcet potomk˚u. Kaˇzd´y uzel m´a t´eˇz definovanou transformaˇcn´ı matici, kter´a definuje um´ıstˇen´ı tohoto uzle a jeho potomk˚u jako logick´eho celku v lok´aln´ım mˇeˇr´ıtku. V glob´aln´ım mˇeˇr´ıtku lze z´ıskat vyn´asoben´ım transformaˇcn´ıch matic od koˇrene stromu po dan´y uzel. Tato transformaˇcn´ı matice pro glob´aln´ı mˇeˇr´ıtko je vˇsak automaticky pro kaˇzd´y uzel pˇrepoˇc´ıt´av´ana, protoˇze se jedn´a o ´udaj, se kter´ym se ˇcasto pracuje.

Kaˇzd´a operace nad grafem sc´eny vyvol´a ud´alost, kter´a je zasl´ana spr´avci ud´alost´ı. Modul ˇci jin´y zaregistrovan´y pˇr´ıjemce m˚uˇze m´ıt tedy pˇrehled o tom, co se ve vybran´e sc´enˇe odehr´av´a. Je umoˇznˇena i opaˇcn´a komunikace, tedy pokud se spr´avci ud´alost´ı odeˇsle nˇejak´a ud´alost pro operaci nad sc´enou, je tato ud´alost pˇred´ana a provedena skrze rozhran´ı sc´eny.

Uzle grafu sc´eny se podle funkˇcnosti dˇel´ı na nˇekolik typ˚u. Mezi uzly nen´ı ˇ

z´adn´a z´avislost na typu, je moˇzn´e kombinovat libovoln´e typy na pozici rodiˇce ˇ

ci potomka. Typu uzl˚u jsou:

Z´akladn´ı uzel – SceneNode, ASSEMBLY

Pˇredstavuje logick´y prvek ve sc´enˇe. Je v´ychoz´ım typem, ze kter´eho vych´az´ı vˇsechny ostatn´ı uzly.

Koˇrenov´y uzel – SceneNode, ROOT

(9)

VRUT Hierarchie ob´alek

Jin´e oznaˇcen´ı pro z´akladn´ı uzel, kter´y je koˇrenov´ym uzlem sc´eny.

Kamera – CameraNode, CAMERA

Uzel reprezentuj´ıc´ı kameru. Pˇrid´av´a automaticky aktualizovanou pro- jekˇcn´ı matici a informace o pohledov´em jehlanu vˇcetnˇe ob´alky v podobˇe koule.

Uzel s geometri´ı – GeometryNode, GEOMETRY

Pˇrid´av´a informace o geometrii a materi´alu. Geometrie je pops´ana pri- mitivy, ze kter´ych se skl´ad´a v´ysledn´y objekt, a jejich vlastnost´ı. Kaˇzd´a geometrie zahrnuje kromˇe grafick´ych dat i ob´alku v podobˇe AABB v lo- k´aln´ım mˇeˇr´ıtku.

Uzel se svˇetlem – LightNode, LIGHT Pˇredstavuje zdroj svˇetla.

Uroveˇ´ n detail˚u – LODNode, LOD

Speci´aln´ı logick´y celek, kter´y umoˇzˇnuje uchovat r˚uznou kvalitu a sloˇzi- tost geometrie, spolu s informac´ı pˇri jak´e vzd´alenosti kamery od ob´alky uzlu se dan´a geometrie pˇrepne. Vˇzdy by mˇel b´yt zobrazen pouze jeden potomek.

Pˇrep´ınaˇc – SwitchNode, SWITCH

Funguje jako pˇrep´ınaˇc mezi jednotliv´ymi potomky. M˚uˇzou b´yt t´eˇz ak- tivov´any vˇsechny nebo ˇz´adn´y.

Pozad´ı – BackgroundNode, BACKGROUND

Definuje pozad´ı pˇri zobrazen´ı. M˚uˇze se jednat o kulovou plochu pozad´ı nebo o jeden obr´azek zobrazen´y jako pozad´ı.

Zdroj zvuku – SoundNode, SOUND SOURCE Uzel pˇredstavuj´ıc´ı zdroj svˇetla.

2.5 Hierarchie ob´ alek

Hierarchie ob´alek je implementov´ana pˇr´ımo v j´adˇre. Slouˇz´ı pˇredevˇs´ım k ze- fektivnˇen´ı operac´ı nad sc´enou, jako jsou oˇrez´av´an´ı pohledov´ym jehlanem, detekce koliz´ı, ˇci testy pˇri vrh´an´ı paprsk˚u.

Hierarchie ob´alek je strom, kter´y representuje rozdˇelen´ı sc´eny na menˇs´ı celky. Uzly stromu jsou pouze logick´ym celkem ve sc´enˇe, list pˇredstavuje

(10)

VRUT Moduly

Obr´azek 2.1: Ob´alky zobrazen´e ve sc´enˇe

jeden uzel grafu sc´eny s geometrick´ymi daty. Kaˇzd´y uzel representuje ˇc´ast sc´eny, kter´a je vymezena urˇcit´ym tˇelesem – ob´alkou. Tvar ob´alek je kv´adr, zarovnan´y s osami, tzv. AABB (Axis Aligned Bounding Box). Kaˇzd´a ob´alka potomka je plnˇe obsaˇzena v ob´alce rodiˇce, takˇze koˇrenov´y uzel pˇredstavuje AABB cel´e sc´eny.

Ke kaˇzd´e sc´enˇe je pˇriˇrazena pouze jedna hierarchie ob´alek a z´avis´ı v´y- hradnˇe na prostorov´e hierarchii geometrie ve sc´enˇe, nikoliv na transformaˇcn´ı hierarchii sc´eny. Na obr´azku 2.1 jsou vidˇet zobrazen´e ob´alky modelu auta pˇr´ımo ve sc´enˇe.

2.6 Moduly

Moduly umoˇzˇnuj´ı aplikaci rozˇsiˇrovat o nov´e funkce. Moduly jsou aktivov´any a spravov´any pˇr´ısluˇsn´ym spr´avcem modul˚u. Pro jednotliv´e moduly lze ak-

(11)

VRUT Geometrie

tivovat libovoln´e mnoˇzstv´ı instanc´ı a kaˇzd´e je pˇriˇrazeno vlastn´ı vl´akno, ve kter´em prob´ıh´a ˇcinnost modulu.

Jak jiˇz bylo pops´ano, komunikaci mezi jednotliv´ymi moduly se zajiˇst’uje pomoc´ı ud´alost´ı, a vˇsechny moduly bez rozd´ılu mohou pouˇz´ıvat syst´em ud´a- lost´ı jako pˇr´ıjemci i odes´ılatel´e. Komunikace mezi moduly tak vˇzdy prob´ıh´a skrze j´adro.

Moduly jsou podle ˇcinnosti, kterou vykon´avaj´ı, rozdˇeleny do skupin. Typy se mohou liˇsit v ´urovni povolen´eho pˇr´ıstupu k j´adru a pˇredevˇs´ım v m´ıˇre a zp˚usobu integrace do chodu hlav´ı aplikace. Typy modul˚u jsou:

Obecn´y – Module

Modul nez´avisl´ı na j´adˇre. Jedin´e spojen´ı s j´adrem je pomoc´ı ud´alost´ı.

Modul sc´eny – SceneModule

M´a pˇr´ım´y pˇr´ıstup ke spr´avci sc´en, ˇz´adn´a jin´a ˇc´ast j´adra nen´ı pˇr´ıstupn´a.

Modul pro import a export – IOModule

Vych´az´ı z modulu sc´eny. Na stranˇe j´adra vyˇzaduje spolupr´aci pˇri v´ybˇeru spr´avn´eho modulu pro poˇzadovan´y form´at dat.

Zobrazovac´ı modul – RenderModule

Rozˇsiˇruje modul sc´eny. Vyˇzaduje vysokou m´ıru propojenosti ze strany j´adra, naopak ze strany modulu k ˇz´adn´emu rozˇs´ıˇren´ı pˇr´ıstupu k j´adru nedoch´az´ı.

Manipul´ator – ManipulatorModule

Zpracov´av´a speci´aln´ı ud´alosti ze vstupn´ıch zaˇr´ızen´ı.

Manipul´ator kamery – CameraModule

Na rozd´ıl od manipul´atoru je v´ıce specializov´an na ovl´ad´an´ı kamery.

2.7 Geometrie

Geometrie je souˇc´ast´ı sc´eny. Odkazov´ana m˚uˇze b´yt pouze uzlem s geometri´ı a nen´ı nijak z´avisl´a na materi´alu, takˇze jedna geometrie muˇze b´yt pouˇzita v´ıce uzly a v kaˇzd´em z nich lze poˇz´ıt jin´y materi´al. Na obr´azku 2.2 je model krychle definovan´y jednou geometri´ı ve sc´enˇe odkazov´an pˇetkr´at, liˇs´ı se vˇsak v pouˇzit´em materi´alu.

(12)

VRUT Geometrie

Obr´azek 2.2: Pro jednu geometrii je pouˇzito r˚uzn´ych materi´al˚u

Geometrie vyuˇz´ıv´a dˇediˇcnost pro moˇznost definice v´ıce typ˚u geometri´ı, vˇsechny typy maj´ı svou ob´alku AABB a umoˇzˇnuj´ı pˇrevod geometrick´ych dat do podoby seznamu troj´uheln´ıku.

Zat´ım jedin´ym implementovan´ym typem geometrie je troj´uheln´ıkov´a re- presentace, kter´a je definov´ana seznamem vrchol˚u a index˚u do pole vrchol˚u, pˇr´ıpadnˇe pak norm´al a souˇradnic pro textury. Indexovanou troj´uheln´ıkovou geometrii lze interpretovat jako TRI LIST, TRI FAN, TRI STRIP, POLY- GON, LINES, LINE STRIP, POINTS nebo QUADS. Geometrie umoˇzˇnuje libovolnou kombinaci podporovan´e interpretace primitiv v r´amci jedn´e geo- metrie.

(13)

VRUT V´yvoj

2.8 V´ yvoj

Syst´em VRUT se st´ale jeˇstˇe vyv´ıj´ı. V souˇcasn´e dobˇe obsahuje velk´e mnoˇzstv´ı modul˚u rozˇsiˇruj´ıc´ıch jeho moˇznosti. St´ale vˇsak existuje funkˇcnost, kter´a se ve st´avaj´ıc´ıch modulech nenach´az´ı, a proto jsou potˇreba nov´e moduly doimple- mentovat. Jedn´ım z nich je pr´avˇe modul pro detekci kontur a jejich n´asledn´y export.

(14)

3 Detekce obrys˚ u

Obrysy se v poˇc´ıtaˇcov´e grafice pouˇz´ıvaj´ı jako jedna z metod nefotorealistic- k´eho zobrazen´ı (NPR) a metody pro jejich detekce lze na nejhrubˇejˇs´ı ´urovni rozdˇelit na rastrov´e a vektorov´e.

3.1 Rastrov´ a detekce obrys˚ u

Pro detekci obrys˚u byla vyvinuta cel´a ˇrada algoritm˚u (viz [Jiˇr´ı ˇZ´ara(2010)]) a pro pˇredstavu cituji tˇri metody uveden´e v tomto zdroji.

NPR s pomoc´ı prahov´an´ı

1. Um´ısti bodov´y zdroj svˇetla L do polohy kamery.

2. Nastav materi´al vˇsech tˇeles na b´ıl´y, ˇcistˇe dif´uzn´ı.

3. Zobraz sc´enu osvˇetlenou pouze pomoc´ı zdroje L.

4. Pˇreved’ vykreslen´y obraz prahov´an´ım na ˇcernob´ıl´y.

NPR s pomoc´ı pˇrivr´acen´ych a odvr´acen´ych ploch 1. Rozdˇel plochy sc´eny na pˇrivr´acen´e a odvr´acen´e.

2. Vykresli pˇrivr´acen´e plochy b´ıle.

3. Posuˇn model bl´ıˇze k rovinˇe.

4. Vykresli odvr´acen´e plochy ˇcernˇe (pomoc´ı pamˇeti hloubky).

NPR s vyhled´av´an´ım zmˇeny hloubky

1. Vyhodnot’ sc´enu pouze pomoc´ı pamˇeti hloubky.

2. Naˇcti mapu hloubek.

3. Pomoc´ı technik hled´an´ı hran nalezni na mapˇe m´ısta s v´yraznou zmˇenou hloubky a vykresli je.

Pˇr´ıstup tˇechto metod je rastrov´y, a z tohoto d˚uvodu jsem je zavrhl. Imple- mentace by znamenala rasterizaci modelu, kter´y je pops´an troj´uheln´ıkovou s´ıt´ı, a jeho n´aslednou vektorizaci, aby bylo moˇzn´e v´ysledek exportovat jako vektorov´y obr´azek.

(15)

Detekce obrys˚u Vektorov´a detekce obrys˚u

3.2 Vektorov´ a detekce obrys˚ u

Vektorov´y pˇr´ıstup detekce obrys˚u spoˇc´ıv´a v omezen´ı mnoˇziny vˇsech hran modelu pouze na ty, kter´e splˇnuj´ı podm´ınky obrysov´ych hran. Nejdˇr´ıve je nutn´e z troj´uheln´ıkov´e representace vytvoˇrit seznam hran, ke kter´ym se uloˇz´ı t´eˇz informace o prvc´ıch, kter´e s n´ı soused´ı (tzv. okˇr´ıdlen´a hrana). N´aslednˇe mohou b´yt hrany rozdˇeleny do tˇr´ı skupin:

Ostr´e (skuteˇcn´e) hrany – tvoˇr´ı hranici ploch. S touto hranou soused´ı pouze jeden troj´uheln´ık, nebo dva troj´uheln´ıky, kter´e vˇsak na t´eto hranˇe maj´ı odliˇsn´e norm´alov´e vektory. Tyto hrany se nemus´ı pˇri zmˇenˇe kamery pˇrepoˇc´ıt´avat a jsou vˇzdy oznaˇceny jako obrysov´e.

Potencion´aln´ı obrysov´e hrany – hrana, kter´a by mohla b´yt obrysovou hranou. Obrysov´a hrana vznikne mezi pˇrivr´acen´ym a odvr´acen´ym troj-

´

uheln´ıkem. U t´eto skupiny hran se mus´ı pˇri kaˇzd´e zmˇenˇe kamery ovˇeˇrit, zda je ˇci nen´ı hranou obrysovou.

Pomocn´e hrany – hrana mezi troj´uheln´ıky, kter´e leˇz´ı pˇribliˇznˇe v jedn´e ro- vinˇe. V t´eto skupinˇe hran se obrysov´e hrany nenach´az´ı.

Po tomto rozdˇelen´ı mus´ı b´yt ve skupinˇe potencion´aln´ıch obrysov´ych hran nalezeny ty, se kter´ymi soused´ı jeden pˇrivr´acen´y a jeden odvr´acen´y troj-

´

uheln´ık. Urˇcen´ı toho, zda je troj´uheln´ık pˇrivr´acen´y ˇci odvr´acen´y vˇsak je, v pˇr´ıpadˇe, ˇze nen´ı dodrˇzeno poˇrad´ı vrchol˚u, nemoˇzn´e.

Pokud vˇsak pˇrevedeme vrcholy pomoc´ı zobrazovac´ı matice do 2D, m˚u- ˇ

zeme obrysovou hranu urˇcit na z´akladˇe toho, zda tˇret´ı vrcholy (ty, kter´e nejsou souˇc´ast´ı hrany) pˇrilehl´ych troj´uheln´ık˚u leˇz´ı ˇci neleˇz´ı ve stejn´e poloro- vinˇe urˇcen´e dvˇema vrcholy hrany - pokud ve stejn´e polorovinˇe leˇz´ı, je tato hrana obrysov´a (Obr´azek 3.1).

3.3 Viditelnost obrysov´ ych hran

U rastrov´ych metod je viditelnost obrysov´ych hran ˇreˇsena pomoc´ı Z-bufferu.

U tˇech vektorov´ych je vˇsak probl´em sloˇzitˇejˇs´ı a mus´ı se pouˇz´ıt nˇekter´y z li- niov´ych algoritm˚u viditelnosti. Jako pˇr´ıklad zde uvedu tˇri algoritmy slouˇz´ıc´ı k urˇcen´ı viditelnosti hran (viz [Jiˇr´ı ˇZ´ara(2010)]).

(16)

Detekce obrys˚u Viditelnost obrysov´ych hran

Obr´azek 3.1: Urˇcen´ı, zda se jedn´a o obrysovou hranu

3.3.1 Roberts˚ uv algoritmus

Roberts˚uv algoritmus je urˇcen pro ˇreˇsen´ı hranov´e viditelnosti ve sc´enˇe sloˇzen´e z konvexn´ıch ploch a tˇeles. Postupnˇe pro vˇsechny hrany testuje, zda jsou zakryty jinou plochou nebo tˇelesem. Pokud je testovan´e hrana zakryta jen ˇ

c´asteˇcnˇe, rozdˇel´ı se hrana na zakrytou a nezakrytou ˇc´ast a kaˇzd´a nezakryt´a ˇ

c´ast se st´av´a novou hranou, kterou je tˇreba otestovat.

Roberts˚uv algoritmus se stal z´akladem mnoha dalˇs´ıch metod, kter´e se liˇs´ı napˇr´ıklad seˇrazen´ım hran, pouˇzit´ım urychlovac´ıch test˚u pˇr´ı hled´an´ı z´akryt˚u, apod. Vˇetˇsina ´uprav pˇritom zachov´av´a hlavn´ı myˇslenku, kterou je rozdˇelen´ı potencion´alnˇe viditeln´ych hran na element´arn´ı ´useky, na nichˇz se jiˇz viditel- nost nem˚uˇze mˇenit. K nalezen´ı tˇechto s nemˇennou viditelnost´ı se pouˇz´ıv´a obrysov´ych hran, nebot’ pouze ty indikuj´ı pˇr´ıpadnou zmˇenu viditelnosti.

Velkou nev´yhodou tohoto algoritmu je, ˇze zkoum´an´ı z´akrytu potenci-

´

alnˇe zakryt´ych element´arn´ıch ´usek˚u s nekonvexn´ımi mnohostˇeny je pomˇernˇe zdlouhav´e.

3.3.2 Appel˚ uv algoritmus

Appel˚uv algoritmus je zaloˇzen na testov´an´ı potencion´alnˇe viditeln´ych hran v˚uˇci hran´am obrysov´ym a hledaj´ı se jejich zd´anliv´e pr˚useˇc´ıky (v pr˚umˇetu).

Pokud testovan´a hrana v tomto pr˚useˇc´ıku leˇz´ı za obrysovou hranou, mˇen´ı se

(17)

Detekce obrys˚u Viditelnost obrysov´ych hran

0 1 2 1

1 0 0

Obr´azek 3.2: Zmˇena koeficient zakryt´ı v pr˚useˇc´ıc´ıch hran

v tomto m´ıstˇe koeficient zakryt´ı – pokud za n´ı vstupuje, koeficient se zvyˇsuje, pokud vystupuje, tak se sniˇzuje (Obr´azek 3.2). ´Useky, ve kter´ych je koeficient zakryt´ı roven 0, jsou viditeln´e.

Nejprve se mus´ı spoˇc´ıtat koeficient zakryt´ı v poˇc´ateˇcn´ım vrcholu, a to urˇcen´ım poˇctu polygon˚u, kter´e ho zakr´yvaj´ı. Tyto hodnoty se pak d´ale nesou po hran´ach vych´azej´ıc´ıch z tohoto vrcholu a koeficient zakryt´ı se mˇen´ı, jen pokud hrana prot´ın´a hranu obrysovou a vstupuje za n´ı.

Pomˇernˇe jednoduch´y postup tohoto algoritmu je komplikov´an nutnost´ı oˇsetˇrov´an´ı mnoha moˇzn´ych singul´arn´ıch pˇr´ıpad˚um kdy napˇr. pr˚umˇet vrcholu obrysov´e hrany leˇz´ı v pr˚umˇetu testovan´e hrany a naopak.

3.3.3 Weiler-Atherton˚ uv algoritmus

Weiler-Atherton˚uv algoritmus je zaloˇzen na rychl´em oˇrez´av´an´ı nekonvexn´ıch ploch vybranou bl´ızkou plochou. Nejdˇr´ıve jsou vˇsechny plochy seˇrazeny podle jejich minim´aln´ı vzd´alenosti od pozorovatele a n´aslednˇe je vybr´ana prvn´ıho, podle kter´e jsou rozstˇr´ıh´any vˇsechny zb´yvaj´ıc´ı plochy. Ty jsou roztˇr´ıdˇeny do dvou dalˇs´ıch seznam˚u v z´avislosti na tom, zda dan´a ˇc´ast leˇz´ı uvnitˇr nebo vnˇe nadˇrazen´e plochy. Tento postup se d´ale opakuje i pro dalˇs´ı plochy v seznamu.

Zp˚usob oˇrez´av´an´ı je naznaˇcen na obr´azku 3.3. Z´akladem je nalezen´ı vˇsech pr˚useˇc´ık˚u mezi dvˇema mnoˇzinami ´useˇcek v rovinˇe. Prvn´ı je tvoˇrena ´useˇckami mezi vrcholy A0 –A1 –A2 –A0, druh´a mezi vrcholyB0 –B1 –B2 –B3 –B0.

(18)

Detekce obrys˚u Viditelnost obrysov´ych hran

A

0

A

1

A

2

B

0

B

1

B

2

B

3

I

0

I

1

A

0

A

1

A

2

B

0

B

1

B

2

B

3

I

0

I

1

I

0

I

1

Obr´azek 3.3: Zp˚usob oˇrez´av´an´ı ploch

Pr˚useˇc´ıky obou ploch jsou body I0, I1, I3. Algoritmus pracuje se dvˇema se- znamy – vrcholy prvn´ı a druh´e plochy. Pr˚useˇc´ıky se zaˇrad´ı mezi vrcholy prvn´ı a druh´e plochy. V prvn´ıho seznamu najdeme vstupn´ı pr˚useˇc´ık a postupujeme pˇres vrcholy vpˇred, dokud nenaraz´ıme na dalˇs´ı z pr˚useˇc´ık˚u. V tomto m´ıstˇe pˇrejdeme do druh´eho seznamu na odpov´ıdaj´ıc´ı m´ısto, a zase postupujeme pˇres vrcholy vpˇred aˇz k dalˇs´ımu pr˚useˇc´ıku. Zde se zase pˇresuneme do prv- n´ıho seznamu a postup opakujeme tak dlouho, dokud nenaraz´ıme na prvn´ı pr˚useˇc´ık. Vˇsechny proˇsl´e vrcholy a pr˚useˇc´ıky jsou vrcholy oˇrezan´e plochy.

Tento algoritmus je pˇr´ıkladem postupu, ˇreˇs´ıc´ıho viditelnost ploch. Plochy nebo jejich oˇrezan´e ˇc´asti, kter´e byly oznaˇceny jako viditeln´e, lze d´ale vybarvit.

(19)

4 PostScript

Jedn´ım z c´ıl˚u t´eto pr´ace bylo umoˇznit export nalezen´ych hran do form´atu PostScript, a proto se v t´eto kapitole sezn´am´ıme s t´ımto form´atem. Pouˇzit´e informace jsou ˇcerp´any z [Ado(1999)], [Ado(1985)] a [Tiˇsnovsk´y(2006)].

4.1 Z´ akladn´ı charakteristiky

PostScript, kter´y byl vyvinut firmou Adobe v roce 1985, je programovac´ı jazyk, souˇz´ıc´ı k popisu str´anky, kter´a se m´a vykreslit na tisk´arnˇe, obrazovce poˇc´ıtaˇce, ˇci jin´em zobrazovac´ım zaˇr´ızen´ı.

K zobrazen´ı na monitoru je zapotˇreb´ı vhodn´y prohl´ıˇzeˇc, napˇr´ıklad volnˇe ˇsiˇriteln´y program GhostView spolu s Ghostscriptem. Tisk m˚uˇze prob´ıhat pˇr´ımo na postscriptov´e tisk´arnˇe.

Mezi moˇznosti popisu str´anky patˇr´ı oper´atory pro kreslen´ı pˇr´ımek, ob- louk˚u, obd´eln´ık˚u a kubick´ych kˇrivek, nastaven´ı vzhledu obrysov´ych ˇcar a v´y- plnˇe, nebo nastaven´ı oˇrezov´e cesty. Barvy mohou b´yt nastaveny v´ıce zp˚u- soby – stupnˇe ˇsedi, RGB, CMYK a CIE, a t´eˇz je moˇzn´e m´ısto barvy pouˇz´ıt vzory nebo st´ınov´an´ı. Text je tak´e povaˇzov´an za grafick´e tvary, takˇze s n´ım lze pracovat pomoc´ı grafick´ych oper´ator˚u. Rastrov´a grafika je pˇr´ımo vloˇzena do popisu str´anky a existuje ˇrada zp˚usob˚u, jak reprodukovat obr´azky na v´ystupn´ım zaˇr´ızen´ı. PostScript t´eˇz podporuje vˇsechny kombinace line´arn´ıch transformac´ı, jako jsou posunu, zmˇeny velikosti, otoˇcen´ı, zrcadlen´ı a zkosen´ı.

Transformace se aplikuj´ı na vˇsechny prvky str´anky, vˇcetnˇe textu, grafick´ych tvar˚u a rastrov´e grafiky.

PostScript pouˇz´ıv´a k pops´an´ı grafick´e informace programovac´ı jazyk, je- hoˇz instrukce se zaznamen´avaj´ı v postfixov´e notaci. To znamen´a, ˇze nejdˇr´ıve mus´ı b´yt zad´any operandy a potom teprve oper´ator. Interpretace se prov´ad´ı pomoc´ı zasobn´ıku.

(20)

PostScript Syntaxe

4.2 Syntaxe

Poststriptov´y soubor je soubor textov´y, proto leze k jeho vytvoˇren´ı pou- ˇ

z´ıt textov´y editor. Jednotliv´e syntaktick´e konstrukce jsou oddˇeleny

”b´ıl´ymi“

znaky, kter´e jsou NUL,TAB, LF, FF, CR a SP. Je tedy jedno, zda se jednotliv´e hodnoty ˇci oper´atory p´ıˇs´ı na nov´e ˇr´adky, nebo se k jejich oddˇelen´ı pouˇzije jin´y

”b´ıl´y“ znak, napˇr´ıklad mezera.

Dalˇs´ımi speci´aln´ımi znaky jsou(,),<,>,[,],{,},/, a%, kter´e slouˇz´ı pro oddˇelen´ı text˚u, tˇel procedur, jmen objekt˚u a koment´aˇr˚u. Koment´aˇre zaˇc´ınaj´ı znakem % a konˇc´ı znakem nov´e ˇr´adky.

C´ısla lze zad´ˇ avat n´asleduj´ıc´ımi zp˚usoby:

• Cel´a ˇc´ısla, napˇr´ıklad:

123 -98 43445 0 +17

• Re´aln´a ˇc´ısla, napˇr´ıklad:

-.002 34.5 -3.62 123.6e10 1.0E-5 1E6 -1. 0.0

• C´ısla pˇri urˇˇ cit´em z´akladu, napˇr´ıklad:

8#1777 16#FFFE 2#1000

Textov´e ˇretˇezce se zad´avaj´ı takto:

• Doslovn´y text je uzavˇren v ( a)

• Hexadecim´aln´ı data jsou uzavˇrena v < a >

• ASCII base-85 data jsou uzavˇrena v <∼ a ∼>

N´azvy objekt˚u se zav´adˇej´ı pomoc´ı znaku /, za kter´ym n´asleduje zvolen´e jm´eno. Lom´ıtko nen´ı souˇc´ast´ı jm´ena.

Prvky pole se zad´avaj´ı mezi znaky [ a ]. Konstrukce pole tedy m˚uˇze vypadat takto:

[ 123 /abc (xyz) ]

Tˇela procedur se zad´avaj´ı pomoc´ı spustiteln´eho pole. Jeho prvky se za- d´avaj´ı mezi znaky { a}, napˇr´ıklad takto:

(21)

PostScript Z´akladn´ı pˇrehled oper´ator˚u

{add 2 div}

4.3 Z´ akladn´ı pˇ rehled oper´ ator˚ u

Matematick´e oper´atory add – souˇcet hodnot div – pod´ıl hodnot

mod – zbytek po dˇelen´ı hodnot mul – vyn´asoben´ı hodnot sub – rozd´ıl hodnot

sqrt – druh´a odmocnina hodnoty Oper´atory pro pr´aci se z´asobn´ıkem

pop – zahod´ı vrchn´ı hodnotu dup – duplikuje vrchn´ı hodnotu clear – zahod´ı cel´y z´asobn´ı

Oper´atory pro nastaven´ı souˇradn´eho syst´emu trnaslate – posun

scale – mˇeˇr´ıtko rotate – natoˇcen´ı

Oper´atory pro kreslen´ı cesty newpath – Inicializace nov´e cesty

moveto, rmoveto – pˇresunut´ı aktu´aln´ıch souˇradnic lineto, rlineto – pˇripojen´ı ´useˇcky

arc, arcn, arct, arcto – pˇripojen´ı oblouku cuketo, rcurveto – pˇripojen´ı Bezi´erovy kubiky closepath – uzavˇre cestu

Grafick´e oper´atory

setlinewidth – nastaven´ı ˇs´ıˇrku ˇc´ary

(22)

PostScript Definice promˇenn´ych a nov´ych pˇr´ıkaz˚u

setrgbcolor – nastaven´ı barevn´y prostor na RGB a nastav´ı jednotliv´e barevn´e sloˇzky

stroke – vykreslen´ı ˇc´ary po aktu´aln´ı cestˇe V´ystupn´ı opr´atory

showpage – vykresl´ı a smaˇze aktu´aln´ı str´anku

4.4 Definice promˇ enn´ ych a nov´ ych pˇ r´ıkaz˚ u

Pro definici promˇenn´ych a nov´ych pˇr´ıkaz˚u se pouˇz´ıv´a pˇr´ıkaz def, kter´y ke zvolen´emu jm´enu pˇriˇrad´ı hodnotu. Pokud je touto hodnotou seznam pˇr´ıkaz˚u, st´av´a se takov´eto jm´eno nov´ym pˇr´ıkazem. Seznam pˇr´ıkaz˚u se zapisuje do sloˇzen´ych z´avorek. Pro vykreslen´ı pˇr´ımky mezi zadan´ymi body lze napˇr´ıklad definovat pˇr´ıkaz:

/linefromto {moveto lineto} def

Tento pˇr´ıkaz lze pak pouˇz´ıt n´asleduj´ıc´ım zp˚usobem:

x1 y1 x2 y2 linefromto

4.5 Souˇ radn´ y syst´ em

Pro natoˇcen´ı, zkosen´ı, posun, zmˇenu velikosti ˇci zrcadlen´ı pouˇz´ıv´a PostScript line´arn´ı transformace. Pro zad´av´an´ı souˇradnic, kter´ymi se ˇr´ıd´ı vykreslov´an´ı, se pouˇz´ıv´a souˇradn´y syst´em nez´avisl´y na zobrazovac´ım zaˇr´ızen´ı. Z´akladn´ı d´el- kovou jednotkou je jeden topologick´y bod, jehoˇz d´elka se rovn´a 1/72 palce.

Proto se tˇesnˇe pˇred rastrov´an´ım prov´ad´ı pˇrevod tˇechto souˇradnic do souˇrad- n´eho syst´emu dan´eho zobrazovac´ıho zaˇr´ızen´ı.

(23)

PostScript Souˇradn´y syst´em

Pˇri inicializaci nov´e str´anky je nastaven poˇc´atek souˇradn´eho syst´emu do lev´eho doln´ıho rohu. Ne vˇzdy takov´eto nastaven´ı vyhovuje, je vˇsak moˇzn´e nastavit transformaˇcn´ı matici a takto definovat uˇzivatelsk´y prostor.

Nastaven´ı transformaˇcn´ı matice pro poˇc´atek uˇzivatelsk´eho prostoru na stˇred str´anky a d´elkov´ych jednotek na milimetr vypad´a napˇr´ıklad takto:

595 2 div 842 2 div translate 72 25.4 div dup scale

(24)

5 N´ avrh

Pˇri n´avrhu ˇreˇsen´ı jsem se nejdˇr´ıve ocitl pˇred ot´azkou, zda pouˇz´ıt rastrovou nebo vektorovou detekci obrys˚u. Rozhodl jsem se pro vektorovou, a to proto, ˇ

ze v´ysledkem exportu obrys˚u m´a byt vektorov´y obr´azek. V pˇr´ıpadˇe poˇzit´ı nˇekter´e z rastrov´e metody by muselo nejdˇr´ıve doj´ıt k rasterizaci – model je pops´an troj´uheln´ıkovou s´ıt´ı, a pot´e k pˇreveden´ı zp´atky na vektory, kter´e by se pouˇzily pro export.

Bylo tedy nutn´e vyˇreˇsit 6 z´akladn´ıch bod˚u, a to:

• Nalezen´ı vˇsech hran modelu

• Rozdˇelen´ı seznamu na skuteˇcn´e a potencion´alnˇe obrysov´e hrany

• Nalezen´ı skuteˇcnˇe obrysov´ych hran

• Sestaven´ı lomen´ych ˇcar z obrysov´ych hran

• Viditelnost obrysov´ych hran

• Export obrys˚u do souboru

Pˇri pr´aci s re´aln´ymi daty se vˇsak vyskytl jeˇstˇe jeden, a to vyˇreˇsit vznik faleˇsn´ych hran zp˚usoben´y v´ıcen´asobn´ym v´yskytem jednoho bodu v popisu geometrie.

5.1 Nalezen´ı vˇ sech hran

Indexovou geometrii VRUTu lze interpretovat jako TRI LIST, TRI FAN, TRI STRIP, POLYGON, LINES, LINE STRIP, POINTS, QUADS. Proto jsem se rozhodl kaˇzdou z tˇechto interpretac´ı zpracovat samostatnˇe a pˇri po- stupn´em proch´azen´ı indexov´eho pole zaˇrazovat hrany do seznamu na z´akladˇe sch´emat na obr´azku 5.1.

U interpretac´ı LINES a LINE STRIP mohou vznikat rovnou skuteˇcn´e hrany, POINTS se m˚uˇze ze vkl´ad´an´ı hran vynechat.

(25)

N´avrh Nalezen´ı skuteˇcn´ych hran

V0 V1

V2

V3

V4

V5

POINTS TRI_LIST

V0 V1

V2

V3

V4

V5

V0 V1

V2

V3

V4

V5

TRI_FAN

V0

V1

V2

V3

V4

TRI_STRIP V5

V0 V1

V2

V3

V4

V5

POLYGON

V0 V1

V2

V3

V4

V5

LINES

V0 V1

V2

V3

V4

V5

LINE_STRIP

V0 V1

V2

V3

QUADS

Obr´azek 5.1: Pˇrehled interpretac´ı geometrie VRUTu

5.2 Nalezen´ı skuteˇ cn´ ych hran

Nalezen´ı skuteˇcn´ych hran je zaloˇzeno na jednoduch´em principu rozdˇelen´ı se- znamu vˇsech hran do dvou na z´akladˇe toho, zda je souˇc´ast´ı jednoho nebo dvou troj´uheln´ık˚u. Pokud je hrana souˇc´ast´ı jednoho troj´uheln´ıku, nach´az´ı se tak na okraji plochy a je to tedy skuteˇcn´a hrana, kter´a se bude vykreslo- vat vˇzdy a nez´avisle na parametrech kamery. Do seznamu skuteˇcn´ych hran jsou t´eˇz zaˇrazeny vˇsechny hrany, kter´e jsou souˇc´ast´ı v´ıce neˇz dvou troj´uhel- n´ık˚u. Pokud je sd´ılena dvˇema troj´uheln´ıky, pak je tˇreba prov´est dalˇs´ı testy, aby se rozhodla o jej´ım vykreslen´ı, a je j´ı tedy potˇreba zaˇradit do seznamu potencion´alnˇe obrysov´ych hran, jejichˇz zobrazen´ı je z´avisl´e na parametrech kamery.

5.3 Nalezen´ı obrysov´ ych hran

Po rozdˇelen´ı seznamu vˇsech hran na skuteˇcn´e a potencion´alnˇe obrysov´e jsou hrany z prvnˇe jmenovan´eho z nich zobrazov´any vˇzdy. Probl´em nast´av´a v pˇr´ı- padˇe druh´eho seznamu, ve kter´em se mus´ı hrany, kter´e se budou zobrazovat,

(26)

N´avrh Sestaven´ı lomen´ych ˇcar

nal´ezt v z´avislosti na parametrech kamery.

Vˇsechny body se nejdˇr´ıve pomoc´ı pohledov´e matice pˇrevedou do souˇrad- nic, kter´e jsou pouˇzity pˇri zobrazen´ı modelu, a pot´e se pro kaˇzdou hranu ze seznamu potencion´alnˇe obrysov´ych ovˇeˇruje, zda jej´ı tˇret´ı a ˇctvrt´y vrchol leˇz´ı ve stejn´e polorovinˇe definovan´e pˇr´ımkou urˇcenou jej´ımi prvn´ımi dvˇema vrcholy (Obr´azek 3.1). Pokud ve stejn´e polorovinˇe leˇz´ı, je nastaven pˇr´ıznak, kter´y urˇc´ı, ˇze pˇri vykreslen´ı bude tato hrana zobrazena.

5.4 Sestaven´ı lomen´ ych ˇ car

K sestaven´ı lomen´ych ˇcar z jednotliv´ych hran jsem se rozhodl proto, aby se n´aslednˇe l´epe ˇreˇsila viditelnost hran, i z hlediska velikosti v´ysledn´eho expor- tovan´eho souboru (nemus´ı se neust´ale pˇresouvat pozice pera).

Nejdˇr´ıve si ke kaˇzd´emu vrcholu vytvoˇr´ım seznam hran, kter´e jsou k nˇemu nav´az´any. Pot´e se postupnˇe proch´azej´ı vrcholy, ze kter´ych vede jedna nebo tˇri a v´ıce hran.

Tyto vrcholy jsou urˇceny jako poˇc´atek lomen´e ˇc´ary a d´ale se postupuje ve smˇeru jeˇstˇe nepouˇzit´e hrany (proˇsl´e hrany se oznaˇc´ı) tak dlouho, dokud je poˇcet hran nav´azan´ych k vrcholu roven dvˇema. Takto se postupnˇe naleznou vˇsechny acyklick´e lomen´e ˇc´ary.

Pokud zbudou nˇekter´e vrcholy se dvˇema nav´azan´ymi neoznaˇcen´ymi hra- nami, jsou urˇceny jako poˇc´atek lomen´e ˇc´ary a d´ale se postupuje ve smˇeru jeˇstˇe nepouˇzit´y hrany tak dlouho, dokud nen´ı dosaˇzeno poˇc´atku lomen´e ˇc´ary.

T´ımto zp˚usobem jsou nalezeny vˇsechny cyklick´e lomen´e ˇc´ary.

Tento mechanizmus je naznaˇcen na obr´azku 5.2. Vrcholy, ze kter´ych vy- ch´az´ı jedna nebo tˇri a v´ıce hran, jsou zn´azornˇeny ˇcern´ymi punt´ıky, a ty, ze kter´ych vych´azej´ı pouze hrany dvˇe, jsou oznaˇceny punt´ıky b´ıl´ymi. ´Useˇcky mezi nimi zn´azorˇnuj´ı nalezen´e obrysov´e hrany a ˇsipky ukazuj´ı postupn´e vy- tv´aˇren´ı lomen´ych ˇcar. Punt´ık s kˇr´ıˇzkem zn´azorˇnuje zbyl´y vrchol, ze kter´eho vych´az´ı pouze dvˇe hrany, kter´y je pouˇzit jako zaˇc´atek dalˇs´ı lomen´e ˇc´ary.

(27)

N´avrh Viditelnost obrysov´ych hran

Obr´azek 5.2: Sestaven´ı lomen´ych ˇcar

5.5 Viditelnost obrysov´ ych hran

Protoˇze jsem se rozhodl pro vektorovou detekci obrys˚u, pro ˇreˇsen´ı viditel- nost´ı hran pˇripadal v ´uvahu Roberts˚uv, Appel˚uv nebo Weiler-Atherton˚uv algoritmus.

Roberts˚uv m´a tu nev´yhodu, ˇze zkoum´an´ı z´akrytu potencion´alnˇe zakry- t´ych ´usek˚u hran s nekonvexn´ımi mnohostˇeny je zdlouhav´e. Model, kter´y jsem mˇel k dispozici, byl sloˇzen z v´ıce neˇz mili´onu troj´uheln´ık˚u, a proto sem se tento algoritmus rozhodl zavrhnout, aby bylo moˇzno obrysy zobrazovat v re´al- n´em ˇcase. Weiler-Atherton˚uv algoritmus [Kevin Weiler(1977)] ˇreˇs´ı viditelnost ploch. Tyto plochy by nejdˇr´ıve bylo nutn´e ze seznamu lomen´ych ˇcar sestrojit, a aˇz potom tento algoritmus aplikovat. Rozhodl jsem se proto vyuˇz´ıt Appe- l˚uv algoritmus [Appel(1967)], pro kter´y popis obrysov´ych hran staˇc´ı, nebot’

ˇreˇs´ı viditelnost na z´akladˇe pr˚useˇc´ık˚u tˇechto hran.

Nejprve bylo nutn´e vypoˇc´ıst koeficienty zakryt´ı v roz´ıch geometrie. Pro tento v´ypoˇcet se pouˇzije test pr˚useˇc´ıku polopˇr´ımky zaˇc´ınaj´ıc´ı v dan´em rohu a proch´azej´ıc´ı druh´ym bodem testovan´e hrany s hranou vˇsech troj´uheln´ık˚u soused´ıc´ıch s dan´ym rohem, kter´e vˇsak rohem ani druh´ym bodem testovan´e hrany neproch´azej´ı. Pokud je v tomto pr˚useˇc´ıku testovan´a hrana za hranou troj´uheln´ıku, vych´az´ı z rohu za t´ımto troj´uheln´ıkem schov´ana, a proto se jej´ı koeficient zakryt´ı zv´yˇs´ı o jedna.

Pro objasnˇen´ı v´ypoˇctu koeficient˚u v roz´ıch n´am poslouˇz´ı obr´azek 5.3. Tes- tovan´y roh je zde oznaˇcen p´ısmenem C, a soused´ı s n´ım ˇctyˇri troj´uheln´ıky CV0V1,CV1V2,CV2V3,CV3V0. Hrana, pro kterou se prov´ad´ı v´ypoˇcet koefici- entu zakryt´ı, jeCV0, a hrany vˇsech ˇctyˇr troj´uheln´ık˚u, kter´e splˇnuj´ı podm´ınku, ˇ

ze neproch´azej´ı rohov´ym bodem C ani druh´ym bodem testovan´e hrany V0,

(28)

N´avrh Viditelnost obrysov´ych hran

jsou pouze dvˇe – V1V2 a V2V3.

Pr˚useˇc´ık polopˇr´ımkyCV0 a tˇechto dvou hran je pouze jeden, na obr´azku oznaˇcen´y krouˇzkem. Pokud se v tomto pr˚useˇc´ıku polopˇr´ımkaCV0 nach´az´ı za

´

useˇckou V1V2, je schov´ana za troj´uheln´ıkem CV1V2 a nutn´e zv´yˇsit koeficient zakryt´ı t´eto hrany o jedna, pokud se nach´az´ı pˇred n´ı, tento koeficient se nemˇen´ı.

C

V

0

V

1

V

2

V

3

Obr´azek 5.3: V´ypoˇcet koeficientu zakryt´ı v roz´ıch geometrie

Dalˇs´ım krokem by mˇelo b´yt rozsek´an´ı sestaven´ych lomen´ych ˇcar na ele- ment´arn´ı ´useky, na nichˇz se viditelnost nem˚uˇze zmˇenit. K nalezen´ı tˇechto

´

usek˚u lze s v´yhodou pouˇz´ıt obrysov´e hrany, vyjma tˇech, kter´e sd´ılej´ı troj´u- heln´ıky leˇz´ıc´ıch na obou stran´ach dan´e hrany (podmnoˇzina skuteˇcn´ych hran).

Na obr´azku 5.4 je vidˇet, jak´ym zp˚usobem ovlivˇnuj´ı tyto hrany (nakresleny silnˇejˇs´ı ˇc´arou) viditelnost dan´ych ´usek˚u.

U lomen´e ˇc´ary se t´eˇz uchov´av´a informace o relativn´ım koeficientu zakryt´ı na jej´ım zaˇc´atku a konci. V bodˇe rozdˇelen´ı se nastav´ı pro zakrytou ˇc´ast tento koeficient na hodnotu, kter´a koresponduje s poˇctem pˇrilehl´ych troj´uheln´ık˚u, pro nezakrytou ˇc´ast se koeficient v bodˇe rozdˇelen´ı nastav´ı na nulu.

Pot´e, co jsou vˇsechny ˇc´ary rozdˇeleny na ´useky, ve kter´ych se jiˇz vidi- telnost zmˇenit nem˚uˇze, a jsou nastaveny jejich relativn´ı koeficienty zakryt´ı v˚uˇci ostatn´ım navazuj´ıc´ım ˇcar´am, urˇc´ı se lomen´a ˇc´ara, jej´ıˇz souˇc´ast´ı je bod s nejmenˇs´ı hloubkou. Tato ˇc´ara je vˇzdy viditeln´a, jej´ı absolutn´ı koeficient zakryt´ı se nastav´ı na nulu, a pomoc´ı proch´azen´ı grafem, jehoˇz hranami jsou lomen´e ˇc´ary, se vypoˇc´ıtaj´ı absolutn´ı koeficienty zakryt´ı vˇsech lomen´ych ˇcar.

C´ˇara je viditeln´a, pokud jej´ı koeficient zakryt´ı je roven nule.

(29)

N´avrh Viditelnost obrysov´ych hran

Obr´azek 5.4: Rozdˇelen´ı hran na element´arn´ı ´useky s nemˇennou viditelnost´ı

Rozdˇelen´ı lomen´e ˇc´ary je nutn´e pouze v pˇr´ıpadˇe, ˇze tato vstupuje za jinou, a v m´ıstˇe rozdˇelen´ı se z´akonitˇe mˇen´ı koeficient zakryt´ı. U lomen´e ˇcary se tak´e ukl´ad´a informace o pˇrilehl´ych troj´uheln´ıc´ıch, d´ıky kter´e je moˇzn´e rozpoznat, kter´a ˇc´ast rozdˇelen´e ˇc´ary se nach´az´ı za plochou ohraniˇcenou dˇelic´ı ˇc´arou a kter´a mimo ni. Jak s touto informac´ı pracovat objasˇnuje obr´azek 5.5. Na rozdˇelen´em ´useku lomen´e ˇc´ary se stejn´a informace o pˇrilehl´ych troj´uheln´ıc´ıch uchov´av´a pro obˇe nov´e ˇc´asti.

Obr´azek 5.5: U lomen´e ˇcary se tak´e ukl´ad´a informace o pˇrilehl´ych troj´uhel- n´ıc´ıch

(30)

N´avrh Export obrys˚u

5.6 Export obrys˚ u

Pro export obrys˚u do souboru ve form´atu PostScript jsem se rozhodl vyuˇz´ıt sestaven´e lomen´e ˇc´ary. Nejdˇr´ıve se pˇresunou souˇradnice na jej´ı zaˇc´atek, a pot´e se k cestˇe pˇripoj´ı ´useˇcka konˇc´ıc´ı v dalˇs´ım jej´ım vrcholu. Takto se k cestˇe postupnˇe pˇripoj´ı vˇsechny ´useˇcky, kter´e tvoˇr´ı lomenou ˇc´aru a za posledn´ı z nich se cesta uzavˇre. Takto budou do souboru vyexportov´any vˇsechny lomen´e ˇc´ary tvoˇr´ıc´ı obrys modelu.

Exportovan´e hrany se nebudou nikterak oˇrez´avat podle velikosti zobrazo- van´eho okna, ale pro toto oˇrez´an´ı se pouˇzij´ı pˇr´ımo pˇr´ıkazy jazyka PostScript.

5.7 Vznik faleˇ sn´ ych hran

D˚uvodem vzniku faleˇsn´ych hran na nˇekter´ych modelech je to, ˇze jeden bod je v modelu uloˇzen nˇekolikr´at, a definice geometrie se d´ıky tomu na nˇej odka- zuje pomoc´ı r˚uzn´ych index˚u. Pokud tedy seznam hran vznikal jen za pomoci index˚u, a nebral v ´uvahu skuteˇcnou polohu bodu a norm´alov´y vektor plochy v tomto bodˇe, v´ysledn´e obrysov´e hrany byly protk´any velk´ym mnoˇzstv´ım faleˇsn´ych hran (Obr´azek 5.6).

Obr´azek 5.6: Model s faleˇsn´ymi hranami a ten sam´y po jejich odstranˇen´ı

K odstranˇen´ı tˇechto faleˇsn´ych hran jsem se rozhodl pouˇz´ıt haˇsovac´ı ta- bulku, popsanou v pr´aci [Ska(2009)]. Vedla mˇe k tomu jej´ı rychlost pˇri ovˇe- ˇrov´an´ı duplicity bod˚u, kter´a se odv´ıj´ı od n´ızk´e d´elky klastr˚u tabulky. Je

(31)

N´avrh Vznik faleˇsn´ych hran

zaloˇzena na haˇsovac´ı funkci

Index= (int)((αX+βY +γZ)C+ 0.5)&T

kde (int) je konverze na datov´y typ unsigned integer, X, Y, Z jsou sou- ˇradnice bodu,α,β,γjsou koeficienty haˇsovac´ı funkce,C je koeficient, kter´ym se zajist´ı, aby se vyuˇzilo pln´eho rozsahu datov´eho typu unsigned integer, T + 1 je velikost tabulky (T = 2k−1), & representuje modulo, kter´e je im- plementov´ano jako logick´y oper´ator, a 0.5 je konstanta, kter´a byla zjiˇstˇena experiment´alnˇe a pom´ah´a lepˇs´ımu rozloˇzen´ı souˇradnic v tabulce.

Velice d˚uleˇzit´a, pro velk´y rozptyl haˇsovac´ı funkce, je volba koeficient˚u, je- jichˇz hodnoty pro dosaˇzen´ı vynikaj´ıc´ıch v´ysledk˚u jsouα=π,β =e,γ =√

2.

Dalˇs´ım trikem t´eto funkce je nahrazen´ı klasick´eho modulo logick´ym oper´ato- rem &, kter´e v´ypoˇcet urychl´ı. Toto nahrazen´ı si m˚uˇzeme dovolit d´ıky tomu, ˇ

ze velikost tabulky je vˇzdy 2k.

(32)

6 Proveden´ı

Programovac´ım jazykem pro cel´y projekt VRUT je C++, a proto byl pouˇzit i pro tento modul.

Vytvoˇren´y modul se nach´az´ı v adres´aˇri modules/drawingscene a jeho souˇc´ast´ı je nˇekolik tˇr´ıd, kter´e budou pozdˇeji podrobnˇe pops´any. Je vytvoˇren jako modul sc´eny – to znamen´a, ˇze m´a pˇr´ım´ı pˇr´ıstup ke spr´avci sc´en a ˇz´adn´a jin´a ˇc´ast j´adra nen´ı pˇr´ıstupn´a.

Modul se spouˇst´ı z konzole VRUTu pˇr´ıkazemrunmodule DrawingScene.

Pot´e lze pomoc´ı pˇr´ıkazu setparam DrawingScene.sceneID [sceneID] na- stavit sc´enu, pro kterou bude tento modul vyuˇzit a nastaven´ım parametru setparam DrawingScene.enabled 1 pˇrepnout modul do m´odu zobrazov´an´ı obrysov´ych hran.

Po spuˇstˇen´ı se modul zaregistruje k odbˇeru o zmˇen´ach transformac´ı sc´eny, geometrie a parametr˚u kamery. D´ale jsou po spuˇstˇen´ı modulu nebo po zmˇenˇe sc´eny postupnˇe naˇcteny vˇsechny geometrie z dan´e sc´eny a je z nich vyexpor- tov´an seznam hran a informace o sousedn´ıch ploch´ach. Pot´e se hrany roztˇr´ıd´ı no ostr´e (skuteˇcn´e), kter´e se nemus´ı pˇri zmˇenˇe kamery pˇrepoˇc´ıtat, a na poten- cion´aln´ı obrysov´e hrany, ve kter´em se to opravdu obrysov´e hledaj´ı pˇri kaˇzd´e zmˇenˇe parametr˚u kamery.

Zvolen´a sc´ena se modifikuje tak, ˇze se p˚uvodn´ı geometrie skryje a pˇrid´a se nov´a, kter´a se bude plnit pˇri kaˇzd´e zmˇenˇe parametr˚u kamery nalezen´ymi hranami. Tak je moˇzn´a zapnout klasick´y zp˚usob zobrazen´ı jen t´ım, ˇze se nov´a geometrie pro nalezen´e hrany skryje a p˚uvodn´ı se naopak zviditeln´ı.

Pˇri ukonˇcen´ı modulu se uvoln´ı vˇsechna alokovan´a pamˇet’ vytvoˇren´ych objekt˚u a modul se zavˇre.

6.1 Uˇ zivatelsk´ e rozhran´ı modulu

Na uˇzivatelsk´em rozhran´ı modulu se nach´azej´ı tˇri ovl´adac´ı prvky, pole pro zad´an´ı jm´ena souboru a tlaˇc´ıtko, pomoc´ı kter´eho se provede export do zvo- len´eho souboru (Obr´azek 6.1).

(33)

Proveden´ı Popis pouˇzit´ych tˇr´ıd

sceneID – slouˇz´ı k v´ybˇeru sc´eny, pro kterou se bude aplikovat zobrazen´ı obrysov´ych hran.

enabled – povol´ı nebo zak´aˇze zobrazen´ı obrysov´ych hran.

showHiddenLines – povol´ı nebo zak´aˇze zobrazen´ı skryt´ych obrysov´ych hran.

fileName – slouˇz´ı pro zad´an´ı jm´ena souboru, do kter´eho bude proveden export.

export – slouˇz´ı k exportu obrysov´ych hran vybran´e sc´eny do souboru ve form´atu PostScript.

Obr´azek 6.1: Uˇzivatelsk´e rozhran´ı modulu

6.2 Popis pouˇ zit´ ych tˇ r´ıd

6.2.1 Tˇ r´ıda DrawingScene

Tato tˇr´ıda dˇed´ı zSceneModule a je vstupn´ım m´ıstem implementovan´eho mo- dulu. Uchov´av´a informace o nataven´ı modulu, obsluhuje registrovan´e zpr´avy a obsahuje funkce pro modifikaci sc´eny a nalezen´ı vˇsech geometri´ı pro jejich n´asledn´e zpracov´an´ı. Jeho d˚uleˇzitou souˇc´ast´ı je t´eˇz obsluha GUI.

D˚uleˇzit´e funkce tˇr´ıdy:

(34)

Proveden´ı Popis pouˇzit´ych tˇr´ıd

DrawingScene – konstruktor tˇr´ıdy. Jsou zde registrov´any ovl´adac´ı prvky uˇzi- vatelsk´eho rozhran´ı a odbˇer zpr´av o zmˇenˇe transformac´ı sc´eny, geome- trie a parametr˚u kamery.

processEvent – obsluha zpr´av zaslan´ych j´adrem.

processSelectScene – tato funkce je vol´ana pˇri zmˇenˇe sc´eny, pro kterou se maj´ı obrysov´e hrany hledat. V p˚uvodn´ı sc´enˇe skryje geometrie s hra- nami a zobraz´ı p˚uvodn´ı geometrie, v novˇe vybran´e sc´enˇe skryje p˚uvodn´ı geometrie, pokud jeˇstˇe neexistuj´ı geometrie pro hrany, jsou vytvoˇreny, a zajist´ı sestaven´ı nov´ych seznam˚u hran.

processChangeEnable – zap´ın´a nebo vyp´ın´a zobrazen´ı obrysov´ych hran.

processExport – tato funkce zabezpeˇc´ı export vybran´e sc´eny do souboru.

processShowHiddenLines – zap´ın´a a vyp´ın´a zobrazen´ı skryt´ych hran.

prepareScene – funkce slouˇz´ı k pˇripraven´ı sc´eny pro zobrazen´ı obrysov´ych hran. Jsou zde pˇrid´any nov´e uzly a geometrie, kter´a bude pouˇzita pro zobrazen´ı viditeln´ych a skryt´ych hran.

setDrawingScene – pˇrepne vybranou sc´enu do reˇzimu zobrazen´ı hran a za- jist´ı pˇrepoˇcet hran a jejich zobrazen´ı.

returnOrigScene – pˇrepne vybranou sc´enu do reˇzimu standardn´ıho zobra- zen´ı.

extractEdges – postupnˇe ve sc´enˇe projde vˇsechny geometrie a pro kaˇzdou vytvoˇr´ı koresponduj´ıc´ı objekt tˇr´ıdy DrawingEdges, kter´y n´aslednˇe na- pln´ı hranami z dan´e geometrie.

extractGeometries – postupnˇe projde vˇsechny uzly s geometriemi a pro kaˇzdou vytvoˇr´ı koresponduj´ıc´ı objekt tˇr´ıdy DrawingGeometry.

extractCameras – vyhled´a vˇsechny kamery sc´eny a vybere kameru pro v´y- poˇcet obrysov´ych hran.

clearGeometry – odstran´ı z geometrie vˇsechny body, indexy a definice.

fillGeometry – funkce slouˇz´ı k naplnˇen´ı geometri´ı pro viditeln´e a nevidi- teln´e hrany.

redraw – pˇri zmˇenˇe parametr˚u kamery zajist´ı tato funkce v´ypoˇcet nov´ych obrysov´ych hran a jejich n´asledn´e zobrazen´ı.

clear – uvoln´ı modulem alokovanou pamˇet’.

(35)

Proveden´ı Popis pouˇzit´ych tˇr´ıd

6.2.2 Tˇ r´ıda DrawingEdges

Tato tˇr´ıda uchov´av´a informace o bodech, norm´al´ach a hran´ach jedn´e geome- trie sc´eny. Obsahuje funkce pro vloˇzen´ı jednotliv´ych typ˚u geometrie, pomoc´ı kter´ych se pˇrid´avaj´ı hrany do seznamu. Dalˇs´ımi funkcemi je rozdˇelen´ı hran na skuteˇcn´e a potencion´alnˇe obrysov´e a v´ypoˇcet zd´anliv´eho pr˚useˇc´ık˚u dvou hran.

D˚uleˇzit´e funkce tˇr´ıdy:

DrawingEdges – konstruktor tˇr´ıdy. Slouˇz´ı k vytvoˇren´ı hashmap potˇrebn´ych pro vkl´ad´an´ı hran.

insertPolygon – export vˇsech hran z geometrie typuPOLYGON.

insertQuads – export vˇsech hran z geometrie typu QUADS.

insertTriFun – export vˇsech hran z geometrie typuTRI_FAN.

insertTriList – export vˇsech hran z geometrie typuTRI_LIST.

insertTriStrip – export vˇsech hran z geometrie typu TRI_STRIP.

insertLineStrip – export vˇsech hran z geometrie typu LINE_STRIP.

insertLines – export vˇsech hran z geometrie typu LINES.

getEdges – funkce vrac´ı ukazatel na seznam hran.

getVertexMap – funkce vrac´ı pole obsahuj´ıc´ı seznam vˇsech vrchol˚u geometrie a seznam vrchol˚u, kter´e jsou s nimi spojeny hranou.

cornerEdgeDepth – urˇc´ı viditelnost hrany vych´azej´ıc´ı z dan´eho vrcholu.

addEdge – slouˇz´ı k vloˇzen´ı hrany do seznamu. Vkl´adan´a hrana je pops´ana tˇremi nebo ˇctyˇrmi indexy (podle toho, zda s n´ı soused´ı jeden nebo dva troj´uheln´ıky). Prvn´ı dva indexy popisuj´ı body hrany a dalˇs´ı tˇret´ı body pˇrilehl´ych troj´uheln´ık˚u.

getVertexIndex – na vstupu t´eto funkce je index bodu z origin´aln´ı geo- metrie. Tato funkce dohled´a, zda stejn´y bod jiˇz nebyl pouˇzit s jin´ym indexem a pokud ano, vrac´ı jiˇz pouˇzity index. Tato funkce je d˚uleˇzit´a k odstranˇen´ı vzniku faleˇsn´ych hran.

(36)

Proveden´ı Popis pouˇzit´ych tˇr´ıd

insertForTest – vloˇzen´ı hrany do seznamu, podle kter´eho bude ovˇeˇrena viditelnost hrany vych´azej´ıc´ıho z vrcholu.

intersect – vypoˇcte zd´anliv´y pr˚useˇc´ık dvou hran a rozhodne, kter´a leˇz´ı v popˇred´ı a kter´a v pozad´ı.

6.2.3 Tˇ r´ıda DrawingGeometry

Objekty t´eto tˇr´ıdy koresponduj´ı s uzly s geometri´ı vybran´e sc´eny. Obsahuje funkce pro nalezen´ı obrysov´ych hran a jejich n´asledn´e poskl´ad´an´ı do lomen´ych ˇ

car, ˇreˇsen´ı viditelnosti, a vykreslen´ı hran do zvolen´e geometrie.

D˚uleˇzit´e funkce tˇr´ıdy:

DrawingGeometry – konstruktor tˇr´ıdy. Inicializuje tˇr´ıdn´ı promˇenn´e.

drawLineStrings – funkce pˇrenese nalezen´e lomen´e ˇcary popisuj´ıc´ı obrysov´e hrany do geometri´ı slouˇz´ıc´ıch pro viditeln´e a neviditeln´e hrany, ˇc´ımˇz zajist´ı jejich vykreslen´ı.

constructLineStrings – funkce zajist´ı nalezen´ı vˇsech obrysov´ych hran mo- delu v z´avislosti na parametrech kamery, jejich poskl´ad´an´ı do lomen´ych ˇ

car a urˇcen´ı jejich viditelnosti.

getGeometryName – vrac´ı jm´eno uzlu geometrie, pro kterou dan´y objekt vznikl.

getVertices – vrac´ı seznam vˇsech bod˚u pouˇzit´ych v popisu obrysov´ych hran.

getLineString – funkce vrac´ı ukazatel na seznam lomen´ych ˇcar.

prepareEdges – rozdˇelen´ı seznamu hran na skuteˇcn´e a potencion´alnˇe obry- sov´e na z´akladˇe toho, zda je k hranˇe pˇrilehl´y jeden nebo dva troj´uhel- n´ıky.

constructLineString – sestroj´ı lomenou ˇc´aru z obrysov´ych hran. Lomen´a ˇ

c´ara je spojnice mezi body, ze kter´ych vede jedna nebo tˇri a v´ıce hran.

getSecondVertexFromEdge – funkce vrac´ı druh´y bod hrany.

clearLineString – maˇze seznam lomen´ych ˇcar a uvoln´ı jimi alokovanou pamˇet’.

(37)

Proveden´ı Popis pouˇzit´ych tˇr´ıd

6.2.4 Tˇ r´ıda PostScriptTools

Tato tˇr´ıda obsahuje funkce slouˇz´ıc´ı k sestaven´ı PostScript–ov´eho souboru ze seznamu hran, jeho z´apis na disk, a tak´e funkce pro v´ypoˇcet spr´avn´eho um´ıstˇen´ı modelu na str´anku.

D˚uleˇzit´e funkce tˇr´ıdy:

PostScriptTools – konstruktor tˇr´ıdy. Prob´ıh´a zde inicializace parametr˚u str´anky.

fileOpen – otevˇre soubor, do kter´eho bude prob´ıhat z´apis.

fileClose – zavˇre otevˇren´y soubor.

setBound – funkce slouˇz´ı pro nastaven´ı mezn´ıch hodnot, kter´ych nab´yvaj´ı lomen´e ˇc´ary. Tato informace je pouˇzita pro v´ypoˇcet mˇeˇr´ıtka pro vloˇzen´ı pohledu na st´anku.

begin – zap´ıˇse do souboru definice pˇr´ıkaz˚u a nastaven´ı str´anky.

end – zap´ıˇse do souboru pˇr´ıkaz pro zobrazen´ı str´anky.

solidLines – zap´ıˇse do souboru informaci o tom, ˇze n´asleduj´ıc´ı popis lome- n´ych ˇcar se bude t´ykat viditeln´ych hran.

hiddenLines – zap´ıˇse do souboru informaci o tom, ˇze n´asleduj´ıc´ı popis lo- men´ych ˇcar se bude t´ykat skryt´ych hran.

writeLineStrings – zap´ıˇse do souboru vˇsechny lomen´e ˇc´ary vyhovuj´ıc´ı dan´e podm´ınce viditelnosti.

writeGeometryName – zap´ıˇse do souboru pozn´amku o n´azvu uzlu geometry, ze kter´e n´asleduj´ıc´ı popis lomen´ych ˇcar vznikl.

exportGeometry – zajist´ı vyps´an´ı pozn´amky o n´azvu uzlu geometrie a n´a- sledn´y z´apis popisu lomen´ych ˇcar do otevˇren´eho souboru.

write – zap´ıˇse pˇr´ısluˇsnou informaci do souboru.

calcScale – v´ypoˇcet mˇeˇr´ıtka podle mezn´ıch hodnot lomen´ych ˇcar pro vlo- ˇ

zen´ı pohledu na st´anku.

(38)

Proveden´ı Popis exportovan´eho souboru

6.2.5 Tˇ r´ıda VertexHashMap

Tuto tˇr´ıdu bylo potˇreba implementovat kv˚uli vzniku faleˇsn´ych hran na nˇe- kter´ych modelech. Jedn´a se o haˇsovac´ı tabulku slouˇz´ıc´ı k nalezen´ı shodn´ych bod˚u geometrie.

D˚uleˇzit´e funkce tˇr´ıdy:

VertexHashMap – konstruktor tˇr´ıdy. Jako vstupn´ı parametr m´a poˇcet bod˚u, pro kter´e je haˇsovac´ı tabulka urˇcena.

insert – funkce pro vloˇzen´ı dan´eho bodu.

find – slouˇz´ı pro zjiˇstˇen´ı, zda jiˇz dan´y bod existuje, a pokud ano, poskytne jeho index.

clear – smaz´an´ı vˇsech prvk˚u haˇsovac´ı tabulky a uvolnˇen´ı alokovan´e pamˇeti.

hash – haˇsovac´ı funkce.

6.3 Popis exportovan´ eho souboru

Exportovan´y soubor s popisem obrysov´ych hran je ve form´atu PostScript.

Tento soubor m˚uˇzeme rozdˇelit na dvˇe ˇc´asti – na definice pˇr´ıkaz˚u a na data s popisem exportovan´ych hran. Definice se nach´azej´ı na zaˇc´atku souboru a jejich funkce je:

/ps Velikost str´anky – horizont´aln´ı a vertik´aln´ı rozmˇer str´anky. V definici je pouˇzit pˇr´ıkaz mm, slouˇz´ıc´ı pro pˇrevod mililitr˚u na topologick´e body, kter´e se pouˇz´ıvaj´ı jako d´elkov´a jednotka v PostScriptu.

/sl Styl obrysov´ych hran – zde je definov´ano, jak´y styl ˇc´ary se pouˇzije pro vykreslen´ı obrysov´ych hran.

/hl Styl skryt´ych hran – je zde definov´ano, jak´y styl ˇc´ary se pouˇzije pro vykreslen´ı skryt´ych hran.

/m, /l, /s, /e Pˇr´ıkazy pro tvorbu cesty – tyto pˇr´ıkazy jsou pouˇzity v datov´e ˇc´asti pro popis exportovan´ych hran (viz n´ıˇze).

(39)

Proveden´ı Popis exportovan´eho souboru

/mm Pˇrevodn´ı pˇr´ıkaz – pˇrevod mililitr˚u na topologick´e body, kter´e se po- uˇz´ıvaj´ı jako d´elkov´a jednotka v PostScriptu.

/rs Pˇrepoˇcet styl˚u ˇcar – pˇr´ıkaz slouˇz´ıc´ı po pˇrepoˇcet styl˚u ˇcar na jednotn´y form´at, aby nebyly z´avisl´e na zvolen´em mˇeˇr´ıtku.

/iv Nastaven´ı pohledu – nastav´ı pohled s definovan´ym mˇeˇr´ıtkem na spe- cifikovan´e souˇradnice.

/cv Oˇr´ıznut´ı pohledu – oˇr´ızne pohled urˇcen´y lev´ym horn´ım a prav´ym spodn´ım rohem.

Za definicemi n´asleduje sada pˇr´ıkaz˚u pro nastaven´ı str´anky (zde je vol´an pˇr´ıkaz ps pro nastaven´ı velikosti str´anky), nastaven´ı pohledu (do z´asobn´ıku je vloˇzeno mˇeˇr´ıtko a x-ov´a a y-ov´a souˇradnice, kter´a se bude kr´yt s bodem [0, 0] exportovan´ych dat, a pot´e je zavol´an pˇr´ıkaz iv) a oˇr´ıznut´ı pohledu (do z´asobn´ıku se uloˇz´ı x-ov´a a y-ov´a souˇradnice lev´eho horn´ıho a prav´eho spodn´ıho rohu, pot´e se zavol´a pˇr´ıkaz cv).

V pˇr´ıpadˇe, ˇze exportujeme i skryt´e hrany, bude v datov´e ˇc´asti po sobˇe n´asledovat popis skryt´ych hran a pot´e popis hran viditeln´ych. Kaˇzd´a z tˇechto ˇ

c´ast´ı je uvozena pˇr´ıkazy pro styl ˇc´ary a jeho n´asledn´ym pˇrepoˇctem (pro skryt´e hrany hl rs, pro viditeln´e hrany sl rs).

Po tˇechto pˇr´ıkazech n´asleduje popis hran ve formˇe lomen´ych ˇcar. Do z´a- sobn´ıku je vˇzdy uloˇzena x-ov´a a y-ov´a souˇradnice bodu n´asledov´ana jedn´ım z pˇr´ıkaz˚u:

/s Prvn´ı bod lomen´e ˇc´ary – pomoc´ı pˇr´ıkaz˚u newpath a moveto zaˇcne cestu a nastav´ı poˇc´ateˇcn´ı souˇradnice lomen´e ˇc´ary.

/l Pr˚ubˇeˇzn´y bod lomen´e ˇc´ary – vykon´an´ım pˇr´ıkazulinetopˇripoj´ı dalˇs´ı

´

useˇcku k cestˇe.

/e Koneˇcn´y bod lomen´e ˇc´ary – pˇr´ıkazemlinetopˇripoj´ı k cestˇe posledn´ı

´

useˇcku a pˇr´ıkazemstroke zajist´ı vykreslen´ı aktu´aln´ı cesty.

Na samotn´em konci souboru se nach´az´ı pˇr´ıkazshowpage, pomoc´ı kter´eho se pˇripraven´a str´anka vykresl´ı.

(40)

7 Experimenty

7.1 Rychlost zobrazen´ı n´ ahledu

Cas, kter´ˇ y zabere pˇrepoˇcet nov´eho pohledu, je z´avisl´ı na poˇctu hran modelu.

V tabulce 7.1 uv´ad´ım v´ysledky m´eho testov´an´ı, kter´ych bylo dosaˇzeno na pˇre- nosn´em poˇc´ıtaˇci s dvouj´adrov´ym procesorem Intelc CoreTM2 Duo, operaˇcn´ı pamˇet´ı 4GB, grafickou kartou ATI Mobility Radeon HD 3650 a 64bitov´ym operaˇcn´ım syst´emem.

Model Poˇcet hran Cas [ms]ˇ

test.fhs 90 1

FabiaRS.fhs 3 628 5

FabiaEXT 0.05.fhs 1 240 185 330 Tabulka 7.1: ˇCas potˇrebn´y k pˇrepoˇctu nov´eho pohledu

Rychlost posouv´an´ı a nat´aˇcen´ı modelu vˇsak t´ımto ˇcasem nejsou nikterak omezeny, jen u modeluFabiaEXT_0.05.fhsnedojde ke korektn´ımu zobrazen´ı obrysov´ych hran ihned po tˇechto ´ukonech.

Po t´e, co jsem s modulem v r´amci testov´an´ı pracoval, si mysl´ım, ˇze tato rychlost pro interaktivn´ı pr´aci s modely postaˇcuje. Pokud by vˇsak ˇcas pˇre- poˇctu nov´eho pohledu pˇrestal dostaˇcovat, popˇr´ıpadˇe by se pracovalo s jeˇstˇe sloˇzitˇejˇs´ımi modely, existuj´ı metody, jak pr´aci modulu urychlit. Nyn´ı pˇrepoˇcet hran pˇri zmˇenˇe pohledu bˇeˇz´ı pouze v jednom vl´aknˇe, a tak by bylo moˇzn´e dos´ahnout vyˇsˇs´ı rychlosti rozloˇzen´ım ˇcasu na v´ıce jader procesoru pomoc´ı bˇehu v´ypoˇct˚u v nˇekolika paraleln´ıch vl´aknech.

7.2 Kvalita v´ ystupu

Na modelu krychle (Obr´azek 7.1) jsou korektnˇe zobrazeny vˇsechny hrany a je zde t´eˇz korektnˇe vyˇreˇsena jejich viditelnost. K ˇreˇsen´ı viditelnosti hran kon- vexn´ıho tˇelesa dostaˇcuje pouze v´ypoˇcet koeficient˚u zakryt´ı v roz´ıch objektu.

Tak´e na modelu test.fhs (Obr´azek 7.2) jsou vˇsechny nalezen´e hrany v poˇr´adku. Jejich viditelnost je spr´avnˇe vyˇreˇsena pouze v r´amci jednotliv´ych

(41)

Experimenty Kvalita v´ystupu

model˚u krychle, ale ne v r´amci cel´e sestavy. Nyn´ı je implementov´ana ˇc´ast Appelova algoritmu, kter´a zaruˇc´ı korektn´ı zobrazen´ı viditeln´ych hran pouze v r´amci jednotliv´ych konvexn´ıch objekt˚u. Pro rozˇs´ıˇren´ı na nekonvexn´ı objekty a jejich sestavy by bylo potˇreba doimplementovat ˇc´ast algoritmu ˇreˇs´ıc´ı pr˚u- seˇc´ıky jednotliv´ych lomen´ych ˇcar a jejich dˇelen´ı na menˇs´ı ´useky, ve kter´ych je koeficient zakryt´ı konstantn´ı (viz sekce 5.5 na stranˇe 22).

Na obr´azku 7.3 jsou vidˇet nalezen´e obrysov´e hrany modeluFabiaRS.fhs.

I zde se zdaj´ı b´yt vˇsechny nalezen´e hrany opravdu tˇemi obrysov´ymi. Chyby ve viditelnosti se zde vˇsak uˇz projevuj´ı jak na ´urovni jednotliv´ych geometri´ı, tak v r´amci cel´e sestavy. I zde je d˚uvodem ne´upln´a implementace algoritmu ˇreˇs´ıc´ıho viditelnost nalezen´ych hran.

Model FabiaEXT_0.05.fhs (Obr´azek 7.4) byl nejsloˇzitˇejˇs´ım z tˇech, na kter´ych byl modul testov´an. Obrysov´e hrany se hledaly ve v´ıce jak mili´onu vˇsech hran tohoto modelu. Probl´emy s viditelnost´ı se zde vyskytuj´ı obdobn´e jako v pˇr´ıpadˇe modelu FabiaRS.fhs. Pˇridaly se k nim vˇsak i probl´emy s na- lezen´ymi obrysov´ymi hranami, kter´e jsou uk´az´any na detailu kliky pˇredn´ıch dveˇr´ı (Obr´azek 7.5).

Jeden z probl´em˚u je viditeln´y na v´ylisku v modelu dveˇr´ı, kde se zlom opticky jev´ı jako hrana, ale ve skuteˇcnosti je zde mal´y pˇrechodov´y r´adius, na kter´em se v definici geometrie ˇz´adn´a hrana nevyskytuje.

Druh´ym probl´emem jsou kr´atk´e hrany, kter´e proch´azej´ı napˇr´ıˇc zaoble- n´ymi hranami kliky. V tˇechto m´ıstech opticky ˇz´adn´e hrany nejsou viditeln´e, ale v definici geometry se zde vyskytuj´ı mal´e odchylky norm´al. D´ıky tˇemto odchylk´am nen´ı moˇzn´e sjednotit bod sousedn´ıch troj´uheln´ık˚u, a algoritmus v tomto m´ıstˇe detekuje hranu.

(42)

Experimenty Kvalita v´ystupu

Obr´azek 7.1: Model krychle

(43)

Experimenty Kvalita v´ystupu

Obr´azek 7.2: Model test.fhs

(44)

Experimenty Kvalita v´ystupu

Obr´azek 7.3: Model FabiaRS.fhs

(45)

Experimenty Kvalita v´ystupu

Obr´azek 7.4: Model FabiaEXT_0.05.fhs

(46)

Experimenty Kvalita v´ystupu

Obr´azek 7.5: Detail kliky pˇredn´ıch dveˇr´ı modeluFabiaEXT_0.05.fhs

(47)

8 Z´ avˇ er

C´ılem pr´ace bylo vytvoˇrit modul do aplikace VRUT, kter´y um´ı zobrazit a vy- exportovat obrysov´e hrany nahran´eho modelu. Pˇri pr´ace jsem se pot´ykal s nevyhovuj´ıc´ı a velmi struˇcnou dokumentac´ı aplikace, a vˇetˇsinu d˚uleˇzit´ych informac´ı pro tvorbu nov´ych modul˚u a pr´aci se sc´enou a geometri´ı jsem musel dohledat pˇr´ımo ve zdrojov´ych k´odech j´adra a jiˇz existuj´ıc´ıch modul˚u. Vzhle- dem k tˇemto fakt˚um povaˇzuji pr´aci za ´uspˇeˇsnou, i kdyˇz se mi nepodaˇrilo naimplementovat vˇsechny funkce, kter´e jsem mˇel v ´umyslu.

Proto by jeˇstˇe bylo dobr´e u modulu doˇreˇsit korektn´ı v´ypoˇcet koeficient˚u zakryt´ı v Appelovˇe algoritmu pouˇzit´em pro ˇreˇsen´ı viditelnosti hran, omezit pˇrepoˇcet a generov´an´ı obrysov´ych hran jen na ty geometrie, kter´e se nach´a- zej´ı v pohledov´em jehlanu, a umoˇznit generov´an´ı ´upln´ych a ˇc´asteˇcn´ych ˇrez˚u pomoc´ı oˇrez´av´an´ı hran pomoc´ı mnoˇziny ploch.

Reˇsen´ı, kter´ˇ e bylo pouˇzito pro odstranˇen´ı v´ıcen´asobn´ych bod˚u pˇri ˇreˇsen´ı probl´emu faleˇsn´ych hran, by podle m´eho n´azoru bylo dobr´e pouˇz´ıt i v jin´ych modulech. Pˇri naˇc´ıt´an´ı modelu by tento jednoduch´y mechanizmus sn´ıˇzil ob- sazenou pamˇet’ a pˇri ukl´ad´an´ı by zase omezil velikost souboru obsahuj´ıc´ıho popis geometrie.

C´ılem pr´ace bylo tak´e zobrazovat nalezen´e obrysy a to pokud moˇzno v re´aln´em ˇcase. I tohoto bodu se podaˇrilo dos´ahnout a detekce hran bˇeˇz´ı na standardn´ım HW v interaktivn´ı rychlosti (pˇrepoˇcet hran nejsloˇzitˇejˇs´ıho testovan´eho modelu trv´a zhruba 1/3 sekundy).

(48)

Literatura

[Ado(1985)] Postscript language tutorial and cookbook.

Adobe Systems Incorporated, 1985. Dostupn´e z:

www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF.

[Ado(1999)] PostScript language reference manual. Adobe Systems Incorporated, 3 edition, 1999. Dostupn´e z:

http://www.adobe.com/products/postscript/pdfs/PLRM.pdf.

[Appel(1967)] ARTHUR APPEL The notion of quantitative invisibility and the machine rendering of solid. New York : AMC Inc., 1967.

[Jiˇr´ı ˇZ´ara(2010)] JI ˇR´I Z ´ˇARA, BED ˇRICH BENEˇS, JI ˇR´I SOCHOR, PETR FELKEL Modern´ı poˇc´ıtaˇcov´a grafika. Holandsk´a 8, 639 00 Brno : Computer Press, a.s., 2010. ISBN 80-251-0454-0.

[Kevin Weiler(1977)] KEVIN WEILER, PETER ATHERTON Hidden sur- face removal using polygon area sorting. 1977.

[Tiˇsnovsk´y(2006)] PAVEL TIˇSNOVSK ´Y Seri´al Grafick´e form´aty. Internet Info, s.r.o, 2006. Dostupn´e z:

http://www.root.cz/serialy/graficke-formaty/.

[Ska(2009)] V´ACLAV SKALA, JAN HR ´ADEK, MARTIN KUCHA ˇR Hash Function for Trianglular Mesh Reconstruction. In Recent Advances in Computers, s. 233–238, Ath´eny, 2009. WSEAS Press. ISBN 978-960- 474-099-4.

[V´aclav Kyba(2010)] V´ACLAV KYBA, ANTON´IN M´IˇSEK a dalˇs´ı Doku- mentace aplikace VRUT, 2010.

(49)

Seznam obr´ azk˚ u

2.1 Ob´alky zobrazen´e ve sc´enˇe . . . 5

2.2 Pro jednu geometrii je pouˇzito r˚uzn´ych materi´al˚u . . . 7

3.1 Urˇcen´ı, zda se jedn´a o obrysovou hranu . . . 11

3.2 Zmˇena koeficient zakryt´ı v pr˚useˇc´ıc´ıch hran . . . 12

3.3 Zp˚usob oˇrez´av´an´ı ploch . . . 13

5.1 Pˇrehled interpretac´ı geometrie VRUTu . . . 20

5.2 Sestaven´ı lomen´ych ˇcar . . . 22

5.3 V´ypoˇcet koeficientu zakryt´ı v roz´ıch geometrie . . . 23

5.4 Rozdˇelen´ı hran na element´arn´ı ´useky s nemˇennou viditelnost´ı . 24 5.5 U lomen´e ˇcary se tak´e ukl´ad´a informace o pˇrilehl´ych troj´uhel- n´ıc´ıch . . . 24

5.6 Model s faleˇsn´ymi hranami a ten sam´y po jejich odstranˇen´ı . . 25

6.1 Uˇzivatelsk´e rozhran´ı modulu . . . 28

7.1 Model krychle . . . 37

7.2 Model test.fhs . . . 38

(50)

SEZNAM OBR ´AZK˚U SEZNAM OBR ´AZK˚U 7.3 Model FabiaRS.fhs . . . 39 7.4 Model FabiaEXT_0.05.fhs . . . 40 7.5 Detail kliky pˇredn´ıch dveˇr´ı modelu FabiaEXT_0.05.fhs . . . . 41

(51)

Seznam tabulek

7.1 Cas potˇrebn´ˇ y k pˇrepoˇctu nov´eho pohledu . . . 35

Odkazy

Související dokumenty

Pˇredmˇ etem t´ eto bakal´ aˇrsk´ e pr´ ace je odvozen´ı diferenci´ aln´ıch rovnic obecn´ e teorie relativity vhodn´ ych pro jejich numerick´ e ˇreˇsen´ı.

– .\Identifikace: Adres´aˇr obsahuje funkce a skripty, kter´e slouˇz´ı k identifikaci parametr˚ u modelu m´ıstnosti pomoc´ı metody nejmenˇs´ıch ˇctverc˚ u a tak´e

Druh´ a kapitola obsahuje pˇrehled vyuˇ zit´ı L-syst´ em˚ u a tˇret´ı kapitola je vˇ enov´ ana programu, kter´ y je souˇ c´ ast´ı bakal´ aˇrsk´ e pr´ ace, jeho popisu a

Pˇri modelov´an´ı pomoc´ı L-syst´em˚ u vyvstanou dalˇs´ı poˇzadavky, kter´e by pˇrinesly praktick´e v´ yhody, at’ uˇz v podobˇe snadnˇejˇs´ı a intuitivnˇejˇs´ı

C´ılem bakal´aˇrsk´e pr´ace je n´avrh elektroniky rozhran´ı modulu iNemo M1, kter´e umoˇzn´ı pˇrenos zmˇeˇren´ ych dat do poˇc´ıtaˇce pomoc´ı vhodn´e

N´ azev pr´ ace: Konstrukˇ cn´ı n´ avrh vinut´ e ˇsnekov´ e pˇrevodovky Jm´ eno autora: Tom´ aˇs Jansa.. Typ pr´ ace: Bakal´

Vˇsechny obdrˇzen´e ´ukoly se daj´ı rozdˇelit do tˇr´ı z´akladn´ıch skupin, kter´e odpov´ıdaj´ı urˇcit ´ym v ´yvojov ´ym obdob´ım, kter ´ymi jsem v pr

Pˇri vytv´aˇren´ı nov´e ˇsablony jsou zahrnuty vˇsechny objekty, kter´e jsou uloˇzeny v t´eto tabulce a jsou oznaˇceny k zahrnut´ı do ˇsablony.. • Tabulka Migration