Základ D grafik Výukové tet Ing Miroslav Fribert Dr.
Obsah. Prostorová geometrie ákladní vtah. Křivk. Ploch 4. D modelování a repreentace těles 5. Geometrické transformace 6. Zobraování prostorových dat
. Geometrie v prostoru - ákladní vtah V této kapitole opakujeme ákladní pojm analtické geometrie v prostoru. Jedná se o problematiku probíranou v předmětu matematika, proto bude uveden poue přehled ákladních vtahů, které jsou důležité hlediska pochopení principů vtváření D grafik.. Vektor V prai se často setkáváme s veličinami, které mají velikost a orientovaný směr rchlost, síla). Takové veličin naýváme vektor a obraujeme je pomocí orientovaných úseček s počátečním a koncovým bodem. Roenáváme volné a váané vektor. Volný vektor je umístěn v libovolném místě prostoru, váaný vektor je spojen s nějakým konkrétním bodem počátek souřadnic, střed tělesa apod. Obr.. Váaný vektor Jestliže umístíme počáteční bod váaného vektoru do počátku souřadnic, je tak určen polohový vektor. Polohový vektor je váaný vektor a určuje bod v prostoru P. Počátečním bodem polohového vektoru je ted počátek souřadnic a koncovým je bod P. Vektor načíme růnými působ. M budeme používat OP, nebo a r, nebo a - tučným písmenem be šipk. Pro souřadnicové vjádření polohového vektoru platí r i j k r kde,, jsou složk vektoru, i, j, k jednotkové vektor ve směru os souřadné soustav. Velikost polohového vektoru r Průmět vektoru a do souřadných os složk vektoru) a cosα a cos β a cosγ kde α, β, γ jsou úhl, které svírá vektor a se souřadnými osami.
Pro jednotkový vektor jsou velikosti jeho složk cosα, cosβ, cosγ protože velikost složk jednotkového vektoru je. Součet a rodíl dvou vektorů a b a b Součet vektorů a rodíl vektorů definujeme jako úhlopříčk rovnoběžníka, který vnikne, kdž počátk vektorů umístíme do společného bodu a oba vektor považujeme a dvě stran tohoto rovnoběžníka. Obr.. Součet a rodíl dvou vektorů Pro souřadnicové vjádření platí vtah ± a b ) i ) j ) k ± ± ± V souřadnicovém vjádření bude mít vpočítaný rodílový vektor počáteční bod ve společném bodě vektorů a, b. Nebude ted úhlopříčkou uvedeného rovnoběžníka, ale bude mít stejnou velikost i směr. Násobení vektoru skalárem Součin vektoru a a skaláru λ je vektor λ a, jehož absolutní hodnota je λ násobkem absolutní hodnot a a směr je pro kladné λ souhlasný se směrem a a pro áporné λ opačný. V souřadnicovém vjádření a i j k λ λ λ γ Skalární součin dvou vektorů je skalár daný vtahem a b a b cosϕ kde φ je úhel, který oba vektor svírají. V souřadnicovém vjádření a b Vektorový součin dvou vektorů je vektor kolmý na směr obou vektorů, orientace je dána kladně orientovaným trojhranem a jeho absolutní hodnota je dána vtahem a b a b sinϕ kde φ je úhel, který oba vektor svírají. V souřadnicovém vjádření s použitím determinantu i j k a b Po včíslení determinantu pomocí Hornerova schematu i j a b ) ) ) k 4
. Prostorová křivka Vektorová rovnice parametrického vjádření křivk je vektorová funkce skalárního argumentu. Pro polohový vektor parametrické křivk můžeme psát r i j k t φ χ ψ a;b kde t je parametr skalární argument funkce). Roepsáním do složek dostaneme skalární tvar parametrické rovnice křivk φ χ ψ Funkce φ, χ, ψ jsou obecně nelineární, pro přímku jsou potom lineárními funkcemi argumentu t. Příklad. Parametrické rovnice φ sin t, χ cos t, ψ t pro t <, π > určují spirálovou křivku podle následujícího obráku. Obr.. Graf prostorové křivk Zvláštním případem křivk je přímka. Parametrická vektorová rovnice přímk určené dvěma bod A [a,a,a ], B [b,b,b ] r a t b - a kde a je polohový vektor bodu přímk v bodě A, b je vektor bodu přímk v bodě B do, r je polohový vektor obecného bodu P přímk, t je skalární parametr v intervalu -, ). ) Obr..4 Vektorové vjádření přímk 5
Roepsáním do složek dostaneme skalární tvar parametrické rovnice přímk a a a t b t b t b a ) a a Hodnot b a, b a, b a jsou směrovými koeficient této přímk. ) ) Derivace vektorové funkce Jestliže eistuje limita r li m r t t t r Potom má funkce r v bodě t derivaci vektorové funkce skalárního argumentu t rovnou této limitě. r i j k dϕ i dχ j dψ k ϕ χ ψ dt dt dt Derivace složek křivk φ, χ, ψ jsou směrovými koeficient tečn v bodě t. Příklad. r i j k Je dána křivka t t t. Vpočítejte rovnici tečn v bodě t a souřadnice jejího průsečíku v rovinou. Velikosti složek bodu křivk v bodě t určíme vektorové rovnice křivk. Potom a, a, a. r i j k Derivace rovnice křivk je t t. Směrové koeficient v bodě t jsou b a, b a, b a. Parametrický tvar rovnice tečn určíme e skalárního tvaru rovnice přímk. Potom v bodě t je t, t, t. Z poslední rovnice pro je t -/. Dosaením do a jsou souřadnice průsečíku [/, /, -/]. Průvodní trojhran prostorové křivk Je dána prostorová křivka a na ní libovolně volený bod s parametrem t. Průvodním trojhranem křivk v bodě t roumíme tečnu t v toto bodě, která je dána první derivací křivk v bodě t, normálu n, která je kolmá na tečnu a je dána druhou derivací křivk v bodě t a binormálu b, která je kolmá na tečnu a normálu. Binormálu můžeme vpočítat jako vektorový součin tečn a normál. Oskulační rovina τ je pak rovina, která je určena tečnou a normálou, normálová rovina ν normálou a a binormálou a rektifikační rovina µ tečnou a binormálou. Všechn tři rovin jsou na sebe kolmé. 6
Obr..5 Průvodní trojhran prostorové křivk Pomocí vájemného natočení oskulačních rovin při měně parametru t se definuje tv. druhá křivost křivk krut. dβ c ds kde dβ je úhel natočení a ds je délka oblouku při měně parametru o dt.. Plocha v prostoru Vektorová rovnice ploch je vektorová funkce dvou skalárních argumentů. Pro polohový vektor r ploch můžeme psát r u, u, i u, j u, k u,v φ χ ψ a;b v) v) Roepsáním do složek dostaneme skalární tvar parametrické rovnice ploch φ u, v) χ u, v) ψ u, v) v) Funkce φu,v), χu,v), ψu,v) jsou obecně nelineární, pro rovinu jsou to potom lineární funkce argumentů u,v. Parametrické rovnice u.5v, v, - u definují kvadratickou plochu podle následujícího obráku.6. v) Obr..6 Graf prostorové ploch Zvláštním případem prostorové ploch je rovina. V tom případě jsou funkce parametrů u,v lineární. 7
Příklad. Parametrické rovnice u.5v, v, v-5u definují rovinu podle následujícího obráku. Obr..7 Rovina v prostoru Rovina v prostoru může být určena polohovým vektorem bodu, který v ní leží a normálovým vektorem, který je na ni kolmý, nebo dvěma protínajícími se přímkami, nebo třemi bod [a,a, a ], [b,b,b ], [c,c,c ], které neleží na přímce. Obr..8 Rovina určená bodem a normálovým vektorem Rovina je v prvním případě, který je nejobecnější a na který le n převést i ostatní, j k určena bodem P,, ) a normálovým vektorem je na rovinu kolmý) a b c. Onačíme r polohový vektor libovolného bodu P,,) rovin. Vektorový tvar normálové rovnice rovin vplývá e skalárního součinu kolmých vektorů a je ted r - r n ) kde r je polohový vektor definičního bodu P a r je polohový vektor libovolného bodu P rovin. 8
Po roepsání do složek dostaneme r - r ) r - r ) ) i ) j ) k n a ) b ) c ) Potom skalární tvar normálového tvaru rovin a ) b ) c ) Po vnásobení a sloučení dostaneme obecný tvar rovnice rovin kde a b c d r n d a b c. Příklad 4. n i j k Napište rovnici rovin určené bodem P -,5,-) a kolmé na vektor 4. Vjdeme rovnice ) 5) 4 ) rovin 4 5. Vpočítáme pro kontrolu parametr d ) 5 4 ) 5 d D graf této rovin vkreslený v Matlabu. Po úpravě je výsledná rovnice této Obr..9 Graf rovin příkladu 4 Ještě uvedeme rovnici rovin danou třemi bod P, P, P, které neleží na přímce. Častým prvkem používaným v počítačové grafice jsou totiž trojúhelníkové plošk, které aproimují hraniční ploch nebo isoploch těles. Plošk jsou adán svými vrchol. 9
Obr.. Rovina určená třemi bod Normálový vektor m určíme jako vektorový součin kterýchkoli dvou vektorů určených definičními bod obr..), např. jako vektorový součin vektorů P P a P P. Pomocí normálového vektoru m a bodu P rovin můžeme rovnici této rovin napsat například ve tvaru P P P P m ) m r r kde r je polohový vektor proměnného bodu rovin, r je polohový vektor bodu P. Po roepsání do složek a vjádřením pomocí determinantu je rovnice rovin určené třemi bod ve tvaru kde,, jsou souřadnice bodu P,,, souřadnice bodu P a,, souřadnice bodu P. Příklad 5. Vpočítejte normálový vektor a rovnici rovin proložené bod P -,, ), P,, -) a P,, -). Normálový vektor hledané rovin je vektor k j i k j i k j i m 6 9 4 PP P P Potom rovnici rovin vpočítáme e skalární rovnice rovin určené bodem P a normálovým vektorem m, nebo přímo předchoího determinantu. 7 ) 6 ) ) 9.4 Promítání na rovinu V D počítačové grafice je problémem obraování těles na D obraovacích aříeních. Jednou metod je promítání jednotlivých bodů tělesa na rovinu. Touto problematikou se abývá deskriptivní geometrie. Zobraovanému tvaru říkáme vor, odpovídající útvar vniklý obraením na rovině - průmětně, je jeho obra. V počítačové grafice se navíc při
tomto promítání řeší viditelnost jednotlivých částí tělesa, stínování a další postup, které umožní poorovateli obrau vnímat i prostorové vlastnosti voru. Průmět velkých objektů staveb, velkých strojů, emského povrchu ) nele provést ve skutečné velikosti, a proto je menšujeme. V takovém případě mluvíme o měřítku plánu, map nebo výkresu. Naopak průmět malých objektů pro řetelnost výkresu většujeme. Nejpoužívanější druh promítání v počítačové grafice jsou středové a rovnoběžné promítání. Středové centrální) promítání. Zvolme libovolnou rovinu ρ obr..), kterou naýváme průmětna, a mimo ni bod S, vaný střed promítání. Středový čili centrální průmět bodu A je průsečík A s spojnice SA s průmětnou. Této spojnici říkáme promítací přímka nebo též promítací paprsek.orientovaná polopřímka). Je-li obraovaný bod A v témže poloprostoru jako střed promítání S, považujeme jeho vdálenost od průmětn a ápornou, v opačném poloprostoru a kladnou např. bod B). Bod C, ležící v průmětně, je totožný se svým průmětem C s. Bod totožný se středem promítání nemá středový průmět. Obr... Středový a kosoúhlý průmět bodu Obra vniklý středovým promítáním odpovídá přibližně dojmu, jaký bchom měli, kdbchom obraovaný objekt poorovali jedním okem e středu promítání. Téměř přesným středovým průmětem je fotografický snímek. Rovnoběžné paralelní) promítání. Stane-li se střed promítání S nevlastním bodem S je umístěn v nekonečnu) vniká rovnoběžné promítání. Promítací přímk jsou vájemně rovnoběžné a svírají s průmětnou úhel ρ úhel ϕ obr..). Průmět bodů tělesa jsou průsečík promítacích přímek, které jimi vedeme rovnoběžně se směrem promítání s průmětnou. Rovnoběžné promítání dělíme na: Kosoúhlé promítání je rovnoběžné promítání, kde < ϕ < 9. Na obráku.8 jsou obraen kosoúhlé průmět A k, B k obecně položených bodů A, B a bodu C ležícího v průmětně. Pravoúhlé čili ortogonální promítání vnikne, kdž směr promítání je k průmětně kolmý ϕ 9 ). Pak ted pravoúhlé průmět bodů A, B obr..) v prostoru jsou pat A, B kolmic vedených těchto bodů k průmětně.
Obr... Pravoúhlý průmět bodu Ve všech uvedených případech můžeme volit polohu průmětn v prostoru libovolně. V pravoúhlém promítání na jednu průmětnu bývá vkem volit ji vodorovně a pak jí říkáme půdorsna a průmět tělesa jako půdors. Vdálenosti těch bodů od půdorsn, které leží v poloprostoru nad považujeme a kladné, v dolním poloprostoru je považujeme a áporné. V technické prai je obvklé pravoúhlé promítání těles na více průmětných rovin, obvkle tři. Potom se volí směr pohledů kolmé a průmětn se naývají nársna a bokorsna. Na obr.. jsou náorněn všechn možné směr kolmých pohledů na těleso. Obr.. Směr pohledů na těleso při půdorsu ), nársu ), bokorsu ), pohledu dola 4), pohledu eadu 5), pohledu prava 6) Dojem vniklý při pohledu na rovnoběžný průmět objektu je podobný tomu, jako bchom těleso poorovali ve směru promítání velké vdálenosti. Dodejme, že náš osobní prostorový dojem vnějšího světa vniká v moku po složitém přenosu obraů vniklých středovým průmětem na sítnicích obou očí, které jsou přibližně kulového tvaru. Je ještě mnoho dalších obraení těles na rovinu, uveďme některá nich. Dvojstředové bicentrální) promítání vniká promítáním e dvou růných středů do téže rovin. Toto promítání je ákladem stereoskopického vidění, kde ískáváme plastický prostorový dojem téměř takový, jaký máme při přímém poorování obraeného objektu oběma očima. S tímto promítáním se setkáváme v plastické fotografii, v plastickém filmu nebo v růných měřicích přístrojích. Válcové promítání čili clindrická projekce je promítání na rotační válcovou průmětnu, kterou pak rovineme do rovin.
Kuželové promítání čili kónická projekce je promítání na rotační kuželovou plochu, kterou pak rovineme do rovin. Těchto promítacích metod růně připůsobených se užívá v mediálních technologiích ke výšení prostorového nebo panoramatického dojmu..5 Knihovna OpenGL Knihovna OpenGL Open Graphics Librar) bla navržena firmou Silicon Graphics jako aplikační programové rohraní Application Programming Interface - API) ke grafickým subsstémům. OpenGL bla navržena s důraem na to, ab bla použitelná na růných tpech grafických akcelerátorů a ab ji blo možno použít i v případě, že na určité platformě žádný grafický akcelerátor není nainstalován - v tom případě se použije softwarová simulace. V současné době le knihovnu OpenGL použít na růných verích uniových sstémů včetně Linuu a IRIXu), OS/ a na platformách Microsoft Windows. Jako doplněk ke grafické knihovně OpenGL bla vtvořena knihovna OpenGL Utilit Toolkit - GLUT. Definuje a implementuje aplikační rohraní pro tvorbu oken a jednoduchého grafického uživatelského rohraní, přičemž je sstémově neávislá, tj. pro práci s okn se na všech sstémech používají vžd stejné funkce, které mají stejné parametr. Neávislost na operačním sstému i platformě jde dokonce tak daleko, že se ve všech funkcích knihovn GLUT používají poue ákladní datové tp jaka C/C. Kromě jaka C/C eistuje i rohraní pro použití ve Fortranu a Object Pascalu což je programovací jak, který tvoří áklad prostředí Delphi). Knihovna GLUT je v našem případě implementována do vývojového sstému Visual C 6.. Sntae funkcí deklarovaných v OpenGL Většina funkcí, které jsou v knihovně OpenGL deklarován, používá poměrně důmslnou sntai, kd je již e jména funkce řejmé, kolik parametrů je použito a jakého jsou tpu. Nejprve si uveďme příklad volání funkce demonstrační aplikace. glcolorf.f,.f,.f); Jméno každé funkce knihovn OpenGL ačíná prefiem předponou) gl. Podobnou vlastnost mají i funkce navaujících knihoven. Například všechn funkce knihovn GLU ačínají prefiem glu a u knihovn GLUT je použit prefi glut. Pokud chce tvůrce aplikace achovat čitelnost a sroumitelnost kódu, neměl b své vlastní funkce pojmenovávat se de uvedenými prefi. Za prefiem gl následuje tělo jména funkce, které většinou načí vtvářený předmět např. Verte-vrchol) nebo vlastnost, jež se mění např. Color-barva). Tělo jména funkce ačíná velkým písmenem, a pokud se skládá více slov, jsou počáteční písmena slov velká např. ClearColor). Ve funkcích nejsou použita podtržítka a neeistují dvě jména funkcí, která b se lišila poue ve velikosti písem, protože b to dělalo problém u programovacích jaků, které velikosti písma nerolišují, například Pascalu.
Za tělem jména funkce většinou následuje číslo, které načí počet parametů. Z uvedeného příkladu je ted řejmé, že funkce bude mít tři parametr. Pokud funkce nemá žádné parametr, žádné číslo se nepíše ted ani ). Na ávěr je jedním či dvěma nak uveden tp parametrů. U většin funkcí mají všechn parametr stejný tp, takže tp le specifikovat. Pokud má funkce více parametrů, nichž každý je odlišného tpu, tto nak se neuvádí. Některé funkce eistující ve více variantách umožňují místo skupin parametrů stejného tpu předat pole. Pro dosažení co nejsnaší přenositelnosti definuje knihovna OpenGL své vlastní datové tp, které se při volání funkcí OpenGL doporučuje upřednostňovat před primitivními datovými tp použitého programovacího jaka. Tto nové tp si uvedeme v následující tabulce i s příslušným suffiem příponou), který je použit při skládání jména funkce. Tabulka č. 449 suffi datový tp v jace C v OpenGL b 8-bit integer signed char GLbte s 6-bit integer short int nebo int GLshort i -bit integer int nebo long int GLint GLsiei f -bit float float GLfloat GLclampf d 64-bit float double GLdouble GLclampd ub 8-bit unsigned integer unsigned char GLubte GLboolean us 6-bit unsigned integer unsigned short/int GLushort ui -bit unsigned integer unsigned int/long GLuint GLenum GLbitfield Jak je předchoí tabulk patrné, je v OpenGL u každého datového tpu pevně definovaná bitová délka, což je rodíl oproti například jaku C, kde tp int může mít podle použité platform nebo překladače šířku 6, nebo 64 bitů. Většina deklarativních funkcí v OpenGL eistuje ve více verích, které se liší počtem a tpem parametrů, například: glcolorffloat, float, floa; glcolorbbte, bte, bte); glcolor4bbte, bte, bte, bte4); glverteiint, in; glverteddouble, double); 4
glverteffloat, float, floa; glverte4ffloat, float, float, float4); Dále jsou uveden jednoduchý demonstrační příklad programu s knihovnou GLUT. V příkladu poue otevřeme okno do kterého vkreslíme elený trojúhelník. Program reaguje na měnu velikosti okna a poloh okna. Aplikaci le ukončit stisknutím kláves ESC. Otevřeme prostředí Visual C a projekt troj.dsw. Postupně sledujeme jednotlivé příka a nakonec program spustíme a měníme vkreslovací okno. V kódu potom také měníme barvu okna a trojúhelníka a polohu jeho vrcholů. Vsvětlení funkcí a příkaů. Tělo programu je roděleno do několika funkcí, které jsou volán při výsktu určitých událostí funkce main). Funkce onresie) je avolána v případě, že se má měnit velikost okna aplikace. Tato funkce je také avolána ihned po vtvoření okna. Funkce ondispla) je avolána při každém požadavku na překreslení okna. Funkce onkeboard) se avolá, kdž uživatel stiskne některou klávesu generující ASCII kód. A poslední je funkce main). V tomto příkladu se aměříme na volání příkaů OpenGL, které jsou uvedené ve funkci ondispla). Příka glclearcolor.,.,.,.) specifikuje barvu, kterou se vmaže poadí okna. Zadávají se čtři barevné složk Red, Green, Blue a Alpha), nichž každá je v rosahu.-.. namená nulovou složku ve výsledné barvě,. maimální hodnotu). Příkaem glcleargl_color_buffer_bit) vmažeme určité bufer na grafické kartě více v dalších pokračováních seriálu). Zde se vmaže poue barvový bufer. Příkaem glcolorf.f,.f,.f) specifikujeme barvu pro další vkreslování ve formátu RGB. V tomto případě bla volena čistě elená barva. Příka glbegingl_triangles) ahájí vkreslování trojúhelníků, nichž každý je specifikován třemi vrchol. Tto vrchol se adávají příkaem glvertei), kterému předáme D souřadnice vrcholu trojúhelníka. Ukončení adávání vrcholů ajistí příka glend), který tvoří příkaové ávork spolu s glbegin). Tto příka ted vžd musí tvořit pár. Posledním příkaem je glflush), který ajistí provedení všech operací na grafické kartě. Be uvedení tohoto příkau b se mohlo stát, že některé objekt b nebl obraen. 5