Lineárne premietanie Meno: Jakub Imriška Dátum: 8. 2. 2008 Tento text vznikol krátko po odznení prednášky na túto tému na Sústredení FKS v Liptovskej Porúbke, 2008. Obsah: 1.Čo je to premietanie / projekcia? 2. Lineárne premietanie 3. Matica zobrazenia 4. Matica rotácie 5. Lineárne premietanie bodov 6. Zobrazovanie plôch 7. Smerový zdroj svetla 8. The End.
1.Čo je to premietanie / projekcia? Vo všeobecnosti ide o zobrazenie z priestoru väčšej dimenzie do priestoru nižšej dimenzie. Nasledovný text uvažuje projekciu z priestoru do roviny, čiže zobrazenie F r : 3 2, kde r je polohový trojdimenzionálny vektor a F r je funkcia, ktorej výstupom je dvojdimenzionálny vektor (určujúci, kam sa mi na priemetni zobrazí vektor r ). S projekciami sa stretávame bežne odmalička, príkladom sú mapy Obr. 1. Mercatorova projekcia zemského povrchu na plášť valca. Vykazuje značné skreslenie vo vyšších zemepisných šírkach. Nemá všade rovnakú mierku. Zachováva azimut medzi ľubovoľnými 2 bodmi. Obr. 2. Lambertova projekcia. Iné príklady: technické rysy (nárysňa, bokorysňa...), perspektívne zobrazenie...
Obr. 3. Perspektívne zobrazenie. Vpredu je oko pozorovateľa, plocha je priemetňa a zobrazený je tiež horizont.
2. Lineárne premietanie Lineárne premietanie sa vyznačuje tým, že funkcia F r : 3 2 je lineárna,čiže platí a, b r 1, r 2 3 : F ar 1 br 2 af r 1 bf r 2 Funkcia F r určuje zobrazovanie bodov. Ukážeme si, ako to asi vyzerá, ak má vlastnosť linearity: Obr. 4. Výsledný zelený vektor viem dostať ako vektorový súčet modrých vektorov. Obr. 5. Násobenie vektora skalárom ho príslušne predĺži.
Motiváciu tohto premietania dokumentuje nasledovný obrázok Obr. 6. Rovnobežné lúče zo vzdialeného zdroja svietia na objekt (ideálne taký drôtikový) a na priemetni ostáva tieň, ktorý je práve lineárnym priemetom objektu. Načo je to celé dobré? Nuž, ak okrem zobrazenia samotných bodov dorobíme aj vykresľovanie plôch, a dáme do scény smerový zdroj svetla, tak môžeme dostať nad očakávanie dobrú vizualizáciu 3D objektov za minimálnu cenu. Pritom spomínané 2 vylepšenie nestoja vôbec veľa námahy. Zopár ukážok nadovšetko.
Obr. 7. Kváder s vykreslenými plochami a osvetlený sprava zhora. Možno badať optický klam (kvôli chýbajúcej perspektíve), že zadné hrany sú dlhšie. Obr. 8. Aj v technickej praxi sa používa lineárne premietanie.
Obr. 9. Zobrazenie bodov a hrán. Stĺpik. Ak ho nerozpoznávaš, tak pozri nižšie. Obr. 10. Ten istý stĺpik so zobrazenými polygónmi.
Obr. 11. Parníček, na ktorý boli natiahnuté textúry. Voľne dokreslené. Obr. 12. Snaha o vtip na zaujatie publika. Tank je produkt lineáneho premietania.
3. Matica zobrazenia Linearita zobrazenia F r mi dáva jednoduchý návod, ako nájsť najvšeobecnejší tvar tejto funkcie. Ak totiž zobrazujem vektor r x, y, z x i y j zk, kde i, j, k sú jednotkové vektory v smery osí x, y, z, tak má platiť F r F x i y j zk xf i yf j zf k Obr. 13. Zelený vektor som dostal sčítaním modrých, ktoré sú príslušnými násobkami zobrazenia jednotkových vektorov. čo sa dá elegantne napísať pomocou maticového zápisu (vektory sú chápané ako riadky) F i F x i F y i F r x y z F j x y z F x j F y j F k F x k F y k F r x y z Z 11 Z 12 Z 12 Z 22 r Z Z 13 Z 32 Výsledkom je matica zobrazenia Z rozmeru 2x3, ktorá spapá 3-komponentný vektor a vypľuje 2-komponentný vektor a to je najvšeobecnejší predpis, ktorý spĺňa linearitu v nami uvedenom zmysle. Je zrejmé, že nie každá matica 2x3 vyhovuje našej úlohe. Napr. nulová matica je pre nás úplne nepoužiteľná. Požiadavky na maticu zobrazenia nie je celkom jednoduché sformulovať. Každopádne matica poskytujúca pre oko príjemné zobrazenie by mala
jednotkové vektory zobrazovať približne tak, ako na tomto obrázku (samozrejme sa to dá všelijako rotovať) Obr. 14. Takto má vyzerať priemet jednotkových vektorov i, j, k do priemetne. čo spĺňa matica (znamienka sú zvolené podľa obvyklej konvencie určovania polohy na obrazovke s počiatkom vľavo hore a kladnými poloosami doprava a nadol) Z 0. 44 0. 22 1 0 0 1 Na obr. 8 vidíme zobrazenie pomocou matice (tzv. Cabinet projection) Z 0. 5 sin 0. 5 cos 1 0 0 1 čoho špeciálnym prípadom (pre arctan 1/2 ) je vyššie uvedený prípad.
4. Matica rotácie Je zrejmé, že s púhym zobrazením bodov tak ako sú, sa nemôžeme uspokojiť. Určite by sme nemohli vynechať rotáciu scény, posun objektov a zoomovanie. V tejto kapitole vybavíme rotácie. Rotáciu môžem charakterizovať vo všeobecnosti osou, okolo ktorej rotujem (určená jednotkovým vektorom n) a uhlom, o ktorý točím - pričom kladný uhol značí, že ak mi prsty pravej ruky ukazujú smer točenia, tak palec ukazuje smer vektora n (pravidlo pravej ruky). Môžem to chápať aj tak, že rotáciu mi vlastne určuje jeden trojrozmerný vektor n. Avšakľubovoľný rotáciu viem určiť aj pomocou iných 3 parametrov. Veľmi výhodné je určenie pomocu Eulerových uhlov,,. Ukážeme si na príklade, že pomocou nich viem tuhé teleso natočiť do ľubovoľného smeru. Majme teleso, schematicky znázornené ako L-ko (tyčky majú smer osí z a y) - osobne si vždy predstavujem starodávny kanón, ktorému nastavujem azimut paľby, eleváciu hlavne a ktorý môžem rotovať ešte aj okolo osi hlavne (to natočenie vidím na zápalníku - u nás kratšia tyčka). Odporúčam si skúšať s perom v ruke a točiť si ho okolo osí, ktoré si na začiatku zvolím (napr. hrany stola a jeho noha)! Obr. 15. Nenatočená hlaveň. A. Rotujem teleso okolo osi z o uhol (natáčam zápalník)
Obr. 16. Otočím okolo dlhšej paličky o. B. Rotujem teleso okolo osi x o uhol (nastavujem eleváciu hlavne) Obr. 17. Točím okolo osi x o uhol. C. Rotujem teleso okolo osi z o uhol (nastavujem azimut dela) Obr. 18. Točím okolo osi z o uhol. Z analógie s kanónom alebo z hrania sa s perom je každému určite jasné, že takto viem docieliť ľuboľné natočenie telesa. Výhodné na Eulerových uhloch je to, že vždy točím okolo jednej z osí súradnicovej sústavy, čo oceníme v plnej miere možno až neskôr.
Teraz sa pozrime na všeobecnú rotáciu vektora r okolo osi určenej jednotkovým vektorom n prechádzajúcej počiatkom súradnicovej sústavy o uhol. Obr. 19. Točím vektor r o uhol okolo n. Takže, majme vektor r, ktorý idem otáčať okolo jednotkového vektora n. Vektor r si rozložím na r n r. Vektor r n r. n n je priemet vektoru r do smeru n a táto zložka r sa mi pri otáčaní nemení. Zložka r r r n r r. n n ječasť vektora r kolmá na n, ktorú vlastne idem otáčať. Zavediem si ešte jeden pomocný vektor r pom n r n r r. n n n r, ktorý má veľkosť r a je kolmý na r aj n. Potom užľahko viem určiť, že rotáciou r okolo n o uhol dostanem práve Potom ľahko nahliadnem, že r r cos r pom sin r r. n n cos n r sin r otočený r n r r. n n r r. n n cos n r sin r otočený r cos r. n 1 cos n n r čo môžem opäť zapísať pomocou matice r otočený r R n, pričom samotná rotačná matica má tvar sin R n, n x 1 cos n x cos n y 1 cos n x n z sin n z 1 cos n x n y sin n x 1 cos n y n z sin n y 1 cos n y cos n z 1 cos n y n x sin n x 1 cos n z n y sin n y 1 cos n z n x sin n z 1 cos n z cos
Poznámka 1: Fakt, že nám vyšla ako operátor matica, je dôsledkom linearity rotácie okolo danej osi o daný uhol. Poznámka 2: Zrejme matice R n, a R n, sú zhodné, lebo určujú rovnakú rotáciu. Zjavne je aj uhol necitlivý voči pričítaniu 2k, tak ako by sa to dalo očakávať. Poznámka 3: Je zrejmé, že ak vektor r otočím okolo n o a následne okolo toho istého n o uhol, musím dostať pôvodný vektor. Musí teda platiť r r R n, R n, R n, R n, I 3 diag 1, 1, 1 R n, R n, 1 1 0 0 0 1 0 0 0 1 Poznámka 4: Vieme, že matica rotácie určuje izometriu, preto je to ortogonálna matica. Ľahko nahliadnuť, že skutočne platí R n, 1 R n, T R n, Keď už sme si pochutili na matici všeobecnej rotácie, tak teraz si ukážeme, ako jednoducho vyzerajú matice rotácie okolo súradnicových osí. Zvolím si n 1, 0, 0 a dostanem maticu rotácie okolo osi x, konkrétne R x 1 0 0 0 cos sin 0 sin cos Maticu rotácie okolo osi y dostanem ak položím n 0, 1, 0 R y cos 0 sin 0 1 0 sin 0 cos Maticu rotácie okolo osi z dostanem ak položím n 0, 0, 1 R z cos sin 0 sin cos 0 0 0 1 Poznámka: Tvary týchto matíc nám ozrejmí tu priložený obrázok, ktorý sa na rotáciou okolo osi z (čiže v rovine xy) pozerá ako cez linearitu zobrazenia. Totiž rotácia vektora r r x r y r z je rotácia jeho x-ovej a y-ovej komponenty a tie viem zrotovať jednoducho. Totiž pri rotácii o uhol sa mi zrotujú takto r x x i r x x i cos x j sin r y y j r y y j cos y i sin
čo pre výsledný vektor dá Obr. 20. 2D rotácia okolo osi z. r otočený r x r y r z x cos y sin i x sin y cos j zk r otočený x y z cos sin 0 sin cos 0 0 0 1 Posledná vec v tomto odseku sú rotácie okolo osí, ktoré neprechádzajú počiatkom súradnicovej sústavy. Uvážme prípad, že chceme rotovať vektor r okolo osi určenej smerom n prechádzajúcej bodom r 0 o uhol. Tak to je jednoduché, totiž si premyslieť, že platí r otočený r 0 r r 0 R n,
5. Lineárne premietanie bodov Uvažujme objekt zložený z bodov, ktoré sú určené polohovým vektorom r i. Objekt chceme rotovať okolo osi určenej smerom n prechádzajúcej bodom r 0 o uhol. Takto zrotovaný ho chceme zobraziť, na priemetni posunúť o vektor d a ešte celé to chceme k-násobne zoom-nuť. Výsledná zobrazovacia rovnica je (u i je výsledný vektor na priemetni) u i k r 0 r i r 0 R z R x R z Z d Poznámka k implementácii: Je výhodné umiestniť si objekt tak, aby sa dal rozumne otáčať okolo osi prechádzajúcej počiatkom súradnicovej sústavy, čo formálne zapíšem r 0 0. Potom mám rovnicu u i k r i R z R x R z Z d Potom pri implementácii, najmä ak je zobrazovaných bodov veľa, je rozumné najprv 1x spočítať maticu rotovaného zobrazenia a potom mám už iba Z R z R x R z Z u i k r i Z d
6. Zobrazovanie plôch Vo všeobecnosti, ak máme scénu popísanú polygónmi, ktoré sa nepretínajú, tak dobrý tip je zobraziť ich v poradí, v akom sa k nám približujú ichťažiská. Nefunguje to perfektne. Vzdialenosť od pozorovateľa vieme určiť jednoducho ak si zavedieme vektor v ku mne, ktorý po zobrazení maticou Z sa zobrazí do bodu, čiže v ku mne Z 0 napr. pre Z 0. 44 0. 22 1 0 0 1 vychádza v ku mne c 1 0. 44 0. 22 kde c jeľubovoľné nenulové kladné (aby ten vektor trčal ku mne) reálnečíslo. Potom mierou vzdialenosti bodu určeného polohovým vektorom r otočený od pozorovateľa môže byť číslo r otočený v ku mne v tom zmysle, žečím väčšiečíslo, tým bližšie ku mne. Poznámka k implementácii: Opäť je výhodné pracovať s r 0 0. Potom ak vektory chápeme ako matice, môžeme písať r otočený v ku mne r otočený v ku mne T r otočený v ku mne r R z R x R z v ku mne r otočený v ku mne r v ku mne otoč T kde v ku mne otoč T Rz R x R z v ku mne T vku mne R z R x R z T, pričom sme využili, že rotačná matica je ortogonálna (t.j. R T R 1 ) a fakt, že inverzná matica k rotačnej je rotačná okolo tej istej osi ale o rovnaký záporný uhol. Pre konvexné telesá sa dá s úspechom použiť normála plochy. Totiž podľa znamienka skalárneho súčinu normály plochy s v ku mne otoč viem zistiť, ktorou stranou je táto plocha ku mne otočená. Pre konvexné telesá je to úplne postačujúce, lebo zobrazím práve všetky plochy, na ktoré sa pozerám zvonka. Lepšie postupy na zobrazovanie plôch možno existujú, ale pravdepodobne sa to už neopláca riešiť - iné zobrazenia (aj perspektívne) sú potom jednoduchšie implementovateľné. T
7. Smerový zdroj svetla Uvažujme trojuholník, ktorého vrcholy sú dané vektormi a, b, c. Potom jednotková normála plochy trojuholníka (smerujúca ku mne ak vidím body A, B, C v kladnom zmysle - proti smeru pohybu ručičiek) je N c a b a c a. b a Osvetlenie tejto plochy zdrojom zo smeru daného vektorom S môžem určiť pomocou súčinu S N cos, kde uhol je uhol, ktorý zviera normála N so svetelným vektorom S. Takto boli získané tiene na obr. 7.
8. The End. Thank you for your attention! Jakub Imriška 8. 2. 2008