Geometriai transzformációk Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010
Számítógépes grafika feladata illúzió modellezés számok Virtuális világ modell képszintézis számítás Metafórák: optika 2D rajzolás festés analógiák Képpontok: vörös kék zöld mérés
Mindent számmal axiómák pont számok sík műveletek megfeleltetés egyenes egyenlet illeszkedik metszi függvény geometria algebra
Koordinátageometriai gyorstalpaló - Pontok, alakzatok megadása Mindent számmal! Koordináta rendszer Koordináták megadása Koordináta rendszerek Descartes Polár Homogén
Koordináta rendszerek Yh 1 y 1 r f w Xh x Descartes Polár Baricentrikus Homogén
Pontfüggvények: Mozgatás Vektor = eltolás: v Iránya és hossza (|v|) van Helyvektor De vektor ≠ pont !!! Vektorműveletek v = v1 + v2 (kommutatív, asszoc) v1 = v - v2 (összeadásnak van inverze) v1 = av (összeadásra disztributív) helyvektor origó v1 v2 v av
Skaláris szorzás Definíció Jelentés Tulajdonságok v1 Definíció v1v2 = |v1||v2|cos Jelentés Egyik vektor vetülete a másikra x másik hossza Tulajdonságok Kommutatív v1v2 = v2v1 Összeadással disztributív v3(v2+v1) = v3v2 + v3v1 vv = |v|2 v2 |v1|cos v2 v1 v3 |v1|cos
Vektoriális szorzás Definíció Jelentés Tulajdonságok v1 v2 v2 |v1 v2| = |v1||v2|sin Merőleges, jobbkéz szabály Jelentés Paralelogramma területe, síkjára merőleges (Egyik vektor vetülete a másikra merőleges síkra + 90 fokos forgatás) x másik hossza Tulajdonságok Alternáló v1 v2 = - v2 v1 Összeadással disztributív v3 (v2+v1) = v3 v2 + v3 v1 vv = |v|2 v1 |v1|cos v2 v1 |v1|sin 90 fok v1v2
Descartes koordinátarendszer Egyértelmű (x = vi, y = vj) Műveletek koordinátákban Összeadás: v1 + v2 = (x1+x2)i + (y1+y2)j Skaláris szorzás: v1 v2 = (x1i + y1 j) (x2i + y2 j) = (x1 x2 + y1y2) Vektoriális szorzás: v1 v2 = (x1i + y1 j + z1k) (x2i + y2 j + z2k) = (y1z2 – y2z1) i + (x2z1 – x1z2) j + (x1y2 – y1x2)k Abszolút érték: |v| = vv = x2 + y2 + z2 y j v = xi + yj j x i i origó i j k x1 y1 z1 x2 y2 z2
Vektor és Pont nem ugyanaz! 2D: vektor (x, y) Pont (x, y) 3D: vektor (x, y, z) Pont (x, y, z) Műveletek: Vektor + Vektor = Vektor Pont + Vektor =Pont (eltolás) Vektor – Vektor = Vektor Pont – Pont = Vektor Vektor Vektor = Vektor Vektor Vektor = Skalár Vektor * Skalár = Vektor
Vektor osztály struct Vector { float x, y, z, w; Vector(float x0, float y0, float z0, float w0 = 0) { x = x0; y = y0; z = z0; w = w0; } Vector operator*(float a) { return Vector(x * a, y * a, z * a, w * a); Vector operator+(Vector& v) { return Vector(x + v.x, y + v.y, z + v.z, w + v.w); Vector operator-(Vector& v) { return Vector(x - v.x, y - v.y, z - v.z, w - v.w); float operator*(Vector& v) { return (x * v.x + y * v.y + z * v.z); Vector operator%(Vector& v) { return Vector(y*v.z-z*v.y, z*v.x - x*v.z, x*v.y-y*v.x); float Length() { return sqrt(x * x + y * y + z * z); } };
2D egyenes n(r – r0) = 0 nx (x – x0) + ny (y – y0) = 0 n normálvektor v irányvektor n(r – r0) = 0 nx (x – x0) + ny (y – y0) = 0 ax + by + c = 0 (x, y, 1) (a, b, c) = 0 y r0 r x R0 az egyenes biztos pontja r = r0 + v t, t [-∞,∞] x = x0 + vx t y = y0 + vy t
Sík n(r – r0) = 0 nx (x – x0) + ny (y – y0) + nz (z – z0) = 0 n normálvektor z r0 r y x n(r – r0) = 0 nx (x – x0) + ny (y – y0) + nz (z – z0) = 0 ax + by + cz + d = 0 (x, y, z, 1) (a, b, c, d) = 0
… és akkor tényleg folytassuk a transzformációkkal Affin transzformáció: Párhuzamos egyeneseket párhuzamos egyenesekbe viszi Lineáris transzformációk ilyenek
Elemi affin transzformációk Eltolás: r’ = r + p Skálázás: x’= Sx x; y’= Sy y; Forgatás: x’= cosφ x+ sinφ y; y’= -sinφ x+ cosφ y; Sx 0 0 Sy Fix pont: origó r’ = r cos φ sin φ -sin φ cos φ r’ = r Fix pont: origó
Elemi transzformációk Nyírás: x’= x; y’= y + a x; Tükrözés: 1 a 0 1 r’ = r 1 0 0 -1 r’ = r
Transzformáció fix pontja: pivot point: (xp, yp) Skálázás: x’= Sx (x-xp) + xp; y’= Sy (y-yp) + yp; Forgatás: x’= (x-xp)*cos f - (y-xp)* sin f + xp; y’= (x- yp)*sin f + (y- yp)* cos f + yp;
Modellezési feladat α v Alapműveletek: eltolás origó fixpontú skálázás origó középpontú forgatás v méret: s=1.5x Alap objektum modell Várt elhelyezés
Műveletek sorrendje
Modellezés: 2 csuklójú robotkar y h β w α
y y β x x
y y β β h x x
y y β α β h α
y β α x
Összetett transzformáció Affin transzformáció: r’ = r A + p A: lineáris transzformáció forgatás, skálázás, tükrözés, nyírás, stb. p: eltolás Amíg lineáris transzformáció: konkatenáció r’ = (...(r A1) A2)... An) = r (A1A2... An )
Homogén koordinátás transzformációk Eltolás nem fér bele a 2x2-es mátrixba Dolgozzunk 3x3-as mátrixokkal A a11 a12 0 a21 a22 0 p1 p2 1 [r’, 1] = [r, 1] = [r A + p, 1] p [r’,1] = (...([r,1] T1) T2)... Tn) = [r,1] (T1T2... Tn)
Transzformációk projektív geometriai megközelítése Homogén koordináták – nem csak az eltolás egységes kezeléséért! 3D grafika központi eleme a 3D-s világ 2D-s megjelenítése Vetítés, mint dimenziócsökkentő művelet Centrális (középponti) vetítés Az euklideszi térben nem minden pont vetíthető centrálisan -> euklideszi helyett un. projektív geometria
Centrális projekció Eltűnő egyenes Ideális pontok Vetítési középpont képsík tárgysík Képsíkkal párhuzamos vetítősugarakkal jellemzett pontok végtelenbe tűnnek C. projekció nem minden euklideszi pontot visz euklideszi pontba – projektív geometria: tömjük be a lyukakat!
Projektív geometria Euklideszi geometria Projektív geometria 2 pont meghatároz egy egyenest 2 különböző egyenes legfeljebb 1 pontban metszi egymást 1 ponton keresztül pontosan 1 egyenes megy át, amely nem metsz egy, a pontra nem illeszkedő másik egyenest (párhuzamosság) centrális projekcióra lyukas (ideális pontok) algebrai alap: Descartes koordináta rendszer Projektív geometria Projektív sík = Euklideszi sík pontjai + ideális pontok Minden egyeneshez vegyünk hozzá egy ideális pontot úgy, hogy két egyenes akkor kapja u.a. pontot, ha párhuzamos Az egyenesek halmazát egészítsük ki az ideális pontokat tartalmazó egyenessel 2 különböző egyenes pontosan 1 pontban metszi egymást algebrai alap: homogén koordináták
Homogén koordináták [Xh ,Yh ,h] [0,0,0] nem pont Szemléltetés: mechanikai rendszer súlypontja Összsúly: h = Xh+ Yh + w Pont homogén koordinátái: [Xh ,Yh ,h] Yh P2 Ps w Xh P1 P3 [0,0,0] nem pont Homogén Xh P1+Yh P2 +w P3 Ps= Ha az összsúly h ≠ 0 a súlypont Ps euklideszi pont: Xh+ Yh + w [Xh ,Yh ,h] és [λXh , λYh , λ h] súlypontja ugyanaz!
Homogén-Descartes kapcsolat affin pontokra Keressük egy adott affin (h ≠ 0) projektív térbeli pont megfelelőjét az euklideszi térben (azaz a Descartes koordinátarendszerben) Súlypont analógia: tegyük a súlyokat i=[1 0], j=[0 1] és 0=[0,0] pontokba, és olvassuk ki a súlypont koordinátáit Xh [1,0]+Yh [0,1]+w[0,0] r(Xh ,Yh ,h) = Yh h [0,1] r(Xh ,Yh ,h) = ( , ) Xh h Yh h w Xh Xh h Yh h [0,0] x = y = [1,0]
( , ) Következmények Minden affin ponthoz van: [Xh ,Yh ,h] (x, y) [x, y,1] Ha h 0, akkor [Xh ,Yh ,h] affin pont Xh h Yh h ( , )
Mi az ideális pont? h=0 (x,y,1) (2x,2y,1) = (x,y,1/2) y x (x,y,0)
Egyenes egyenlete átírás homogén koordinátás alakra: (a,b,c): egy egyenes; (Xh, Yh,h) egy pont Dualitás: pont és egyenes formailag analóg – az összes pontokra érvényes tétel igaz lesz az egyenesekre
Párhuzamos egyenesek metszéspontja Descartes koordinátákkal a1 /b1 /≠ a2 /b2 a1 x + b1 y +c1 = 0 a2 x + b2 y +c2 = 0 x, y a x + b y + c1 = 0 a x + b y + c2 = 0 c1 - c2 = 0 nincs megoldás
Párhuzamos egyenesek metszéspontja homogén koordinátákkal Descartes: a x + by +c = 0 a Xh/h + b Yh/h +c = 0 Homogén: a Xh + b Yh +c h = 0 a Xh + b Yh + c1 h = 0 a Xh + b Yh + c2 h = 0 (c1 - c2) h = 0 h = 0, Xh = b, Yh = -a [b ,-a ,0]
[ , ] Beágyazott modell [Xh ,Yh ,h] h Yh [Xh ,Yh ,0] Xh Xh h Yh h 3D euklideszi tér [Xh ,Yh ,h] [ , ] h Xh h Yh h (x, y) = 2D projektív sík [0,0,0] nem pont [Xh ,Yh ,h]·a u.a. pont 1 y x Yh [Xh ,Yh ,0] Xh
Projektív egyenes paraméteres egyenlete [X1 ,Y1 ,h1] h [X2 ,Y2 ,h2] Yh Xh Szakasz: Konvex kombináció! [X(t) ,Y(t) ,h(t)]=[X1 ,Y1 ,h1]·t + [X2 ,Y2 ,h2]·(1-t)
Homogén lineáris transzformációk Euklideszi sík affin transzformációi: [x’, y’] = [x, y] A + p Homogén koordináták lineáris függvényei: [Xh’ ,Yh’ ,h’] = [Xh,Yh,h] T + p Homogén lineáris transzformációk bővebbek: a11 a12 0 a21 a22 0 p1 p2 1 T =
Homogén lineáris transzformációk tulajdonságai Pontot-pontba, egyenest-egyenesbe (pontba), konvex kombinációkat, konvex kombinációkba visznek át Példa: egyenest egyenesbe: [X(t) ,Y(t) ,h(t)]=[X1 ,Y1 ,h1]·t + [X2 ,Y2 ,h2]·(1-t) P(t) = P1·t + P2·(1-t) // · T P*(t) = P(t)·T = (P1·T) ·t + (P2·T) ·(1-t)
Példa: Euklideszi geometriában nem lineáris transzformáció 0 1 q 0 0 0 x, y x’, y’ [x, y, 1] [ x, y, px+qy] x px+qy y px+qy px+qy=1
(x,y,1) (2x,2y,1) = (x,y,1/2) y x (-x,-y,1)=(x,y,-1) Ideális pont (-x,-y,2)=(x,y,-1/2) (x,y,0) Projektív egyenes: körszerű topológia
Veszélyek: átfordulási probléma Ideális pont e =Projektív egyenes (topológia) Szakasz ?????
A projektív tér, 3D pontok homogén koordinátái Zh Összsúly: h = Xh+ Yh + Zh + w Pont homogén koordinátái: [Xh ,Yh ,Zh,h] w Yh Xh Homogén
A projektív tér egyenesei és síkjai [X(t),Y(t),Z(t),h(t)]=[X1,Y1,Z1,h1]·t + [X2 ,Y2,Z2,h2]·(1-t) Euklideszi, Descartes koord: nx x + ny y + nz z + d = 0 Euklideszi, homogén koord: nx Xh/h + ny Yh/h + nz Zh/h +d = 0 Projektív: nx· Xh + ny ·Yh + nz · Zh +d · h = 0 nx ny nz d [Xh ,Yh ,Zh,h]· = 0
Invertálható homogén lineáris transzformációk síkot síkba visznek át P T P* = P·T T-1 (P*·T-1)·NT = 0 P*·(T-1·NT) = 0 P*·(N·(T-1)T)T = 0 P*·N*T = 0 P·NT = 0 N*=N·(T-1)T Inverse-transpose
Projektív geometria a számítógépes grafikában Projektív tér Világ: Euklideszi tér [x,y,z] (x, y,z,1) (Xh ,Yh ,Zh ,h) (T1T2... Tn) Projektív tér Kép: Euklideszi tér [ , , ] Xh h Yh h Zh h
Koordináta-rendszer transzformációk Analógia a műtermi fényképkészítés és az OpenGL képalkotás között Fényképezőgép elhelyezése, ráirányítása a lefényképezendő térrészre - nézőpontba transzformálás A lefényképezendő objektumok elhelyezése a kívánt pozícióba –modell-transzformáció A megfelelő lencse kiválasztása, zoom beállítása – vetítési transzformáció Papírkép a negatívról – képmező transzformálás
OpenGL transzformációk Homogén lineáris transzformáció (p itt oszlopvektor) p’=Mp Transzformációk kompozíciója p’=M1p és p’’= M2p’ → p’’=M2M1p a közös transzformáció M2M1
OpenGL csővezeték 2. 1. MODELVIEW PROJECTION Kamera transzformáció, Perspektív transzformáció + Vágás homogén koordinátákban Kamera transzformáció, illumináció Virtuális világ 2. 1. szín mélység megjelenítés Képernyő transzf+Raszterizáció+interpoláció
Transzformációk Lokális mod. Normalizált képernyő kamera homogén x y z Modelview matrix Stack Projection matrix Stack Homogén osztás Viewport transzf. window vágás Backface culling Raszterizáció, textúrázás illumináció modellező, kamera (nyírás), normalizáló perspektív
OpenGL transzformációs mátrixok kezelése Műveletek: aktuális mátrix kijelölése, betöltése, vagy megszorzása jobbról egy új mátrixszal
OpenGL transzformációs mátrixok kezelése void glMatrixMode(GLenum mode); Állapotváltozó: megadjuk, hogy melyik mátrixot akarjuk a következő parancsokkal állítani mode lehet: GL_MODELVIEW – modell-nézeti transzformáció (objektumok és a kamera elhelyezkedése és iránya) GL_PROJECTION – kamera modell kiválasztás és fókuszálás GL_TEXTURE – textúra glLoadIdentity(); aktuális mátrix beállítása az egységmátrixra
Mátrix betöltése, szabad szorzása void glLoadMatrix{fd}(const TYPE *m); m pointer által címzett 16 elemű vektor elemeit betölti az aktuális mátrixba oszlopfolytonosan void glMultMatrix{fd}(const TYPE *m); m pointer által címzett 16 elemű vektor elemeiből képzett mátrixszal szorozza az aktuális mátrixot m1 m5 m9 m13 m2 m6 m10 m14 m3 m7 m11 m15 m4 m8 m12 m16 M:
OpenGL transzformációs mátrixok kezelése void glTranslate{fd}(TYPE x, TYPE y, TYPE z) előállítja az [x,y,z,1]T vektorral való eltolás mátrixát és megszorozza vele (jobbról) a kurrens mátrixot void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z) előállítja az origón áthaladó, [x,y,z]T irányvektorú egyenes körül angle szöggel elforgató mátrixot és megszorozza vele a kurrens mátrixot. A szög előjeles, fokban kell megadni void glScale{fd}(TYPE x, TYPE y, TYPE z); - skálázás
Nézőpont és nézeti irány beállítása Alapértelmezés: nézőpont a modellkoordináta-rendszer origója, nézési irány a negatív z-tengely Új nézőpont megadása: OpenGL: az objektumot toljuk/forgatjuk ellentétes irányban (glTranslate*, glRotate*) GLU: a nézőpont és a kamera nézet iránya közvetlenül is megadható
Nézőpont és nézeti irány beállítása void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz) eyex eyey, eyez: a szem pozíciója, honnan nézünk – új origó centerx,centery,centerz: hová nézünk – új nézési irány azaz a z tengely (negatív) iránya upx, upy, upz: melyik térbeli irány képe legyen függőleges – felfele irány az új y tengely iránya
OpenGL transzform. kompozíció Forgatás (R) majd eltolás (T) elvégzése p’=Rp és p’’= Tp’ → p’’=TRp a közös transzformáció TR: OpenGL mátrixszorzás jobbról történik, ezért a mátrixokat a végrehajtás sorrendjével ellentétes sorrendben kell megadni: (1) lépés glLoadIdentity(); M:=E egységmátrix (2) lépés glTranslated(x,y,z); M:=M∙T=E∙T = T (3) lépés glRotated(angle,x,y,z); M:=M∙R=E∙T∙R = TR
MODELVIEW Transzformáció eye v w u -1 ux uy uz 0 vx vy vz 0 wx wy wz 0 eye 1 Kamera koordinátarendszer glMatrixMode(GL_MODELVIEW); glLoadIdentity( ); gluLookAt(eyex, eyey, eyez, vrpx, vrpy, vrpz,upx, upy, upz); //VIEW glTranslatef(px, py,pz); //MODEL glRotatef(ang, axisx,axisy,axisz); glScalef(sx, sy, sz); glMultMatrixf( mat[4][4] ); sorrend
OpenGL vetítési transzfromációk Centrális vetítés (valószerű képek): glFrustum() glPerspective() Merőleges vetítés (méret/méretarány helyes képek): glOrtho() glOrtho2D()
Projektív transzformáció void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); az ábrán csonkagúlával meghatározott centrális vetitési mártixot álltítja elő és megszorozza vele a kurrens mátrixot a near és far értékek a közeli és távoli vágósiknak a nézőponttól mért távolságát jelentik, mindig pozitivak. A csonkagúla fedőlapján az egyik átló végpontjának koordinátái (l,b-n) és (r,t,-n) az így megadott csonkagúla nem feltétlenül egyenes - a zs tengely és a fedőlap metszéspontja nem feltétlenül a fedőlap átlóinak metszéspontjával
Projektív transzformáció void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far);
Merőleges vetítés void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); a nézőpont helye itt közömbös, csak a nézési irány számít a near és far paraméterek itt negatívok is lehetnek
2D alakzatok ábrázolása void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); 2D: nem kell közeli és távoli vágósíkot megadni (automatikusan [-1,1])
PROJECTION Transzformáció Kamera koordinátarendszer Homogén (1, 1, 1, 1) bp fp glMatrixMode(GL_PROJECTION); glLoadIdentity( ); gluPerspective(fov, asp, fp, bp); (-1,-1,-1, 1) 1/(tg(fov/2)·asp) 0 0 0 0 1/tg(fov/2) 0 0 0 0 -(fp+bp)/(bp-fp) -1 0 0 -2fp*bp/(bp-fp) 0 Projekció után homogén osztás: normalizált koordináták
Képmező transzformáció void glViewport(GLint x, GLint y, GLsizei width, GLsizei height); képmező: téglalap alakú rajzterület a képernyőn oldalai párhuzamosak az ablak oldalaival (x,y): a képmező bal alsó sarka width, height: a képmező szélessége, hosszúsága
Képernyő Transzformáció (1, 1, 1) (-1,-1,-1) 1 Normalizált képernyő: Vágás és homogén osztás után glViewport( 0, 0, width, height );
Aktuális transzf. mentése és újra töltése void glPushMatrix(void); A glMatrixMode() paranccsal beállított kurrens verem minden elemét egy szinttel lejjebb tolja. A legfelső (kurrens) mátrix a második mátrix másolata lesz void glPopMatrix(void); A glMatrixMode() paranccsal beállított kurrens verem legfelsőbb elemét eldobja, és minden további elemet egy szinttel feljebb tol.