Transzformációk Szécsi László
A feladat Adott a 3D modell háromszögek csúcspontjai [modellezési koordináták] Háromszögkitöltő algoritmus pixeleket színez be [viewport koordináták] A feladat: számítsuk ki a csúcspont modellezési koordinátáiból, melyik pixelre kerül
Mi befolyásolja ezt? Hova, hogyan helyezzük el a modellt a virtuális világban modellezési trafó, model, world Hol van, merre néz a kamera kamera trafó, view Mekkora a látószög (és képméretarány) perspektív projekció Hányszor hány pixel az ablak és hol van viewport trafó
Bónusz feladat: takarás 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
Bónusz 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ó
Nézeti transzformáció: Kamera modell fp vup eye z FOV y aspect vrp (lookat) bp x
A transzformációs csővezeték model trafó view trafó proj trafó modellezési koordináták model space világkoordináták world space kamera koordináták camera space norm. képernyő koordináták clip space norm. device space modellezés viewport trafó pixel koordináták viewport space
Koordináta-rendszerek Egy pont valamilyen viszonyítási ponthoz képest (origó) adható meg kitüntetett vektorok lineáris kombinációjaként (bázisvektorok, koordinátatengely-irányok) Más origóval és irányokkal ugyanannak a pontnak mások a koordinátái Más számításokhoz más bázisok előnyösek
Modellezési: ebben adottak a koordináták [3 4] P = O M + 3M x + 4M y M y O M origó M x
Világ: kitüntetett fő-rendszer ebben legyen minden az árnyaláshoz modell origo itt van [3 3] Lokális Model M x = 3/25 W x 4/25 W y M y = 4/25 W x + 3/25 W y [3 4] P = O M +3M x + 4M y Ezekkel adjuk meg az objektum elhelyezkedését W y O W origó W x P = O M + 3M x + 4M y P = O w +3 W x + 3 W y + 3 (3/25 W x 4/25 W y )+ 4 (4/25 W y + 3/25 W y ) = O w +3 W x + 3 W y + (9 + 16)/25 W x + (12-12) W y = O w + 4W x + 3W y
Ez a számítás mátrix formában (modellezési transzformáció) P = 3 W x + 3 W y + 3 (3/25 W x 4/25 W y )+ 4 (4/25 W y + 3/25 W y ) [4 3] = [3+3*3/25+4*4/25 3-3*4/25+4*3/25] mindig fix [4 3 1] = [3 4 1] 3/25-4/25 0 4/25 3/25 0 M x M y mindig fix 3 3 1 O M
Árnyalás világ-koordinátákban L = (S-X)/ S-X V = (E-X)/ E-X X árnyalt felületi pont L megvilágítás iránya [4 3] V nézeti irány V L E szem pozíciója [6 3] W y [4 1] S fényforrás pozíciója O W origó W x Minden világ-ban adott
Hova kell ezt 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 [0 0] [-1-1] [345 234] [1 1]
Kamera koordináta rendszer C x = [-1 1] kamera koordináták [4 3] = E + x C *C x + z C *C z egyenletrendszer x,z-re [4 3] E [6 3] C z = [-1-1] W y 4 = 6 + x C *(-1) + z C *(-1) 3 = 3 + x C *(-1) + z C *(1) x C = 1, z C = 1 O W origó W x
Kamera koordináta egyenlet mátrix formában (NEM a kamera trafó mátrix) [4 3] = E + x C *C x + z C *C z [4 3] = E + x C *[-1-1] + z C *[-1 1] mindig fix [4 3 1] = [1 1 1] -1-1 0-1 1 0 C x C z mindig fix 6 3 1 E
Kamera trafó mátrix -1-1 0 [4 3 1] = [1 1 1] -1 1 0-1 -1 0 6 3 1-1 [4 3 1] -1 1 0 = [1 1 1] 6 3 1
Képernyő koordináta rendszer hova vetül a képernyőn milyen messze (takaráshoz kell) J x x J z J 1 J z W y ablak a virtuális világra O W origó W x
Képernyőkoordináta számítása hasonló háromszögek x C = x J * z C x J x J = x C / z C J x x C zc 1 z J J z ablak a virtuális világra
Ha a látószög nem 90 fok hasonló háromszögek itt van az 1.0 J x így ez 0.5 x C = x J * z C x J = x C / z C x C zc J x az egység Osztani kell az ablakunk fél szélességével x J z J FOV 1 x J = (x C / z C ) / tan(fov/2) J z ablak a virtuális világra Ha FOV = 90 fok akkor ez 1 FOV látószög
Perspektív transzformáció A vetítés is homogén linearis transzformáció: ezt is lehet mátrixszorzással DE nem affin: utolsó oszlop nem [0 0 1] homogén koordinátákban kapjuk meg az eredményt, és h általában nem 1 utána osztani kell h-val hogy rendes Descartes koodinátákat kapjunk x Jhomo / h Jhomo = (x C / z C ) / tan(fov/2)
Perspektív trafó mátrix x Jhomo / h Jhomo = (x C / z C ) / tan(fov/2) ez a képernyő-pozíció szempontjából nem érdekes 1/tan(FOV/2)? 0 [x Jhomo? h Jhomo ] = [x C z C 1] z C 0? 1 0? 0 x C / tan(fov/2)
Mi legyen a Z? A takaráshoz kell Tartsa meg a kamera koordinátarendszerbeli sorrendet (legyen monoton a látható objektumok részén) Ha [0 A 0] lenne a mátrixban: kell valamit ide is írni 1/tan(FOV/2) 0 0 [x Jhomo? h Jhomo ] = [x C z C 1] 0 A 1 A*z C z C = A 0 0 0 mindig A: elveszne a mélység info
0 < Z J <1 tartomány legyen fp < Z C < bp 1/(tg(fov/2)) 0 0 0 (fp+bp)/(bp-fp) 1 0-2fp*bp/(bp-fp) 0 3D ben, asp a képernyő magassága a szélességhez képest (a függőleges és vízszintes FOV nem ugyanakkora ) 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
Miért jó, hogy minden számítás mátrix-szorzás? (((r M 1 ) M 2 ) M 3 ) = r (M 1 M 2 M 3 ) több lépést is lehet egyetlen mátrixszorzással, ha a szorzatmátrixot használjuk LINEÁRIS: háromszögből háromszög lesz 3Dben érintkező háromszögekből 2Dben illeszkedő hszek nemlineárisnál a hszből valami más lesz, mi meg csak hszet tudunk hatékonyan rajzolni pixelekből