580 likes | 665 Views
Inkrementális 3D képszintézis. Szirmay-Kalos László. Inkrementális képszintézis. Sugárkövetés számítási idő Pixelszám × Objektumszám × (Fényforrás szám+1) koherencia: oldjuk meg nagyobb egységekre feleslegesen ne számoljunk: vágás
E N D
Inkrementális 3D képszintézis Szirmay-Kalos László
Inkrementális képszintézis • Sugárkövetés számítási idő Pixelszám × Objektumszám × (Fényforrás szám+1) • 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ó
Koordinátarendszerek:kameratér up right ahead z eye y x
Koordinátarendszerek:normalizált eszközkoordináták 1 1 x -1 -1
Koordinátarendszerek:viewport pixelx resolutionx pixely p resolutiony
Transzformációk • Ha egy pont koordinátái adottak egy térben, mik a koordinátái egy másik térben? • statikus felfogás • Milyen műveletet végezzünk az eredeti koordinátákon, hogy a másik térbe vigyük őket? • dinamikus felfogás
Az inkrementális képalkotási feladat • Adott egy háromszögesített 3D modell • háromszögek csúcsaival [modelltérben] • 2D háromszögrajzoló algoritmus • színezendő képpontok [viewport koordináták] • A feladat: • a csúcspont modellezési koordinátáibólszámítsuk ki, mely pixelre esik
Mi befolyásolja ezt? • Hol helyezzük el a modellt a virtuális világban • model-transzformáció, a.k.a. (world transformation) • Hol a kamera, merre néz • kamera-transzformáció • Mekkora a látószög (és képméretarány) • perspektív projekció • Mekkora a felbontás (hány pixelre rajzolunk) • viewport transzformáció
Plusz feladat: láthatóság • takarási probléma • a 2D pixel koordináták mellett kell egy mélységértéket is számolni • fix pontos z-buffer • [0, 1]-beli értékeket tud összehasonlítani • a távolság, amihez a 0-t rendeljük: első vágósík • amihez az 1-et: hátsó vágósík
Plusz feladat: árnyalás • Felületi pont, fények koordinátái, szempozíció, felületi normálisok... • ugyanabban a 3D koordináta rendszerben legyenek • logikusan a modellezési transzformáció után • de a kamera trafó szög és távolságtartó • kameratérben
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
Transzformációs csővezeték model transform view transform proj transform model space world space camera space clip space norm. device space pixel coordinates viewport space modelling viewport transform
Modellés világkoordináták(statikus interpretáció) model world
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=
Eltolás homogén koordinátákkal 1 1 1 px py pz 1 x y z 1 y+py x+px z+pz 1 =
(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ó = ortonormált mátrix Orientácó: 3 szabadságfok Orientáció = három szög+fix tengelyek vagy tengely+szög
Emlékeztető: Más algebrai alap? Forgatás = egység abszolút értékű komplex számmal szorzás • Idáig (2D-ben) • Pont = számpár • Eltolás = számpár (vektor) • Elforgatás, skálázás, nyírás, stb. = 22-s mátrix • Más lehetőség? • Pont = komplex szám (z) • Eltolás = komplex szám (összeadás): z’ = z + v • Forgatás, skálázás (forgatva nyújtás) = komplex szám (szorzás): • z’ = z * f , ahol f = r eiφ
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, konjugált/absnégyzet mint a komplexnél: q-1 = [s,-w]/|q|2, q-1q= qq-1=[1,0,0,0]
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 • wegységvektor körül szöggel forgató mátrix: • (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);
Specifikációhoz és főleg interpolációhoz kvaternió Kvaternió versus mátrix • Orientáció specifikációja: • Kvaternió: tengely + szög • Mátrix: három Euler szög (elemi forgatások a koordinátatengelyek körül) • Orientáció interpolációja: • Kvaternió: „közbülső” egységkvaterniók, természetes • Mátrix: Euler szögek, természetellenes • Orientációváltás végrehajtása: • Kvaternió: 2 kvaternió szorzás, forgatásokkal konkatenálható! • Mátrix: vektor-mátrix szorzás, bármilyen homogén-lináris transzformációval konkatenálható! Az orientáció váltás végrehajtásához mátrix
Transzformációk • Modellezési transzformáció: [r,1] Tmodell = [rvilág,1] [N,0] (Tmodell)T= [Nvilág,0] • Kamera transzformáció: [rvilág,1] Tview =[rkamera, 1] [Nvilág,0] (Tview)T= [Nkamera,0] • Perspektív transzformáció: [rkamera,1] Tpersp =[rképernyőh, h] • Összetett transzformáció: TmodellTviewTpersp =TC -1 -1
Hova kell a pontot rajzolni a képernyőn? • Az összes többi transzformáció ennek a kiszámolására megy • kamera transzformáció • hol van a pont a kamerához képest • vetítési transzformáció • hova vetül ez az ablak téglalapjára • viewport transzformáció • melyik pixel [11] [-1-1] [0 0] [345 234]
Nézeti téglalap Kamera modell szem fp vup fov eye asp bp z vrp (lookat) y x Mi: Camera obscura
Kamera-transzformáció(statikus interpretáció) camera world
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)
Projekció(statikus interpretáció) 1 y 1 -1 z képernyőkoordináta: (y/z, 1) homogén koordinátákkal (y/z, 1, 1) vagy(y, z, z)
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ő
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) -z (mx, my, z*) z* 1 -bp -fp (-mx·z, -my·z, z) (mx, my, z*) [-mx·z, -my·z, z, 1] [mx, my, z*, 1] [-mx·z, -my·z, -z·z*, -z]
Perspektív transzformációkitalálás Tpersp • 0 • 01 • 00 • 00 0 0 0 0 -1 0 -fp -bp [-mx·z, -my·z, z, 1] [-mx·z, -my·z, -z·z*,-z] -z·z*=·z + z*= - -/z fp·(-1)=(-fp) + = -(fp+bp)/(bp-fp) bp·(1)=(-bp) + = -2fp·bp/(bp-fp)
y Teljes perspektív transzformáció z -fp -bp 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 [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 = -zc Szakasz zc<0 zc<0 zc>0 zc<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 (per-vertex) á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