Vektorok különbsége e x e-x szempozíció árnyalt felületi pont pozíciója nézeti irány (nem normalizált) e-x = [e x -x x e y -x y e z -x z ]
Jan 21, 2016
Vektorok különbsége
e
x
e-x
szempozíció
árnyalt felületi pontpozíciója
nézeti irány(nem normalizált)
e-x = [ex-xx ey-xy ez-xz]
Vektorok hossza
v
|v| = √ (vx*vx + vy*vy + vz*vz)
|v|
Normalizált nézeti irány
e
x
szempozíció
árnyalt felületi pontpozíciója
V: nézeti irány(normalizált)
e-x = [ex-xx ey-xy ez-xz]
V= (e-x)/|e-x|
Két vektor skalárszorzata(dot product)
a
b
a·b = axbx + ayby + azbz
skalár(egy szám)
a·b = |a||b| cos
Mire jó a skalárszorzat? 1.v-nek n irányú része
v
n n egységnyi hosszú kell legyen
vtöbbi
vn
|vn| = |v| cos = |v| |n| cos = v·n
vn = n |vn|
derékszögűháromszög
|n| = 1
skalárszorzat
Például: falról visszapattanó labda, tökéletes visszaverődés iránya
V
NVmerőleges
Vpárhuzamos
V: bejövő sebesség
kimenő sebesség
Vout
V = Vpárhuzamos + Vmerőleges
Vout = Vpárhuzamos - Vmerőleges
Fal
N: fal normálvektora
Vmerőleges = -N(V·(-N))
Vpárhuzamos = V - Vmerőleges
Vout = V - 2N(V·N)
Mire jó a skalárszorzat? 2.a és b közötti szög cosinusa
a
b a és b egységnyi hosszú kell legyen
cos = |a| |b| cos = a·b
|a| = |b| = 1
Például: diffúz felület árnyalása
L
N
L: fényirány (normalizált)
kimenő radiancia(nem függ a nézeti iránytól, mert diffúz)
Iout
Fal
N: árnyalt felületnormálvektora(normalizált)
Iout = Iin kd cos
Iin: bejövő radiancia
kd: diffúz BRDF paraméter
: fény beesési szöge
Iout = Iin kd L·N
Két vektor vektoriális szorzata(keresztszorzat, cross product)
a
b
a×b = [aybz-azby azbx-axbz axby-aybx]
a×b
|a×b| = |a||b|sin
a·|a×b| = 0 b·|a×b| = 0
merőleges a-ra és b-re
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
z(u,v) = sin(2u + 3v )
x(u,v) = uy(u,v) = v
felület paraméteres egyenlete legyen:
Mi a normálvektora a u=v=0 pontban?
z(u,v) / u = cos(2u + 3v) 2 = 2
x(u,v) / u = 1y(u,v) / u = 0
z(u,v) / v = cos(2u + 3v) 3 = 3
x(u,v) / v = 0y(u,v) / v = 1
T érintő (tangens)
B érintő (binormál)
N = B×T = [0-2 0-3 1-0] = [-2 -3 1]
normalizálás: / sqrt(14)
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
OM
origóMx
My
[3 4]P = OM + 3Mx + 4My
Világ: kitüntetett fő-rendszer ebben legyen minden az árnyaláshoz
OW
origóWx
WyLokális
Model [3 4]
P = 3Mx + 4M
y
modell origo itt van[3 3]
Ezekkel adjuk meg az objektum
elhelyezkedésétMx = 3/25 Wx – 4/25 Wy
My = 4/25 Wx + 3/25 Wy
Világkoordináták kiszámolása
Wx
WyLokális
Model [3 4]
P = 3Mx + 4M
y
OM
[3,3]
Mx = 3/25 Wx – 4/25 Wy
My = 4/25 Wx + 3/25 Wy
P = 4Wx + 3Wy
[4 3]
OW
origó
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
Ez a számítás mátrix formában (modellezési transzformáció)
[4 3 1] = [3 4 1]
3/25 -4/25 0
4/25 3/25 0
3 3 1
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]
OM
My
Mx
mindig fix
mindig fix
Árnyalás világ-koordinátákban
OW
origóWx
Wy
[4 3]
[4 1]
[6 3]
S fényforrás pozíciója
E szem pozíciójaX árnyalt felületi pont
LL megvilágítás iránya
V
V nézeti irány
Minden világ-ban adott
L = (S-X)/|S-X|V = (E-X)/|E-X|
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
OW
origóWx
Wy
[4 3][6 3]
Cx = [-1 1]
Cz = [-1 -1]
[4 3] = E + xC*Cx + zC*Cz
kamera koordináták
egyenletrendszer x,z-re
E
4 = 6 + xC*(-1) + zC*(-1)3 = 3 + xC*(-1) + zC*(1)xC= 1, zC = 1
Kamera koordináta számítás mátrix formában
(NEM a kamera trafó mátrix)
[4 3 1] = [1 1 1]
-1 -1 0
-1 1 0
6 3 1 E
Cy
Cx
mindig fix
mindig fix
[4 3] = E + xC*Cx + zC*Cz [4 3] = E + xC*[-1 -1] + zC*[-1 1]
Kamera trafó mátrix
[4 3 1] = [1 1 1]
-1 -1 0
-1 1 0
6 3 1
[4 3 1] = [1 1 1]
-1 -1 0
-1 1 0
6 3 1
-1
Képernyő koordináta rendszer
OW
origóWx
Wyablak a virtuális világra
Jz
Jx
xJ
zJ
hova vetül a képernyőn
milyen messze(takaráshoz kell)
1
Képernyőkoordináta számítása
ablak a virtuális világra
Jz
xC = xJ * zC
xJ = xC / zC xC zC
1
hasonló háromszögek
Jx
xJ
zJ
Ha a látószög nem 90 fok
ablak a virtuális világra
Jz
xC = xJ * zC
xJ = xC / zC xC zC
1
hasonló háromszögek Jx
xJ
zJ
Jx az egységOsztani kell az ablakunk fél szélességével
így ez 0.5itt van az 1.0
FOV
FOVlátószög
xJ = (xC / zC) / tan(FOV/2)
Ha FOV = 90 fokakkor ez 1
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átrixxJhomo / hJhomo = (xC / zC) / tan(FOV/2)
[xJhomo ? hJhomo] = [xC zC 1]
1/tan(FOV/2) ? 0
0 ? 1
0 ? 0
xC / tan(FOV/2)
zC
ez a képernyő-pozíció szempontjából nem érdekes
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:
[xJhomo ? hJhomo] = [xC zC 1]
1/tan(FOV/2) 0 0
0 A 1
0 0 0zCA*zC = Amindig A: elveszne a mélység info
kell valamit ide is írni
0 < ZJ <1 tartomány legyenfp < ZC < bp
1/(tg(fov/2)) 0 00 (fp+bp)/(bp-fp) 10 -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 00 1/(tg(fov/2)) 0 00 0 (fp+bp)/(bp-fp) 10 0 -2fp*bp/(bp-fp) 0
OpenGL ehhez képestide rakja az ablakot
Jz
Jx-1
kamera a –z felé néz
Ezért a z sor -
1/(tg(fov/2)*asp) 0 0 00 1/(tg(fov/2)) 0 00 0 -(fp+bp)/(bp-fp) -10 0 -2fp*bp/(bp-fp) 0
de ezt összrakja az OpenGLgluPerspective()
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 egyetlenmá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 tudunkhaté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
r0 = [1 1]
r1 = [4 4]
vágjuk erre a fésíkra:x+y > 4
4 + 4 > 4, bent van
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 = 4t (x0 - x1 + y0 – y1) + x1 + y1 = 4t (1 - 4 + 1 - 4) + 4 + 4 = 4-6 t = -4t = 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
r0 = [1 1]
r1 = [4 4]
vágjuk erre a fésíkra:x+y > 4
4 + 4 > 4, bent van
1 + 1 < 4, kint van
rc = [2 2]
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
Átfordulási probléma
ablak a virtuális világra
1ide vetül
ide vetül
itt kellenelátszania
nem a két vetületipont között
Ezért először vágunk, aztán vetítünk
ablak a virtuális világra
metszéspont
itt kellenelátszania
nem a két vetületipont között
ami ezenkívül van,nem kerül
a képernyőre,erre vágunk
ide vetül
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
• 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 - 7h(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
ez bent van ez kint van
t vissza a szakasz egyenletébex(t) = 2/3 x0 + (1-2/3)x1 = 2/3 * 2 + 1/3 * 5 = 9/3 = 3y(t) = 2/3 y0 + (1-2/3)y1 = 2/3 * 3 + 1/3 * 6 = 12/3 = 4z(t) = 2/3 z0 + (1-2/3)z1 = 2/3 * 4 + 1/3 * (-7) = 1/3h(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 avágósíkonkell legyen
Vizsgapélda
[1 3 1] Tp = [1 1 3] [1 -1 1]Tp = [1 -11 -1]Vágósíkokx <= h bent kintx >= -h bent benty <= h bent benty >= -h bent kint
x = 1 t + 1 (1 -t) = 1y = 1 t - 11 (1 - t) = 12t - 11h = 3 t - 1 (1 - t) = 4t - 1
x y h x y h
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
• 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
OpenGLkamerakoordinátában csinálja
de az is jó
Árnyalás jelölések
x: felületi pont
N normálvektor
L fényirány
R ideálisvisszaverődésiirány
V nézeti irány
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) = / (4|S - X|2
teljesítmény
fény távolsága
4r2 : 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ó
• cos– fény beesési szögének cosinusa– cos = 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ó)
• cos – nézeti mennyire tér el az ideálistól– cos = R·V
A alapegyenlet (rendering equ)
L(x,)=Le(x,)+L(h(x,-’,’) fr(’,x,) cos’d’
IV = I(L) cos fr( V,L) dL
A mi jelöléseinkkel a lényeg:
V irányú kimenőradiancia
összegezni mindenbejövő irányra
az onnan bejövő radiancia
egységnyi felületrebeeső
és V irányba visszavertrészét
beesésiszög
BRDF
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
IV = Iin (N·L) BRDF• diffúz (BRDF = kd)
IV = Iin (N·L) kd
• ideális (ha R=V, BRDF = kr / cos )
IV = Iin kr• Phong (BRDF = ks cosn / cos )
IV = Iin (R·V)n ks
Konstans égboltfény + diffúz
IV = I(L) cos fr( V,L) dL
IV = Iégbolt cos kd dL
nem függ az iránytól mertkonstans az égbolt
kd, mert diffúz
IV = Iégbolt kd cos dL
albedo
Égboltfény + ideális
IV = Iégbolt(RV) kr
• 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