Vektorok különbsége e-x = [ex-xx ey-xy ez-xz] e e-x x szempozíció nézeti irány (nem normalizált) e e-x x árnyalt felületi pont pozíciója
Vektorok hossza |v| = √ (vx*vx + vy*vy + vz*vz) |v| v
Normalizált nézeti irány e-x = [ex-xx ey-xy ez-xz] szempozíció V: nézeti irány (normalizált) e V= (e-x)/|e-x| x árnyalt felületi pont pozíciója
Két vektor skalárszorzata (dot product) a·b = axbx + ayby + azbz skalár (egy szám) a·b = |a||b| cos q a b q
Mire jó a skalárszorzat? 1. v-nek n irányú része derékszögű háromszög |n| = 1 |vn| = |v| cos Q = |v| |n| cos Q = v·n vn = n |vn| v vtöbbi skalárszorzat vn q n egységnyi hosszú kell legyen n
Például: falról visszapattanó labda, tökéletes visszaverődés iránya V = Vpárhuzamos + Vmerőleges V: bejövő sebesség Vout = Vpárhuzamos - Vmerőleges V Vpárhuzamos Vmerőleges = -N(V·(-N)) Vpárhuzamos = V - Vmerőleges Vout = V - 2N(V·N) Vmerőleges N Fal Vout N: fal normálvektora kimenő sebesség
Mire jó a skalárszorzat? 2. a és b közötti szög cosinusa |a| = |b| = 1 cos Q = |a| |b| cos Q = a·b a q a és b egységnyi hosszú kell legyen b
Például: diffúz felület árnyalása kd: diffúz BRDF paraméter Iout = Iin kd cosQ Iin: bejövő radiancia Iout = Iin kd L·N Q: fény beesési szöge L: fényirány (normalizált) L q Fal N N: árnyalt felület normálvektora (normalizált) Iout kimenő radiancia (nem függ a nézeti iránytól, mert diffúz)
Két vektor vektoriális szorzata (keresztszorzat, cross product) a×b = [aybz-azby azbx-axbz axby-aybx] |a×b| = |a||b|sinQ a merőleges a-ra és b-re a×b a·|a×b| = 0 b·|a×b| = 0 b q
Mire jó a keresztszorzat? Ha valami vektorra kell egy merőleges keresztszorozzuk pl. a felfele vektorral (pl. [0, 0, 1]) Két vektorra is merőleges a két vektor keresztszorzata ha nem 1 hosszúak vagy nem derékszögben állnak ne felejtsünk el normalizálni Példa: paraméteres felület normálvektora egy pontban
Példa: felület normálvektora felület paraméteres egyenlete legyen: x(u,v) = u y(u,v) = v z(u,v) = sin(2u + 3v ) Mi a normálvektora a u=v=0 pontban? x(u,v) / u = 1 y(u,v) / u = 0 T érintő (tangens) z(u,v) / u = cos(2u + 3v) 2 = 2 x(u,v) / v = 0 B érintő (binormál) y(u,v) / v = 1 z(u,v) / v = cos(2u + 3v) 3 = 3 normalizálás: / sqrt(14) N = B×T = [0-2 0-3 1-0] = [-2 -3 1]
Koordináta-rendszerek Egy pont valamilyen viszonyítási ponthoz képest (origo) 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 = OM + 3Mx + 4My My OM origó Mx
Világ: kitüntetett fő-rendszer ebben legyen minden az árnyaláshoz modell origo itt van [3 3] Lokális Model Ezekkel adjuk meg az objektum elhelyezkedését Mx = 3/25 Wx – 4/25 Wy My = 4/25 Wx + 3/25 Wy [3 4] P = 3Mx + 4My Wy OW origó Wx
Világkoordináták kiszámolása OM [3,3] P = 4Wx + 3Wy [4 3] Lokális Model Mx = 3/25 Wx – 4/25 Wy My = 4/25 Wx + 3/25 Wy [3 4] P = 3Mx + 4My P = OM + 3Mx + 4My P = 3 Wx+ 3 Wy + 3 (3/25 Wx – 4/25 Wy)+ 4 (4/25 Wy + 3/25 Wy) = 3 Wx+ 3 Wy + (9 + 16)/25 Wx + (12-12) Wy = 4Wx + 3Wy Wy OW origó Wx
Ez a számítás mátrix formában (modellezési transzformáció) P = 3 Wx+ 3 Wy + 3 (3/25 Wx – 4/25 Wy)+ 4 (4/25 Wy + 3/25 Wy) [4 3] = [3+3*3/25+4*4/25 3-3*4/25+4*3/25] mindig fix OM My Mx 3/25 -4/25 0 4/25 3/25 0 3 3 1 [4 3 1] = [3 4 1] mindig fix
Árnyalás világ-koordinátákban X árnyalt felületi pont E szem pozíciója [4 3] V V nézeti irány L = (S-X)/|S-X| V = (E-X)/|E-X| [6 3] L L megvilágítás iránya [4 1] Wy S fényforrás pozíciója OW origó Wx 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 [1 1] [-1 -1] [0 0] [345 234]
Kamera koordináta rendszer Cx = [-1 1] kamera koordináták E [4 3] [6 3] [4 3] = E + xC*Cx + zC*Cz Cz = [-1 -1] egyenletrendszer x,z-re 4 = 6 + xC*(-1) + zC*(-1) 3 = 3 + xC*(-1) + zC*(1) xC= 1, zC = 1 Wy OW origó Wx
Kamera koordináta számítás mátrix formában (NEM a kamera trafó mátrix) [4 3] = E + xC*Cx + zC*Cz [4 3] = E + xC*[-1 -1] + zC*[-1 1] mindig fix E Cy Cx -1 -1 0 -1 1 0 6 3 1 [4 3 1] = [1 1 1] mindig fix
Kamera trafó mátrix -1 -1 -1 0 -1 1 0 6 3 1 [4 3 1] = [1 1 1] -1 -1 0 -1 -1 0 -1 1 0 6 3 1 [4 3 1] = [1 1 1] -1 -1 -1 0 -1 1 0 6 3 1 [4 3 1] = [1 1 1]
Képernyő koordináta rendszer hova vetül a képernyőn xJ Jx milyen messze (takaráshoz kell) 1 zJ Jz Wy ablak a virtuális világra OW origó Wx
Képernyőkoordináta számítása hasonló háromszögek xC = xJ * zC xJ = xC / zC xJ Jx 1 xC zC zJ Jz ablak a virtuális világra
Ha a látószög nem 90 fok Jx xC = xJ * zC xJ = xC / zC xJ 1 xC zC zJ Jz itt van az 1.0 így ez 0.5 hasonló háromszögek Jx xC = xJ * zC xJ = xC / zC xJ FOV 1 xC zC Jx az egység Osztani kell az ablakunk fél szélességével zJ Jz xJ = (xC / zC) / tan(FOV/2) 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 xJhomo / hJhomo = (xC / zC) / tan(FOV/2)
Perspektív trafó mátrix xJhomo / hJhomo = (xC / zC) / tan(FOV/2) ez a képernyő-pozíció szempontjából nem érdekes 1/tan(FOV/2) ? 0 0 ? 1 0 ? 0 [xJhomo ? hJhomo] = [xC zC 1] zC xC / tan(FOV/2)
Mi legyen a Z? A takaráshoz kell Tartsa meg a kamera koordinátarendszer-beli 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 0 A 1 0 0 0 [xJhomo ? hJhomo] = [xC zC 1] = A A*zC zC mindig A: elveszne a mélység info
0 < ZJ <1 tartomány legyen fp < ZC < 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
OpenGL ehhez képest ide rakja az ablakot Jz -1 Jx kamera a –z felé néz
de ezt összrakja az OpenGL Ezért a z sor - 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 de ezt összrakja az OpenGL gluPerspective()
Miért jó, hogy minden számítás mátrix-szorzás? (((r M1) M2) M3) = r (M1 M2 M3) 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
Vágás Cohen-Sutherland: szakasz Sutherland-Hodgeman: sokszög (hsz is) A lényeg hogy egy szakasz metszéspontját megtaláljuk a vágósíkkal szakasz paraméteres egyenlete (t) vágósík (2D ben egyenes) egyenlete meg kell oldani az egyenletrenszert t-re r(t) = t*r0 + (1-t)r1 ; 0 < t < 1
Vágás példa 2Dben vágjuk erre a fésíkra: x+y > 4 r1 = [4 4] 4 + 4 > 4, bent van r1 = [4 4] r0 = [1 1] 1 + 1 < 4, kint van
Egyenletek Szakasz egyenlete Ezzel az egyenessel kell a metszéspont Behelyettesítve x(t) = t x0 + (1-t)x1 y(t) = t y0 + (1-t)y1 x + y = 4 t x0 + (1-t)x1 + t y0 + (1-t)y1 = 4 t (x0 - x1 + y0 – y1) + x1 + y1 = 4 t (1 - 4 + 1 - 4) + 4 + 4 = 4 -6 t = -4 t = 2/3; x(2/3) = 1 * 2/3 + 4 * 1/3 = 6/3 = 2 y(2/3) = 1 * 2/3 + 4 * 1/3 = 6/3 = 2
Vágás példa 2Dben vágjuk erre a fésíkra: x+y > 4 r1 = [4 4] 4 + 4 > 4, bent van r1 = [4 4] rc = [2 2] r0 = [1 1] 1 + 1 < 4, kint van
Háromszögek vágása Nem valami általános félsíkra szokott előfordulni, inkább pl. x > -1 Sutherland-Hodgeman VAGY 4 eset mind kint: nincs bent semmi mind bent: az eredeti hsz marad 2 kint: a két szakaszra vágunk, 3 csúcs marad, 1 db hsz 1 kint: a két szakaszra vágunk, 4 csúcs lesz, 2 db hsz
Szakasz vágás 3D Ugyanez a menete De volt egy perspektív trafó eredeti szakaszokat homogén szakaszokba viszi, ami nem biztos hogy tényleg szakasz
ablak a virtuális világra Átfordulási probléma itt kellene látszania nem a két vetületi pont között ide vetül ide vetül 1 ablak a virtuális világra
Ezért először vágunk, aztán vetítünk ami ezen kívül van, nem kerül a képernyőre, erre vágunk itt kellene látszania nem a két vetületi pont között ide vetül metszéspont ablak a virtuális világra
Szakasz vágás homogén koordinátákban Szakasz egyenlete ugyanaz Vágósík egyenlete lesz más r(t) = t*r0 + (1-t)r1 ; 0 < t < 1 pl. x > -1 helyett xh > -h
Példa ez bent van ez kint van Vágjuk a [2 3 4 1] – [5 6 -7 -1] szakaszt a z > 1 féltérre (homogénben: z > h) Szakasz egyenlete (csak a z meg a h fog kelleni a t meghatározásához) Vágósík egyenlete x(t) = t x0 + (1-t)x1 y(t) = t y0 + (1-t)y1 z(t) = t z0 + (1-t)z1 = (4 + 7)t - 7 = 11t - 7 h(t) = t h0 + (1-t)h1 = (1 - (-1))t - 1 = 2t - 1 z(t) = h(t); 11t - 7 = 2t - 1; t = 6/9 = 2/3
t vissza a szakasz egyenletébe x(t) = 2/3 x0 + (1-2/3)x1 = 2/3 * 2 + 1/3 * 5 = 9/3 = 3 y(t) = 2/3 y0 + (1-2/3)y1 = 2/3 * 3 + 1/3 * 6 = 12/3 = 4 z(t) = 2/3 z0 + (1-2/3)z1 = 2/3 * 4 + 1/3 * (-7) = 1/3 h(t) = 2/3 h0 + (1-2/3)h1 = 2/3 - 1/3 = 1/3 az eredmény [3 4 1/3 1/3] jöhet a homogén osztás (minden / 1/3) [9 12 1 1] az eredményül kapott vágott szakasz: [2 3 4 1] - [9 12 1 1] => [2 3 4] - [9 12 1] a pont a vágósíkon kell legyen
Vizsgapélda x y h x y h Vágósíkok x <= h bent kint x >= -h bent bent y <= h bent bent y >= -h bent kint x = 1 t + 1 (1 -t) = 1 y = 1 t - 11 (1 - t) = 12t - 11 h = 3 t - 1 (1 - t) = 4t - 1 [1 3 1] Tp = [1 1 3] [1 -1 1]Tp = [1 -11 -1] x=h; 1 = 4t - 1; t = ½ y=-h; 12t - 11 = -4t +1; t = ¾ t = ¾ van közelebb a belső ponthoz ¾ [1 1 3] + ¼ [1 -11 -1] = [1 -8/4 8/4] = [1 -2 2] -> [0.5 -1]
Felületi pont árnyalása OpenGL kamerakoordinátában csinálja de az is jó Kellhet hozzá (VILÁG koordinátában) L fényirány (|L|=1), bejövő radiancia I(L) (minden irányból ahonnan jön fény) N normálvektor (|N|=1) V szemirány, nézeti irány (|V|=1) BRDF(felület fényvisszaverő tulajdonsága) diffúz kd spekuláris ks, n (exponens) ideális kr
Árnyalás jelölések N normálvektor V nézeti irány L fényirány R ideális visszaverődési irány Q Y x: felületi pont
Absztrakt fényforrás típusok Irány (pl. [5 3 2] irányból [2 3 4] RGB radiancia) L adott, csak normalizálni kell I(L) adott, mindenhol ugyanannyi, minden más irányból 0 Pontszerű (pl. [2 3 4] pozícióban [4 5 6] Watt RGB teljesítményű) L = (S-X)/|S-X|; S a fény pozíció X az árnyalt pont I(L) = F / (4|S - X|2 p) fény távolsága teljesítmény 4r2p : gömb felülete, ekkora felületen oszlik el a teljesítmény
Égboltfény I(L) adott, általában konstans (minden bejövő irányra ugyananyi a radiancia) minden pontban érvényes diffúz és ideális tükör visszaverődés esetén könnyű, spekulárisnál integrálni kellene
L, N, V-ből számítható cosQ – fény beesési szögének cosinusa cosQ = L·N R – ideálisan visszavert fény iránya L “tükörképe” a normálvektorra R = 2N(L·N) – L (lásd skalárszorzat mire jó) cosY – nézeti mennyire tér el az ideálistól cosY = R·V
A alapegyenlet (rendering equ) L(x,w)=Le(x,w)+L(h(x,-w’),w’) fr(’,x,) cos’dw’ A mi jelöléseinkkel a lényeg: beesési szög BRDF IV = I(L) cos fr( V,L) dL V irányú kimenő radiancia összegezni minden bejövő irányra az onnan bejövő radiancia egységnyi felületre beeső és V irányba visszavert részét
Irány és pontfényforrás esetén Csak egy irányból jön be fény, nem kell integrálni IV = I(L) cos fr( V,L) ezek mind adottak vagy számíthatóak diffúz (BRDF = kd) IV = Iin (N·L) BRDF IV = Iin (N·L) kd ideális (ha R=V, BRDF = kr / cos ) IV = Iin kr Phong (BRDF = ks cosnY / cos ) IV = Iin (R·V)n ks
Konstans égboltfény + diffúz IV = I(L) cos fr( V,L) dL kd, mert diffúz nem függ az iránytól mert konstans az égbolt IV = Iégbolt cos kd dL IV = Iégbolt kd cos dL p albedo
Égboltfény + ideális Csak az az irány érdekes, aminek az ideális visszaverődési iránya a szemirány RV = 2N(V·N) – V Az innen bejövő radiancia kr szerese megy a szemirányba Ehhez nem kell hogy konstans legyen az ég IV = Iégbolt(RV) kr