530 likes | 763 Views
Vektorok különbsége. e-x = [e x -x x e y -x y e z -x z ]. szempozíció. nézeti irány (nem normalizált). e. e-x. x. árnyalt felületi pont pozíciója. Vektorok hossza. |v| = √ ( v x *v x + v y *v y + v z *v z ). | v |. v. Normaliz ált nézeti irány.
E N D
Vektorok különbsége e-x = [ex-xx ey-xy ez-xz] 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 kimenő sebesség N: fal normálvektora
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 N Fal 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 [34] P = OM+ 3Mx + 4My My OM origó Mx
Világ: kitüntetett fő-rendszer ebben legyen minden az árnyaláshoz modell origo itt van [33] Lokális Model Ezekkel adjuk meg az objektum elhelyezkedését [34] P = 3Mx + 4My Mx= 3/25 Wx – 4/25 Wy My= 4/25 Wx + 3/25 Wy Wy OW origó Wx
Világkoordináták kiszámolása OM [3,3] P = 4Wx + 3Wy [43] Lokális Model [34] P = 3Mx + 4My Mx= 3/25 Wx – 4/25 Wy My= 4/25 Wx + 3/25 Wy 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
Mx My OM 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 3/25 -4/25 0 4/25 3/25 0 3 3 1 [43 1]= [3 4 1] mindig fix
Vnézeti irány V Árnyalás világ-koordinátákban Xárnyalt felületi pont Eszem pozíciója [43] L = (S-X)/|S-X| V = (E-X)/|E-X| [63] L Lmegvilá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 [11] [-1-1] [0 0] [345 234]
Kamera koordináta rendszer Cx= [-11] kamera koordináták E [43] [63] [43] = 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
Cx Cy E Kamera koordináta számítás mátrix formában(NEM a kamera trafó mátrix) [43] = E + xC*Cx + zC*Cz [43] = E + xC*[-1 -1] + zC*[-1 1] mindig fix -1 -1 0 -1 1 0 6 3 1 [43 1]= [1 11] mindig fix
Kamera trafó mátrix -1 -1 0 -1 1 0 6 3 1 [43 1]= [1 11] -1 -1 -1 0 -1 1 0 6 3 1 [43 1]= [1 11]
Képernyő koordináta rendszer hova vetül a képernyőn xJ Jx 1 milyen messze (takaráshoz kell) 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 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]= [xCzC 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)00 0 A1 0 00 [xJhomo? hJhomo]= [xCzC 1] = A A*zC zC mindig A: elveszne a mélység info
0 < ZJ<1 tartomány legyenfp < 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
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 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 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
ide vetül ide vetül Átfordulási probléma itt kellene látszania nem a két vetületi pont között 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/3y0 + (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 31] 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) cosfr( 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) cosfr( 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=Iinkr • Phong (BRDF = kscosnY / cos) IV=Iin(R·V)n ks