Inkrementális 3D képszintézis Szirmay-Kalos László
Inkrementális képszintézis l koherencia: oldjuk meg nagyobb egységekre l feleslegesen ne számoljunk: vágás l transzformációk: minden feladathoz megfelelő koordinátarendszert –vágni, transzformálni nem lehet akármit: tesszelláció
3D inkrementális képszintézis Modell referencia helyzetben TesszellációVilágkoordináta r. Kamerakoordináta r. Normalizált eszközkoordináta r. Vágás Képernyőkoordináta r. Láthatóság + vetítés Takarás és vetítés triviális! Árnyalt kép T modell T view T persp T viewport z
Tesszelláció l Felületi pontok kijelölése: r n,m = r(u n,v m ) l Normálvektor: l „Paramétertérben szomszédos” pontokból háromszögek u,v r(u,v) N1N1 N2N2 N3N3 N(u n,v m )= r(u,v) u r(u,v) v r3r3 r1r1 r2r2 N(u,v)
1 Modellezési transzformáció 1. skálázás:sx, sy, sz 2. orientáció: , , 3. pozíció: px, py, pz TM=TM= sx sy sz 1 px py pz 1 z y x R
cos sin -sin cos 1 Orientáció T M = cos -sin 1 sin cos 1 cos sin -sin cos 1 Csavaró: Roll Billentő: Pitch Forduló: Yaw R = z y x (R 11,R 12,R 13 ) (R 21,R 22,R 23 ) (R 31,R 32,R 33 ) Orientáció = ortogonális mátrix Orientácó: 3 szabadságfok Orientáció = három szög+fix tengelyek vagy tengely+szög
Kvaterniók l Komplex számok általánosítása l q = [s,x,y,z] = [s,w] = s+xi+yj+zk l q 1 +q 2 = [s 1 +s 2, x 1 +x 2, y 1 +y 2, z 1 +z 2 ] l aq = [as,ax,ay,az] l |q| = s 2 +x 2 +y 2 +z 2 l Szorzás: –i 2 = j 2 = k 2 = ijk = -1, ij=k, ji=-k, jk=i, kj=-i, ki=j, ik=-j Szorzás asszociatív, de nem kommutatív, Összeadásra disztributív –Van egységelem: [1,0,0,0] –Van inverz: q -1 = [s,-w]/|q| 2, q -1 q = q q -1 =[1,0,0,0] [0,w] [0,u]=[-w u, w u] [a,0] [s,w]=[as, aw] [s,w] [a,0]=[as, aw] [s,w] [s,-w]=s 2 -sw+sw+[w 2,-w w] =s 2 +w 2
Egység kvaternió = forgatás az origón átmenő w tengely körül l q = [cos( /2), w sin( /2)], |w| = 1 l q [0,u] q -1 = [0,v] –v az u elforgatottja a w körül szöggel l Bizonyítás: –Ha w||u, akkor u megmarad –Ha w u: [C, Sw] [0,u]=[-Sw u, Cu+Sw u] =[0, Cu+Sw u] [0,u’] [C,-Sw]=[Su’ w, Cu’-Su’ w] =[0, Cu’+Sw u’] w u wuwu C S /2 u’ [cos( /2), w sin( /2)]= [C, Sw]
Origón átmenő w tengely körül szöggel forgató mátrix: R l w egységvektor, q = [cos( /2), w sin( /2)] –(0, R 11,R 12,R 13 ) = q [0,1,0,0] q -1 –(0, R 21,R 22,R 23 ) = q [0,0,1,0] q -1 –(0, R 31,R 32,R 33 ) = q [0,0,0,1] q -1 l Rodriquez formula l glRotate(alpha, wx, wy, wz); fokban!!!
Transzformációk l Modellezési transzformáció: [r,1] T modell = [r világ,1] [N,d] (T modell ) T = [N világ,d világ ] l Kamera transzformáció: [r világ,1] T view = [r kamera, 1] [N világ,d világ ] (T view ) T = [N kamera,d kamera ] l Perspektív transzformáció: [r kamera,1] T persp = [r képernyő h, h] l Összetett transzformáció: T modell T view T persp = T C
Kamera modell x y z vrp (lookat) vup eye fp bp fov asp Nézeti téglalap szem Mi: Camera obscura
Világból a képernyőre z y látószög 1. Világ 2. Kamera 3.1. Normalizált kamera 3.2. Normalizált képernyő 4. Képernyő x y z eye Bal!!!
Kamera transzformáció x y z lookat vup w = (eye-lookat)/|eye-lookat| u = (vup w)/|w vup| v = w u [x’,y’,z’,1] = [x,y,z,1] u x u y u z 0 v x v y v z 0 w x w y w z eye w u v eye x -eye y -eye z 1 w u v u x v x w x 0 u y v y w y 0 u z v z w z gluLookAt(eye,lookat,vup)
fp bp 90 látószög 1/(tg(fov/2)·asp) /tg(fov/2) T norm Normalizálás bp · tg(fov/2)
-fp -bp 1 Normalizálás utáni perspektív transzformáció [-mx · z, -my · z, z] [mx, my, 1] [mx, my, -1] (mx · fp, my · fp, -fp) (mx, my, -1) (mx · bp, my · bp, -bp) (mx, my, 1)
t11 t12 t13 t14 t21 t22 t23 t24 t31 t32 t33 t34 t41 t42 t43 t44 T persp -fp · t33+t43 = -fp -fp · t34+t44 = fp [mx · fp, my · fp, -fp, 1] * [mx, my, -1, 1] a [mx · fp, my · fp, -fp, 1] * [mx · fp, my · fp, -fp, fp] -fp Perspektív transzformáció kitalálás: első vágósíkon lévő pont
t11 t12 t13 t14 t21 t22 t23 t24 t31 t32 t33 t34 t41 t42 t43 t44 T persp -bp · t33+t43 = bp -bp · t34+t44 = bp [mx · bp,my · bp,-bp,1] * [mx, my, 1, 1] b [mx · bp,my · bp,-bp,1] * [mx · bp, my · bp bp, bp] -fp · t33+t43 = -fp -fp · t34+t44 = fp -bp-bp Szem: [0,0,0,1] [0,0, -2fp·bp/(bp-fp),0] [0,0,1,0] -(fp+bp)/(bp-fp) -1 -2fp · bp/(bp-fp) 0 Perspektív transzformáció kitalálás: hátsó vágósíkon lévő pont
1 [X h,Y h,Z h,h] = [xc,yc,zc,1] T persp [X,Y,Z,1] = [X h /h, Y h /h, Z h /h,1] Teljes perspektív transzformáció z y 1/(tg(fov/2)·asp) /tg(fov/2) (fp+bp)/(bp-fp) fp · bp/(bp-fp) 0 gluPerspective(fov,asp,fp,bp) h = -zc
Képszintézis csővezeték Modell: x,y,z T modell T view T persp Homogén osztás TakarásVetítés Rasztertár: X, Y Vágás Huzalváz képszintézis esetén kimaradhat T viewport csúcspontok primitívek 1
Vágni a homogén osztás előtt kell zc<0 zc>0 Ha a homogén osztás után vágnánk h = -zc
Vágni a homogén osztás előtt kell h = -zc h>0 h<0 zc<0 zc>0 [X(t),Y(t),Z(t),h(t)]=[X 1,Y 1,Z 1,h 1 ]·t + [X 2,Y 2,Z 2,h 2 ]·(1-t) Homogén lineáris transzformáció konvex kombinációkat konvex kombinációkba visz át. Ideális pont Szakasz
Vágás homogén koordinátákban Cél: -1 < X = X h /h < 1 -1 < Y = Y h /h < 1 -1 < Z = Z h /h < 1 Vegyük hozzá: h > 0 (mert h = -zc) -h < X h < h -h < Y h < h -h < Z h < h h = X h [3, 0, 0, 2 ] h = 2 < X h = 3 Kívül [2, 0, 0, 3 ] h = 3 > X h = 2 Belül
Szakasz/poligon vágás h = X h [X h 1,Y h 1,Z h 1,h 1 ] [X h 2,Y h 2,Z h 2,h 2 ] X h = X h 1 · (1-t) + X h 2 · t Y h = Y h 1 · (1-t) + Y h 2 · t Z h = Z h 1 · (1-t) + Z h 2 · t h = h 1 · (1-t) + h 2 · t h = h 1 ·(1-t)+h 2 ·t = = X h = X h 1 ·(1-t) + X h 2 ·t t = … -h < X h < h -h < Y h < h -h < Z h < h
Huzalváz képszintézis Modell: x,y,z TCTC Vágás Homogén osztás Nézet transzf Vetítés Rasztertár: X, Y 2D szakasz rajzolás (X,Y,Z) (X h,Y h,Z h,h) (X,Y) Szín Tesszel- láció poligon élek
Tömör képszintézis l Képernyő koordinátarendszerben –vetítősugarak a z tengellyel párhuzamosak! l Objektumtér algoritmusok (folytonos): –láthatóság számítás nem függ a felbontástól l Képtér algoritmusok (diszkrét): –mi látszik egy pixelben –Sugárkövetés ilyen volt! 1
Hátsólab eldobás: back-face culling n z > 0 n z < 0 Lapok a nézeti irányban: Kívülről: lap, objektum: elülső oldal Belülről: objektum, lap: hátsó oldal Feltételezés: Ha kívülről, akkor csúcsok óramutatóval megegyező körüljárásúak r1r1 r3r3 r2r2 n = (r 3 - r 1 ) (r 2 - r 1 ) z
Z-buffer algoritmus = z Szín buffer Mélység buffer Z-buffer
Z: lineáris interpoláció X Y Z Z(X,Y) = aX + bY + c Z(X,Y) Z(X+1,Y) = Z(X,Y) + a (X1,Y1,Z1)(X1,Y1,Z1) (X2,Y2,Z2)(X2,Y2,Z2) (X3,Y3,Z3)(X3,Y3,Z3)
Z-interpolációs hardver Z(X,Y) X számlálóZ regiszter a X CLK
X Y Z Z(X,Y) = aX + bY + c n x X+n y Y+n z Z+d = 0 (X1,Y1,Z1)(X1,Y1,Z1) (X2,Y2,Z2)(X2,Y2,Z2) (X3,Y3,Z3)(X3,Y3,Z3) Inkremens (triangle setup) Z 3 -Z 1 = a(X 3 -X 1 ) + b(Y 3 -Y 1 ) Z 2 -Z 1 = a(X 2 -X 1 ) + b(Y 2 -Y 1 ) (Z 3 -Z 1 )(Y 2 -Y 1 ) - (Y 3 -Y 1 )(Z 2 -Z 1 ) (X 3 -X 1 )(Y 2 -Y 1 ) - (Y 3 -Y 1 )(X 2 -X 1 ) a= Z 1 = aX 1 + bY 1 + c Z 2 = aX 2 + bY 2 + c Z 3 = aX 3 + bY 3 + c i j k X 3 -X 1 Y 3 -Y 1 Z 3 -Z 1 X 2 -X 1 Y 2 -Y 1 Z 2 -Z 1 n = (r 3 - r 1 ) (r 2 - r 1 ) = n nznz -nx-nx
Árnyalás L (V) l L l (L l )* f r (L l,N,V) cos ’ l Koherencia: ne mindent pixelenként l Háromszögenként: –csúcspontonként 1-szer, belül az L „szín” lineáris interpolációja: Gouraud árnyalás, (per-vertex shading) –pixelenként, a Normál (View, Light) vektort interpoláljuk: Phong árnyalás, (per-pixel shading)
Gouraud árnyalás R(X,Y) = aX + bY + c G(X,Y) =… B(X,Y) =… R(X,Y) R(X+1,Y) = R(X,Y) + a N1N1 N2N2 N3N3 r3r3 r1r1 r2r2 N1N1 N2N2 N3N3 r3r3 r1r1 r2r2 Modell [+kamera] Perspektív + nézeti Képernyő (per-vertex shading) V1V1 L1L1 L2L2 L3L3
Z-buffer + Gouraud árnyaló hw. Z X számláló z regiszter azaz X R regiszter aRaR G regiszter aGaG R G B regiszter aBaB B
Gouraud árnyalás hasfájásai ambiens diffúz spekuláris További bajok: anyagtulajdonság konstans árnyék nincs különben a színt nem lehet interpolálni
Phong árnyalás N(X,Y) = AX + BY + C L(X,Y) =… V(X,Y) =… N1N1 N2N2 N3N3 r3r3 r1r1 r2r2 N1N1 N2N2 N3N3 r3r3 r1r1 r2r2 Modell [+kamera] Pontokra: perspektív + nézeti Képernyő (per-pixel shading) V1V1 L1L1 L2L2 L3L3 Vektor másolás N1N1 V1V1 L1L1 N V L Normalizálás!
Phong árnyalás
Gouraud versus Phong Gouraud Phong Gouraud