Transformationer i 3D Gustav Taén gustavt@csc.kth.se 2D64 Grafik och Interaktionsprogrammering VT 27
Bakgrund Ett smidigt sätt att arbeta med 3D-grafik är att tänka sig att man har en virtuell kamera som betraktar betraktar de föremål man vill rita. Om vi simulerar hur ljus från ljuskällor llor reflekteras av tor och når kameran kan vi få en bild som i bästa fall ser ut som ett fotografi.
Bakgrund Vi börjar med att ta reda på hur vi kan transformera 3D-förem remål och gå från tre dimensioner till två. Vi tar hand om ljusreflektion och skuggning senare i kursen!
Transformationer i 3D Transformation Projektion Transformation Viewporttransformation
Matematiska bggstenar Skalär (storhet) Punkt (position) Vektor (längd och riktning) u P v Kvaternion (orientering) q
Skalär- och krssprodukt Två av de vanligaste operationerna i datorgrafik. v v u u v = (u v, u v, u v ) = u v cos θ u v θ u v u v = (u v u v, u v u v, u v u v ) v u
Höger- och vänsterhäntnt koordinat- sstem OpenGL använder ett högerhänt koordinatsstem med -aeln till höger, -aeln uppåt. -aeln pekar utåt ur skärmen. Direct 3D använder ett vänsterhänt koordinatsstem med -aeln till höger, -aeln uppåt. -aeln pekar in i skärmen. I fortsättningen arbetar vi i högerhänta koordinatsstem.
Basvektorer Givet n st n-dimensionella basvektorer v, v 2,..., v n som alla är vinkelräta mot varandra kan vi skriva vektorn w som w = α v + α 2 v 2 + α 3 v 3 +... + α n v n v 2 α 3 v 3 α 2 v 2 v 3 w α v v
Basvektorer Vi inför vektorer i vektorer för att kunna skriva w = α v + α 2 v 2 +... + α n v n lite kortare som: v a = w = a T v 2... v n där α α 2... a T = α α 2... α n α n
Ramar (frames) Vi definierar en ram som (v, v 2,..., v n, P ) där P kallas ramens origo. För punkter i denna ram gäller: P = P + η v + η 2 v 2 + η 3 v 3 +... + η n v n v 3 η 3 v 3 P P η v v η 2 v 2 v 2
Ramar (frames) eller P = p T v v 2... v n P η 3 v 3 P v 3 P η v v där p T = η η 2... η n v 2 η 2 v 2 Vi definierar P= P och P =
Ramar (frames) En riktningsvektor w i denna ram skrivs w = a T v v 2... v n P där a T = α α 2... α n Riktningsvektorer definieras alltså oberoende av origo.
Bte av ram Givet två ramar (v, v 2, v 3, P ) och (u, u 2, u 3, Q ), kan vi skriva u = γ v + γ 2 v 2 + γ 3 v 3 u 2 = γ 2 v + γ 22 v 2 + γ 23 v 3 γ 3 v 3 γ 2 v 2 v 3 u γ v v u 3 = γ 3 v + γ 32 v 2 + γ 33 v 3 v 2 Q = γ 4 v + γ 42 v 2 + γ 43 v 3 + P
Bte av ram u = γ v + γ 2 v 2 + γ 3 v 3 u 2 = γ 2 v + γ 22 v 2 + γ 23 v 3 u 3 = γ 3 v + γ 32 v 2 + γ 33 v 3 Q = γ 4 v + γ 42 v 2 + γ 43 v 3 + P Det är smidigare att skriva rambtet på matrisform: u u 2 u 3 Q = γ γ 2 γ 3 γ 2 γ 22 γ 23 γ 3 γ 32 γ 33 γ 4 γ 42 γ 43 v v 2 v 3 P M
Punkter och rambte Ta nu en punkt P och definiera den i två olika ramar: P = α v + α 2 v 2 + α 3 v 3 + P P = β u + β 2 u 2 + β 3 u 3 + Q i den första ramen i den andra Hur är α- och β-värdena relaterade? (enl. ovan) P = β β 2 β 3 u u 2 u 3 Q = b T M v v 2 v 3 P = α α 2 α 3 v v 2 v 3 P = a T v v 2 v 3 P (föregående bild)
Punkter och rambte b T M v v 2 v 3 P = a T b T M = a T a = M T b v v 2 v 3 P och omvänt: b = (M T ) - a D.v.s. P's koordinater i ram 2 fås om man multiplicerar koordinaterna för ram med (M T ) -.
Eempel Antag att vi arbetar i 2D och har två ramar (v, v 2, P ) och (u, u 2, Q ) och att ramarna är relaterade till varandra enligt följande: v 2 v u 2 (= v 2 ) u (= 2v ) u = 2v u 2 = v 2 Q = P M = M T = M - = (M T ) - = 2.5
Eempel Tag nu punkten a = ( ) T i den första ramen. Vilken är dess motsvarighet i den andra ramen? b = (M T ) - a ger oss.5 b = a =.5 T v u 2 (= v 2 ) v 2 u (= 2v )
Vi kan också se rambtet som en transformation. Eempel: Antag att "världen" är ram och att vi gör ett temporärt rambte till ram 2. Vi specificerar nu punkten p = ( ) T i ram 2. I ram blir den p världen = M T p = (2 ) T u 2 p v 2 p världen u v Med andra ord är bte av ram och transformation ekvivalenta begrepp!
Firam och transformationsram Ofta jobbar man med en "firam" och en "transformationsram". Firamen är fast och transformationsramen tillåts variera. Eempel: Våra koordinater -d α α 2 α 3 = α α 2 α 3 -d d Firam Transformationsram M T Punkt i transf.- ramen Motsv. punkt i firamen
Firam och transformationsram Specificera en modell i "sitt eget" koordinatsstem, objektkoordinater. "Placera ut" modellen i "världen" genom att definiera en transformationsram. Multiplicera objektkoordinaterna med M T för att få modellens koordinater i firamen. Groda-modell i dess objektkoordinatsstem Firam Transformationsram
Matriser Matriser = = = = = ' ' ' ' ' ' s s s t t t T S T M Translation Skalning
Matriser Matriser = = = = = = cos sin sin cos ) ( ' ' ' cos sin sin cos ) ( ' ' ' cos sin sin cos ) ( ' ' ' θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ R R R Rotation kring -aeln Rotation kring -aeln Rotation kring -aeln
Multipla transformationer Vi kan sätta samman transformationer genom att multiplicera matriserna: -d s s -d T S TS = s -d α α 2 α 3 = α sα 2 α 3 -d TS
Multipla transformationer Observera att ordningen på multiplikationen kan spela roll! -d s = s -d T S TS s -d = s -sd S T ST
Att specificera orientering Vi börjar med att pröva aw-pitch pitch-roll. Antag att flgplanet är modellerat så det initialt "pekar" längs -aeln. Vi roterar först kring -aeln (roll), sedan kring -aelnaeln (aw), sist kring -aeln (pitch). Kallas för att arbeta med Euler angles eller Eulermatriser.
Gimbal lock Om vi roterar en av alarna så den sammanfaller med en av de andra kan vi hamna i ett läge där vi tappar information! Situationen kallas för Gimbal lock. Beror på att rotationerna alltid görs i samma ordning.
Gimbal lock: eempel θ 2 BÅDE θ och θ beskriver "pitch"! θ = 9 grader 2 3 θ 3 3 2
Gimbal lock: eempel Eempel: Rotationsordningen är Z, Y, X. Vinkeln för är : rotationer kring och funkar som förväntat. Om vinkeln för är 9 grader: rotationen kring och går inte att särskilja!
Quaternions v Antag att vi kan beskriva rotation kring en godtcklig vektor v. Man kan visa att vilken orientering som helst kan beskrivas som en ( st) rotation kring en vektor.
Quaternions Antag att vi kan skriva flgplanets orientering i förhållande till "världens" koordinatsstem som q. Idén är nu att utgå från q och beskriva förändringen i orientering över en bildruta som rotationer kring flgplanets tre nuvarande koordinatalar.
Quaternions Antag att vi drar flgplanets strspak mot oss, planets nos ska rotera uppåt θ radianer. b θ a c Vi har q som tar oss från "världskoordinatsstemet" till planets nuvarande orientering. Vi tillverkar nu en q b som roterar θ radianer kring aeln b. Vi gör sedan q = q "+" q b
Quaternions b a c Rotera från "världskoordinatsstemet" till nuvarande koordinatsstem abc Uppdatera "heading": rotera kring a och få ab'c' Uppdatera "pitch": rotera kring b' och få a'b'c'' Uppdatera "roll": rotera kring c'' och få a''b''c'' Sätt q till resultatet
Quaternions v En matematisk struktur som kan beskriva rotation kring en godtcklig vektor är kvaternioner (quaternions). En kvaternion q definieras så här: q = (q, q, q 2, q 3 ) = (q, q) i 2 = j 2 = k 2 = ijk = - q = q i + q 2 j + q 3 k Observera att q INTE är rotationsaeln v!
Quaternions Lite kvaternionalgebra: tag två kvaternioner a och b: a = (q, q, q 2, q 3 ) = (q, q) b = (p, p, p 2, p 3 ) = (p, p) Addition och multiplikation: a + b = (p + q, p + q) ab = (p q p q, q p + p q + p q) Norm och invers: a 2 = q 2 + q q a - = ( / a 2 )(q, -q)
Quaternions Tag en punkt P i 3D. Skapa kvaternionen P θ v p = (, P) Välj rotationsaeln v och normera den. Låt rotationsvinkeln vara θ. Skapa nu kvaternionen r enligt r = (cos(θ/2), sin(θ/2)v) r - = (cos(θ/2), -sin(θ/2)v)
Man kan visa att p' = rpr - är resultatet av att rotera punkten P θ radianer kring vektorn v. Om a och b är kvaternioner som representerar rotation enl. ovan gäller också att q = ab är resultatet av att kombinera rotationerna (först a, sedan b).
Quaternions Det går enkelt att konvertera en kvaternion till en rotationsmatris (och tvärt om), se kursbunten eller kursboken! Det kan löna sig att lagra orienteringar som kvaternioner: : 4 flttal ist. för 33 = 9 (för( en rotationsmatris) Kvaternioner gör det enkelt att interpolera mellan orienteringar,, se kursbunten!
Projektioner Brook Talor, New Principles of Linear Perspective, 79.
Projektioner Planar Geometric Projections Parallell Perspective Orthographic Oblique -pt 2-pt 3-pt Multiview Aonometric Cavalier Cabinet Isometric Dimetric Trimetric Alla projektionerna finns beskrivna i kursbunten.
Ortografisk projektion Projektorerna är vinkelräta mot projektionstan. Avstånd och vinklar bevaras i projektionen.
Perspektivprojektion (enpunkts) Storlek minskar med avstånd från projektionstan. Avstånd och vinklar bevaras inte i projektionen.
Perspektivprojektion Antag att vi projicerar punkten P på ett bildplan som ligger d enheter från origo och är parallellt med --planet: Bildplan d d P p P
Perspektivprojektion Likformiga trianglar: P = T d P p p P p d = p = Analogt för p. Så den projicerade punkten blir: P p = /(/d) /(/d) d T P p = p p d T d = ( / d)
Perspektivprojektion Vi vill kunna skriva perspektivprojektionen som en matris P. För att kunna göra det måste vi införa en n operation. Om vi transformerar en punkt P = w T så att w blir skilt från ser vi till att alltid dividera med w innan vi fortsätter, d.v.s. P = /w /w /w T
Perspektivprojektion /d = /d Om /d dividerar vi alla komponenterna med /d innan vi använder punkten så att vi får /(/d) /(/d) d Detta kallas perspektivdivision i OpenGL.
Perspektivprojektion I OpenGL är projektionerna lite mer komplicerade än vad som sagts här. Anledningen är att man vill kunna klippa grafiska primitiver mot den volm som sns på projektionsplanet på ett och samma sätt oavsett vilken sorts projektion man har. I OpenGL klipps alla polgoner mot volmen - - - Man måste m.a.o. konstruera en projektionsmatris som svarar mot detta.
Perspektivprojektion Matrisen är en kombination av två operatorer: ) Distortion 2) Ortografisk projektion Klippning görs i detta läge. Detaljer finns i kursboken.
Transformationer i OpenGL Objektkoord. Ögonkoord. Klippkoord. o o o w o Kameraram till världsram e e e w e Modelviewmatris Projektionsmatris c c c w c Klippning w w w Perspektivdivision Viewporttransformation n n n Fönsterkoord. Normerade enhetskoord.
Att positionera kameran Antingen tänker man att kameran flttas i förhållande världens ram, eller att världsramen flttas så att den hamnar framför kameran. Operationerna är inverser av varandra. I OpenGL är kameraramen fi så rent matematiskt gäller det senare alternativet. Men det finns en funktion som hjälper en att fltta världen så att det motsvarar att fltta kameran.
Kombinationer av transformationer På motsvarande sätt som i 2D. Varje transformation motsvarar ett bte av ram. Så successiva transformationer är också successiva bten av koordinatsstem! M = M2 M M M 2
Hierarkiska modeller
Hierarkiska modeller i OpenGL Matrisstack Objektkoord. Ögonkoord. Klippkoord. o o o w o e e e w e Modelviewmatris Projektionsmatris c c c w c w w w Perspektivdivision Viewporttransformation n n n Fönsterkoord. Normerade enhetskoord.