370 likes | 487 Views
Inkrementális 3D képszintézis. Szirmay-Kalos László. Inkrementális képszintézis. koherencia: oldjuk meg nagyobb egységekre feleslegesen ne számoljunk: vágás transzformációk: minden feladathoz megfelelő koordinátarendszert vágni, transzformálni nem lehet akármit: tesszelláció.
E N D
Inkrementális 3D képszintézis Szirmay-Kalos László
Inkrementális képszintézis • koherencia: oldjuk meg nagyobb egységekre • feleslegesen ne számoljunk: vágás • transzformációk: minden feladathoz megfelelő koordinátarendszert • vágni, transzformálni nem lehet akármit: tesszelláció
3D inkrementális képszintézis Tmodell Tview Modell referencia helyzetben Kamerakoordináta r. Tesszelláció Világkoordináta r. Tpersp Tviewport z Képernyőkoordináta r. Láthatóság + vetítés Takarás és vetítés triviális! Normalizált eszközkoordináta r. Vágás Árnyalt kép
Tesszelláció r(u,v) u r(u,v) v • Felületi pontok kijelölése: rn,m = r(un,vm) • Normálvektor: • „Paramétertérben szomszédos” pontokból háromszögek N(un,vm)= N1 u,v r(u,v) N2 r2 N(u,v) N3 r1 r3
Modellezési transzformáció z 1. skálázás: sx, sy, sz 2. orientáció: , , 3. pozíció: px, py, pz y x 1 1 1 px py pz 1 sx sy sz 1 1 R TM=
(R21,R22,R23) z Orientáció (R31,R32,R33) y (R11,R12,R13) x cos -sin 1 sin cos 1 cos sin -sincos 1 1 1 cossin -sincos 1 0 0 0 0 0 0 1 R TM = = Csavaró: Roll Billentő: Pitch Forduló: Yaw 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 • Komplex számok általánosítása • q= [s,x,y,z] = [s,w] = s+xi+yj+zk • q1+q2 = [s1+s2, x1+x2, y1+y2, z1+z2] • aq = [as,ax,ay,az] • |q| = s2+x2+y2+z2 • Szorzás: • i2 = j2 = k2 = 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-1q= qq-1=[1,0,0,0] [a,0][s,w]=[as, aw] [s,w][a,0]=[as, aw] [0,w][0,u]=[-wu, wu] [s,w][s,-w]=s2-sw+sw+[w2,-ww] =s2+w2
Egység kvaternió = forgatás az origón átmenő w tengely körül • q= [cos(/2), w sin(/2)], |w| = 1 • q[0,u]q-1 = [0,v] • v az u elforgatottja a w körül szöggel • Bizonyítás: • Ha w||u, akkor u megmarad • Ha wu: • [C, Sw][0,u]=[-Swu, Cu+Swu] • =[0, Cu+Swu] • [0,u’][C,-Sw]=[Su’w, Cu’-Su’w] • =[0, Cu’+Swu’] [cos(/2), w sin(/2)]= [C, Sw] w S C wu /2 u’ u
Origón átmenő w tengely körül szöggel forgató mátrix: R • wegységvektor, q = [cos(/2), w sin(/2)] • (0, R11,R12,R13) = q[0,1,0,0]q-1 • (0, R21,R22,R23) = q[0,0,1,0]q-1 • (0, R31,R32,R33) = q[0,0,0,1]q-1 • Rodriquez formula • glRotate(alpha, wx, wy, wz); fokban!!!
Transzformációk • Modellezési transzformáció: [r,1] Tmodell = [rvilág,1] [N,d] (Tmodell)T= [Nvilág,dvilág] • Kamera transzformáció: [rvilág,1] Tview =[rkamera, 1] [Nvilág,dvilág] (Tview)T= [Nkamera,dkamera] • Perspektív transzformáció: [rkamera,1] Tpersp =[rképernyőh, h] • Összetett transzformáció: TmodellTviewTpersp =TC -1 -1
Nézeti téglalap Kamera modell szem vup fp fov eye asp bp vrp (lookat) z y x Mi: Camera obscura
Világból a képernyőre Bal!!! y eye 1 z z 3.2. Normalizált képernyő 2. Kamera 90 látószög y x 3.1. Normalizált kamera 1 1. Világ 4. Képernyő
eye v w u w v u Kamera transzformáció vup w = (eye-lookat)/|eye-lookat| u = (vupw)/|wvup| v = wu lookat z -1 ux uy uz0 vx vy vz0 wx wy wz0 0 0 0 1 y 1 0 00 01 00 0 0 10 -eyex-eyey -eyez1 x [x’,y’,z’,1] = [x,y,z,1] uxvxwx0 uyvywy0 uzvzwz0 0 0 0 1 gluLookAt(eye,lookat,vup)
Normalizálás bp·tg(fov/2) Tnorm 1/(tg(fov/2)·asp) 0 0 0 0 1/tg(fov/2) 0 0 0 0 1 0 0 0 0 1 fp bp 90 látószög
Normalizálás utáni perspektív transzformáció [-mx·z, -my·z, z] [mx, my, 1] [mx, my, -1] 1 -bp -fp (mx·fp, my·fp, -fp) (mx, my, -1) (mx·bp, my·bp, -bp) (mx, my, 1)
Perspektív transzformáció kitalálás:első vágósíkon lévő pont Tpersp • 0 • 01 • 00 • 00 t11 t12 t13 t14 t21 t22 t23 t24 t31t32 t33 t34 t41t42 t43 t44 0 0 0 0 -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·t33+t43 = -fp -fp·t34+t44 = fp
Perspektív transzformáció kitalálás:hátsó vágósíkon lévő pont Tpersp • 0 • 01 • 00 • 00 t11 t12 t13 t14 t21 t22 t23 t24 t31t32 t33 t34 t41t42 t43 t44 0 0 0 0 -bp -(fp+bp)/(bp-fp) -1 -2fp·bp/(bp-fp) 0 [mx·bp,my·bp,-bp,1] * [mx·bp, my·bp bp, bp] [mx·bp,my·bp,-bp,1] * [mx, my, 1, 1] b -fp·t33+t43 = -fp -fp·t34+t44 = fp Szem: [0,0,0,1] [0,0, -2fp·bp/(bp-fp),0] [0,0,1,0] -bp·t33+t43 = bp -bp·t34+t44 = bp
y Teljes perspektív transzformáció z 1/(tg(fov/2)·asp) 0 0 0 0 1/tg(fov/2) 0 0 00 -(fp+bp)/(bp-fp) -1 00 -2fp·bp/(bp-fp) 0 gluPerspective(fov,asp,fp,bp) 1 [Xh,Yh,Zh,h] = [xc,yc,zc,1] Tpersp [X,Y,Z,1] = [Xh/h, Yh/h, Zh/h,1] h = -zc
Képszintézis csővezeték primitívek csúcspontok Vágás Modell: x,y,z Tmodell Tpersp Tview Tviewport Vetítés Takarás Homogén osztás Rasztertár: X, Y Huzalváz képszintézis esetén kimaradhat 1
Vágni a homogén osztás előtt kell Ha a homogén osztás után vágnánk h = -zc zc<0 zc<0 zc>0 zc<0
Vágni a homogén osztás előtt kell [X(t),Y(t),Z(t),h(t)]=[X1,Y1,Z1 ,h1]·t + [X2,Y2,Z2,h2]·(1-t) Homogén lineáris transzformáció konvex kombinációkat konvex kombinációkba visz át. Ideális pont h>0 Szakasz h = -zc zc<0 h>0 zc<0 h>0 zc>0 zc<0 h<0
Vágás homogén koordinátákban Cél: -1 < X = Xh/h < 1 -1 < Y = Yh/h < 1 -1 < Z= Zh/h < 1 Vegyük hozzá: h > 0 (mert h = -zc) h = Xh Belül Kívül -h < Xh < h -h < Yh < h -h < Zh < h [3, 0, 0, 2] h = 2< Xh = 3 [2, 0, 0, 3] h = 3> Xh = 2
Szakasz/poligon vágás -h < Xh < h -h < Yh < h -h < Zh < h h = h1·(1-t)+h2 ·t = = Xh = Xh1·(1-t) + Xh2·t t = … h = Xh [Xh1,Yh1,Zh1,h1] Xh = Xh1 · (1-t) + Xh2 · t Yh = Yh1 · (1-t) + Yh2 · t Zh = Zh1 · (1-t) + Zh2 · t h = h1 · (1-t) + h2 · t [Xh2,Yh2,Zh2,h2]
Huzalváz képszintézis poligon élek (Xh,Yh,Zh,h) Modell: x,y,z Tesszel- láció Vágás TC Homogén osztás Szín (X,Y,Z) 2D szakasz rajzolás Nézet transzf Vetítés Rasztertár: X, Y (X,Y)
Tömör képszintézis 1 • Képernyő koordinátarendszerben • vetítősugarak a z tengellyel párhuzamosak! • Objektumtér algoritmusok (folytonos): • láthatóság számítás nem függ a felbontástól • Képtér algoritmusok (diszkrét): • mi látszik egy pixelben • Sugárkövetés ilyen volt!
r3 Hátsólab eldobás: back-face culling n = (r3 -r1)(r2 -r1) r2 r1 nz < 0 nz> 0 z • 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
Z-buffer algoritmus 2. 1. 3. = 1 z 0.6 0.3 0.3 0.6 0.8 Mélység buffer Z-buffer Szín buffer
Z: lineáris interpoláció (X2,Y2,Z2) Z Z(X,Y) = aX + bY + c (X1,Y1,Z1) Y (X3,Y3,Z3) Z(X,Y) X Z(X+1,Y) = Z(X,Y) + a
Z-interpolációs hardver X Z(X,Y) X számláló Z regiszter CLK S a
Inkremens (triangle setup) (X2,Y2,Z2) Z Z1= aX1 + bY1 + c Z2= aX2 + bY2 + c Z3= aX3 + bY3 + c n (X1,Y1,Z1) Y Z3-Z1= a(X3-X1) + b(Y3-Y1) Z2-Z1= a(X2-X1) + b(Y2-Y1) (X3,Y3,Z3) -nx X (Z3-Z1)(Y2-Y1)-(Y3-Y1)(Z2-Z1) (X3-X1)(Y2-Y1)- (Y3-Y1)(X2-X1) a= Z(X,Y) = aX + bY + c nxX+nyY+nzZ+d = 0 i jk X3-X1Y3-Y1 Z3-Z1 X2-X1Y2-Y1 Z2-Z1 nz n = (r3 -r1)(r2 -r1)=
Árnyalás L(V) SlLl (Ll)*fr (Ll,N,V)cos ’ • Koherencia: ne mindent pixelenként • 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 N1 r2 N2 R(X,Y) = aX + bY + c G(X,Y) =… B(X,Y) =… N3 r1 r3 Modell [+kamera] Perspektív + nézeti N1 r1 R(X,Y) L1 V1 L2 N2 L3 r2 N3 r3 R(X+1,Y) = R(X,Y) + a (per-vertex shading) Képernyő
Z-buffer + Gouraud árnyaló hw. X Z B R G X számláló R regiszter G regiszter B regiszter z regiszter S S S S aR aG aB az
Gouraud árnyalás hasfájásai • További bajok: • anyagtulajdonság konstans • árnyék nincs • különben a színt nem lehet • interpolálni spekuláris ambiens diffúz
Phong árnyalás N1 r2 N2 N(X,Y) = AX + BY + C L(X,Y) =… V(X,Y) =… N3 r1 r3 Modell [+kamera] N N1 L L1 Vektor másolás V1 Normalizálás! N1 V L1 r1 Pontokra: perspektív + nézeti V1 L2 N2 L3 r2 N3 r3 (per-pixel shading) Képernyő
Gouraud Phong Phong Gouraud versus Phong Gouraud