Máté: Számítógépes grafika alapjai
Bevezetés - Transzformációk
Geometriai transzformációk
P
y P’(x’,y’) P(x,y) T
ζ
A Számítógépes Grafikában használatos 2- és 3- dimenziós transzformációk: eltolás nagyítás, kicsinyítés (skálázás) forgatás
P’
(dx,dy) ζ
x
Pont 2D eltolása
Szakasz 2D eltolása
Hosszak és a szögek változatlanok y
x’=x+dx y’=y+dy (oszlop-)vektorokkal:
P’(x’,y’) P(x,y)
y B
x
A A’
P’=P+T
x
T
2D nagyítás/kicsinyítés
2D forgatás
A szögek változatlanok Szokták a kettőt együtt SKÁLÁZÁSKÉNT említeni Origóból történő nagyítás P’
P
x’=x·sx y’=y·sy (oszlop-)vektorokkal: ⎛ Sx ⎛x⎞ ⎛ x' ⎞ P = ⎜⎜ ⎟⎟ P ' = ⎜⎜ ⎟⎟ S = ⎜⎜ ⎝y ⎠ ⎝ y '⎠ ⎝0
A’=A+T B’=B+T
B’
⎛x⎞ ⎛ x' ⎞ ⎛ dx ⎞ P = ⎜⎜ ⎟⎟ P ' = ⎜⎜ ⎟⎟ T = ⎜⎜ ⎟⎟ ⎝y ⎠ ⎝ y '⎠ ⎝ dy ⎠
(dx,dy)
T
Elegendő az új végpontokat számolni
A hosszak és a szögek változatlanok Origó körüli forgatás
P
x’ = x·cos ζ - y·sin ζ y’ = x·sin ζ + y·cos ζ
ζ P’
0 ⎞ ⎟ Sy ⎟⎠
ζ
⎛ cos ζ ⎛ x' ⎞ ⎜⎜ ⎟⎟ R = ⎜⎜ ⎝ sin ζ ⎝ y '⎠
− sin ζ ⎞⎛ x ⎞ ⎟⎜ ⎟ cos ζ ⎟⎠⎜⎝ y ⎟⎠
P’ = R · P
P’=S·P
09_trafo
1
Máté: Számítógépes grafika alapjai
Homogén koordináták
Kapcsolat 2D és 3D közt
(x, y) jelölése homogén koordinátákkal: (x, y, w) (t·x, t·y, t·w) egyenes a 3D térben
z
Egyenlőség: (x,y,w) = (x’,y’,w’) , ha van olyan α : hogy x’= α·x, y’= α·y, w’= α·w pl: (2, 3, 6) = (4, 6, 12)
P(x,y,w)
Egy ponthoz végtelen sok (x,y,w) tartozik. Ha w=0, akkor (x,y,w) végtelen távoli pont
2D eltolás - matematikailag ⎛1 0 dx ⎞ ⎜ ⎟ ahol T (d x , d y ) = ⎜ 0 1 d y ⎟ ⎜0 0 1 ⎟ ⎝ ⎠
⎛ x ' ⎞ ⎛ 1 0 d x ⎞⎛ x ⎞ ⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ y ' ⎟ = ⎜ 0 1 d y ⎟⎜ y ⎟ ⎜ 1 ⎟ ⎜ 0 0 1 ⎟⎜ 1 ⎟ ⎝ ⎠ ⎝ ⎠⎝ ⎠
Ismételt eltolások (kompozíció): P P’ P’’ T(dx1, dy1) T(dx2, dy2) P’ = T(dx1, dy1) P , P’’= T(dx2, dy2) P’ = T(dx2, dy2) (T(dx1, dy1) P) ⎛ 1 0 d x1 ⎞⎛ 1 0 d x 2 ⎞ ⎛ 1 0 d x1 + d x 2 ⎞ ⎜ ⎟⎜ ⎟ ⎜ ⎟ T (d x1 + d x 2 , d y1 + d y 2 ) = ⎜ 0 1 d y1 ⎟⎜ 0 1 dy 2 ⎟ = ⎜ 0 1 d y1 + d y 2 ⎟ ⎜ 0 0 1 ⎟⎜ 0 0 1 ⎟ ⎜ 0 0 ⎟ 1 ⎝ ⎠⎝ ⎠ ⎝ ⎠
2D forgatás - matematikailag ⎛ x ' ⎞ ⎛ cos ζ ⎜ ⎟ ⎜ ⎜ y ' ⎟ = ⎜ sin ζ ⎜1 ⎟ ⎜ 0 ⎝ ⎠ ⎝
P’=R(ζ) P
− sin ζ cos ζ 0
0 ⎞⎛ x ⎞ ⎟⎜ ⎟ 0 ⎟⎜ y ⎟ 1 ⎟⎠⎜⎝ 1 ⎟⎠
(R(ζ) ortogonális)
Ismételt forgatások: P’ = R(ζ1) P, P’’= R(ζ2) P’ = R(ζ 2) (R(ζ1 ) P) = R(ζ1+ ζ2 ) P Bizonyítás: Házi Feladat
09_trafo
x
P vetülete a w=1 síkon
y A végtelen távoli pontok nincsenek a síkon
(0,0,0) nem megengedett!
P’ = T(dx, dy) P ,
⎛x y ⎞ ⎜ , , 1⎟ ⎝w w ⎠
2D skálázás - matematikailag ⎛ x' ⎞ ⎛ sx ⎜ ⎟ ⎜ ⎜ y '⎟ = ⎜ 0 ⎜1 ⎟ ⎜ 0 ⎝ ⎠ ⎝
P’ = S(sx, sy) P ,
0 sy 0
0 ⎞⎛ x ⎞ ⎟⎜ ⎟ 0 ⎟⎜ y ⎟ 1 ⎟⎠⎜⎝ 1 ⎟⎠
Ismételt skálázások (kompozíció): P P’ P’’ S(sx1, sy1) S(sx2, sy2) P’ = S(sx1, sy1) P , P’’= S(sx2, sy2) P’ = S(sx2, sy2) (S(sx1, sy1) P) 0 0⎞ ⎛ sx 2 0 0 ⎞⎛ sx1 0 0 ⎞ ⎛ sx 2sx1 ⎜ ⎟⎜ ⎟ ⎜ ⎟ S(sx1 sx 2 , sy1 sy 2 ) = ⎜ 0 sy1 0 ⎟⎜ 0 sy1 0 ⎟ = ⎜ 0 sy 2 sy1 0 ⎟ ⎜0 ⎟ ⎜ ⎟ ⎜ 0 1 ⎠⎝ 0 0 1 ⎠ ⎝ 0 0 1 ⎟⎠ ⎝
2D nyírás – affin transzformációk A hosszak és a szögek változhatnak Párhuzamos egyenesek képe párhuzamos ⎛1 a 0 ⎞ ⎜ ⎟ SH x = ⎜ 0 1 0 ⎟ ⎜0 0 1 ⎟ ⎝ ⎠
⎛1 0 0 ⎞ ⎜ ⎟ SH y = ⎜ b 1 0 ⎟ ⎜0 0 1 ⎟ ⎝ ⎠
⎛ x ' ⎞ ⎛ 1 a 0 ⎞⎛ x ⎞ ⎛ x + ay ⎞ ⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎜ y ' ⎟ = ⎜ 0 1 0 ⎟⎜ y ⎟ = ⎜ y ⎟ ⎜ 1 ⎟ ⎜ 0 0 1 ⎟⎜ 1 ⎟ ⎜ 1 ⎟ ⎝ ⎠ ⎝ ⎠⎝ ⎠ ⎝ ⎠
SHx
SHy
Affin transzformáció: eltolások, skálázások, forgatások és nyírások tetszőleges számú és sorrendű egymás utáni alkalmazásával kapott transzformáció
2
Máté: Számítógépes grafika alapjai
2D transzformációk kompozíciója 1. példa
2D transzformációk kompozíciója 2. példa
Forgatás ζ-val egy tetszőleges P(x,y) pont körül. a) eltolás P-ből O-ba T(-x,-y) b) forgatás az origó körül R(ζ) c) eltolás O-ból P-be T(x,y) ⎛ 1 0 x ⎞⎛ cos ζ ⎟⎜ ⎜ ⎜ 0 1 y ⎟⎜ sin ζ ⎜ 0 0 1 ⎟⎜ 0 ⎠⎝ ⎝ ⎛ cos ζ ⎜ = ⎜ sin ζ ⎜ 0 ⎝
− sin ζ cos ζ 0
T(x,y) · S(sx,sy) · T(-x,-y)
0 ⎞⎛ 1 0 − x ⎞ ⎟ ⎟⎜ 0 ⎟⎜ 0 1 − y ⎟ = 1 ⎟⎠⎜⎝ 0 0 1 ⎟⎠
x (1 − cos ζ ) + y sin ζ y (1 − cos ζ ) − x sin ζ 1
− sin ζ cos ζ 0
Nagyítás egy tetszőleges P(x,y) pontból:
⎞ ⎟ ⎟ ⎟ ⎠
2D transzformációk kompozíciója 3. példa / 1 „Világ koordináta rendszer” (xmax, ymax) y
(xmin, ymin)
Lépések: y y T → 1 x
(umin,vmin) x
x →
S
y →
x
T2
y
x
2D transzformációk kompozíciója 3. példa /3
Mwv
⎛ umax − umin ⎜ ⎜ xmax − xmin ⎜ =⎜ 0 ⎜ 0 ⎜ ⎜ ⎝
0 v max − v min y max − y min 0
− x min − y min
umax − umin ⎞ + umin ⎟ xmax − x min ⎟ v max − v min ⎟ + v min ⎟ y max − y min ⎟ 1 ⎟ ⎟ ⎠
tehát u − umin ⎛ ⎞ + umin ⎟ ⎜ (x − xmin ) max xmax − xmin ⎜ ⎟ P ' = Mwv P (x , y ) = v max − v min ⎜ ⎟ ⎜ (y − y min ) y − y + v min ⎟ max min ⎝ ⎠
09_trafo
⎛ 1 0 x ⎞⎛ s x ⎜ ⎟⎜ ⎜ 0 1 y ⎟⎜ 0 ⎜ 0 0 1 ⎟⎜ 0 ⎝ ⎠⎝
0 sy 0
0 ⎞⎛ 1 0 − x ⎞ ⎟⎜ ⎟ 0 ⎟⎜ 0 1 − y ⎟ = 1 ⎟⎠⎜⎝ 0 0 1 ⎟⎠
⎛ sx ⎜ =⎜ 0 ⎜0 ⎝
0 sy 0
x (1 − s x )⎞ ⎟ y (1 − s y )⎟ ⎟ 1 ⎠
2D transzformációk kompozíciója 3. példa /2
„Képernyő koordináta rendszer ” (u ,vmax) max y
transzformáció → MWV
=
x
⎛ u − umin v max − v min ⎞ ⎟⎟T (− xmin ,− y min ) = Mwv = T (umin , v min )S ⎜⎜ max , ⎝ xmax − xmin y max − y min ⎠ ⎛ umax − umin ⎞ 0 0⎟ ⎜ ⎟⎛ 1 0 − xmin ⎞ ⎛ 1 0 umin ⎞⎜ xmax − xmin ⎜ ⎟⎜ ⎟ v max − v min ⎟⎜ = ⎜ 0 1 v min ⎟⎜ 0 0 ⎟⎜ 0 1 − y min ⎟ = y − y max min ⎜ 0 0 1 ⎟⎜ ⎟⎜ 1 ⎟⎠ ⎝ ⎠⎜ 0 0 1 ⎟⎝ 0 0 ⎜ ⎟ ⎝ ⎠ u − umin ⎞ ⎛ umax − umin − xmin max + umin ⎟ 0 ⎜ x max − xmin ⎟ ⎜ xmax − xmin v max − v min v − v min ⎟ ⎜ − y min max + v min ⎟ =⎜ 0 y max − y min y max − y min ⎟ ⎜ 0 0 1 ⎟ ⎜ ⎟ ⎜ ⎠ ⎝
Általános kompozíció mátrix Könnyű látni, hogy skálázások, forgatások, nyírások és eltolások kompozíciója skálázás/forgatás utáni eltolásként értelmezhető: r: skálázás/forgatás, t: eltolás
⎛ 1 0 t x ⎞⎛ r11 ⎜ ⎟⎜ M = ⎜ 0 1 t y ⎟⎜ r21 ⎜ 0 0 1 ⎟⎜ 0 ⎝ ⎠⎝
r12 r22 0
0 ⎞ ⎛ r11 ⎟ ⎜ 0 ⎟ = ⎜ r21 1 ⎟⎠ ⎜⎝ 0
r12 r22 0
tx ⎞ ⎟ ty ⎟ 1 ⎟⎠
Az M alakú mátrixokat kompozíció mátrixoknak nevezzük
3
Máté: Számítógépes grafika alapjai
3D koordináta-rendszerek
Gyorsítások ⎛ r11 ⎜ M = ⎜ r21 ⎜0 ⎝
r12 r22 0
tx ⎞ ⎟ ty ⎟ 1 ⎟⎠
M·P számításakor: 1. 9 szorzás és 6 összeadás helyett elegendő x’ = x·r11 + y·r12 + tx y’ = x·r21 + y·r22 + ty kiszámítása, ami csak 4 szorzás és 4 összeadás 2. Ha kicsi ζ szöggel forgatunk, akkor cos ζ⋍1, így x’ = x·cos ζ - y·sin ζ ⋍ x - y·sin ζ y’ = x·sin ζ + y·cos ζ ⋍ x·sin ζ + y, ami csak 2 szorzás és két összeadás (+ sin kiszámítása)
z z
y
x
x
x’ = α·x, y’ = α·y, z’ = α·z és w’ = α·w
mert
Ha w=0: (x,y,z,0) végtelen távoli pont Kapcsolat: (x,y,z) - egyenes a 4-dimenziós térben aminek a w=1 -re való vetülete a homogén koordináta
0 sy 0 0
0 0 sz 0
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
T −1 (d x , d y , d z ) = T (− d x ,−d y ,−d z )
mert
⎛1 / s x ⎜ ⎜ 0 −1 S (s x , s y , sz ) = ⎜ 0 ⎜ ⎜ 0 ⎝
09_trafo
3D forgatások A z-tengely körül
⎛ x ⎞ ⎛ x ⋅sx ⎞ ⎟ ⎜ ⎟ ⎜ ⎜ y ⎟ ⎜ y ⋅sy ⎟ S (s x , s y , s z )⎜ ⎟ = ⎜ z z⋅ s z ⎟ ⎟ ⎜ ⎟ ⎜ ⎜1 ⎟ ⎜ 1 ⎟ ⎠ ⎝ ⎠ ⎝ 0 0 0 / sy 0 0 1 / sz 0 0
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
0 0 dx ⎞ ⎟ 1 0 dy ⎟ 0 1 dz ⎟ ⎟ 0 0 1 ⎟⎠
⎛ x ⎞ ⎛ x + dx ⎞ ⎜ ⎟ ⎜ ⎟ ⎜ y ⎟ ⎜ y + dy ⎟ T (d x , d y , d z )⎜ ⎟ = ⎜ z z + dz ⎟ ⎜ ⎟ ⎜ ⎟ ⎜1 ⎟ ⎜ 1 ⎟ ⎝ ⎠ ⎝ ⎠
3D skálázás (nagyítás/kicsinyítés) ⎛ sx ⎜ ⎜0 S (s x , s y , sz ) = ⎜ 0 ⎜ ⎜0 ⎝
z
jobbkezes jobb-sodrású
⎛1 ⎜ ⎜0 T (d x , d y , d z ) = ⎜ 0 ⎜ ⎜0 ⎝
(x,y,z,w) = (x’,y’,z’,w’), ha van olyan α, hogy
a szokásos jelölés
y
3D eltolás
(x,y,z) megadása homogén koordinátákkal: (x,y,z,1)
( –xw , –wy , w–z , 1)
x
balkezes bal-sodrású
3D transzformációk - homogén koordináták
Ha w≠0:
y
⎛ cos ξ ⎜ ⎜ sin ξ Rz (ξ ) = ⎜ 0 ⎜ ⎜ 0 ⎝
− sin ξ cos ξ 0 0
Az x-tengely körül 0 0 1 0
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
0 ⎛1 ⎜ ⎜ 0 cos ξ R x (ξ ) = ⎜ 0 sin ξ ⎜ ⎜0 0 ⎝
0 − sin ξ cos ξ 0
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
Az Y-tengely körül ⎛ cos ξ ⎜ ⎜ 0 R y (ξ ) = ⎜ − sin ξ ⎜ ⎜ 0 ⎝
0 sin ξ 1 0 0 cos ξ 0 0
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
4
Máté: Számítógépes grafika alapjai
3D kompozíció-mártix
3D nyírás (Z mentén) ⎛1 ⎜ ⎜0 SH xy (shx , shy ) = ⎜ 0 ⎜ ⎜0 ⎝
0 shx 1 shy 0 1 0
0
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
mert ⎛ x ⎞ ⎛ x + shx z ⎞ ⎜ ⎟ ⎜ ⎟ ⎜ y ⎟ ⎜ y + shy z ⎟ SH xy (shx , shy ) ⎜ ⎟ = ⎜ ⎟ z z ⎜ ⎟ ⎜ ⎟ ⎜1 ⎟ ⎜ 1 ⎟ ⎝ ⎠ ⎝ ⎠
3D - síkok transzformációi
⎛ r11 ⎜ ⎜r M = ⎜ 21 r ⎜ 31 ⎜0 ⎝ ⎛ p1 ⎞ ⎜ ⎟ ⎜p ⎟ P =⎜ 2⎟ p ⎜ 3⎟ ⎜1⎟ ⎝ ⎠
r12 r22
r13 r23
r32 0
r33 0
t1 ⎞ ⎟ T⎞ t2 ⎟ ⎛ R ⎟ = ⎜⎜ ⎟ 0 0 0 1 ⎟⎠ t3 ⎟ ⎝ 1 ⎟⎠
⎛ p1 ⎞ ⎜ ⎟ M P = R ⎜ p2 ⎟ + T ⎜p ⎟ ⎝ 3⎠
Ilyen módon hatékonyabban számítható!
3D - síkok transzformációi
A sík egyenlete: Ax + By + Cz + D = 0 Legyen P a sík tetszőleges pontja!
Legyen P tetszőleges pont a síkban! Ekkor NT P = 0.
⎛ A⎞ ⎛x⎞ ⎜ ⎟ ⎜ ⎟ ⎜B⎟ ⎜y ⎟ Ha P = ⎜ ⎟ , akkor N = ⎜ ⎟ a sík normálisa, C z ⎜ ⎟ ⎜ ⎟ ⎜D⎟ ⎜1 ⎟ ⎝ ⎠ ⎝ ⎠
Ha M-1 létezik, akkor ((M-1)T N)T (M P) = NT ((M-1 )T)T M P = NT P = 0 ⇩ Q=(M-1) T
hiszen NT P = 0 Ha a sík pontjait M-el transzformáljuk, akkor hogy transzformálódik a sík normálisa?
3D koordináta-rendszerek váltása /1 P(j): a P pont az j koordináta-rendszerben Mi←j: transzformáció, amely a j koordináta-rendszerbeli pontokat az i koordináta-rendszerbe viszi át Ekkor P(i) = Mi←j P(j) (j) (k) Ha P = Mj←k P , akkor P(i)= Mi←j P(j) = Mi←j (Mj←k P(k)) = Mi←k P(k) ahol Mi←k = Mi←j Mj←k
09_trafo
Skálázás/forgatás utáni eltolásként értelmezhető:
Melyik az a Q mátrix, amelyre (Q N)T (M P) = 0?
N’ = (M-1)T N (NEM BIZTOS, hogy létezik normális!
Pl: vetítés)
3D koordináta-rendszerek váltása /2 Továbbá Mi←j = Mj←i-1 pl: a) Ha Mi←j =T(tx,ty), akkor Mj←i =T(-tx,-ty). b) Ha R: jobb-kezes koordináta-rendszer L: bal-kezes koordináta-rendszer, akkor
M R ←L = M L ←R
−1
⎛1 ⎜ ⎜0 =⎜ 0 ⎜ ⎜0 ⎝
0⎞ ⎟ 0⎟ 0 −1 0 ⎟ ⎟ 0 0 1 ⎟⎠
0 1
0 0
5
Máté: Számítógépes grafika alapjai
3D - transzformációk alakja
Mátrix műveletek (OpenGL)
(Különböző koordináta-rendszerekben)
OpenGL-ben oszlopfolytonosan tároljuk a mátrixokat Az egység mátrix: ⎛ a1 a5 a9 a13 ⎞
P(j): pont a j koordináta-rendszerben Q(j): transzformáció a j koordináta-rendszerben Melyik az a Q(i), amelyre Q(i) P(i) = Mi←j Q(j) P(j)? Mivel P(i) = Mi←j P(j), ezért
GLfloat 1.0, 0.0, 0.0, 0.0,
M[] = { 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 0.0, 1.0}
⎜ ⎜ a2 ⎜a ⎜ 3 ⎜a ⎝ 4
a6 a7
a10 a11
a8
a12
⎟ a14 ⎟ a15 ⎟ ⎟ a16 ⎟⎠
Új aktuális mátrix betöltése:
Q(i) Mi←j P(j) = Mi←j Q(j) P(j), ⇩
void glLoadMatrix{fd}( T M[16] );
Q(i) Mi←j = Mi←j Q(j)
glMatrixMode(GL_MODELVIEW); glLoadMatrix(M);
Q(i) = Mi←j Q(j) Mi←j-1
// típus // betöltés
Koordináta transzformációk (OpenGL)
Mátrix műveletek (OpenGL) Az aktuális mátrix legyen az egységmátrix: void glLoadIdentity(void); Az aktuális mátrix szorzása: void glMultMatrix{fd}( T M[16] ); Pl.: GLfloat M[] = { 1.0, 0.0, 0.0, 10.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0} glMatrixMode(GL_MODELVIEW); glMultMatrix(M); A szorzat lesz az új aktuális mátrix
• Nézeti (Viewing) a néző (kamera) helyének a megadása • Modell (Modeling) az objektumok (modell) mozgatása • Modell-nézet (ModelView) a nézeti és a modell transzformációk együtt • Vetítési (Projection) a nézet vágása és látótérbe méretezése • Ablak az eredmény ablakra való leképezése
Nézeti koordináták (OpenGL)
Nézeti koordináták (OpenGL)
• A megfigyelő nézőpontja kezdetben (0, 0, 0) • A megfigyelő a z tengely negatív irányába néz. Virtuálisan rögzített koordináta rendszer
A nézeti koordináta rendszer elforgatása 450-kal az ótamutató járásával megegyező irányban
y
y
-z -x x
-x -y
Ahogy a megfigyelő látja a modellt
09_trafo
z -y
x
Így látnánk oldalról a megfigyelőt a pozíciójának a z tengely irányába történő elmozdítása után
6
Máté: Számítógépes grafika alapjai
Nézeti (Viewing) transzformáció (OpenGL) Ez hajtódik végre először, ezt kell legelőször definiálni Nézőpont meghatározása • Kezdeti nézőpont (0, 0, 0) • gluLookAt paranccsal módosítható
Nézeti (Viewing) transzformáció (OpenGL) void gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz) (eyex, eyey, eyez) a szem pozíciója
(centerx, centery, centerz) referenciapont, ahová a szem néz (upx, upy, upz) felfelé mutató vektor (up-vektor,VUP) Pl.: gluLookAt(0.0,0.0,2.0, 0.0,0.0,0.0, 0.0,1.0,0.0);
Nézeti (Viewing) transzformáció (OpenGL)
Modell (Modeling) transzformáció (OpenGL)
A gluLookAt eljárás kiszámítja a megadott nézeti transzformáció inverzét, majd az aktuális mátrixot megszorozza a kapott inverz transzformációs mátrixszal Az altuális mátrix mód a GL_MODELVIEW legyen!
eltolás (transzláció)
forgatás (rotáció)
A modell vagy egy részének a transzformálására használjuk A csúcspont (vertex) koordinátákat transzformálja skálázás
Modell-nézeti dualitás (OpenGL) A nézeti és a modell transzformációk duálisak, ezért elegendő csak a modell koordináta rendszert transzformálni
Modell transzformációk (OpenGL) glMatrixMode(GL_MODELVIEW); void glRotate{fd}(T a, T x, T y, T z); a: forgatás fokban; (x, y, z): forgási tengely
pl. 45 fokos forgatás az x-tengely körül: glRotated(45, 1.0, 0.0, 0.0) void glTranslate{fd}(T x, T y, T z); (x, y, z): az eltolás vektora
pl.: x-tengely mentén 50 egységgel való eltolás glTranslated(50, 0, 0)
nézeti koordináta rendszer mozgatás
09_trafo
modell koordináta rendszer mozgatás
void glScale{fd}(T x, T y, T z ); (x, y, z) skálázás mértéke a tengelyek mentén pl.: glScaled(0.5, 0.5, 0.5)
0.5-szörös uniform nagyítás
7
Máté: Számítógépes grafika alapjai
Vetítési (projection) transzformáció (OpenGL) glMatrixMode(GL_PROJECTION);
Kétféle vetítési lehetőség
ortografikus
és
perspektivikus
Megadjuk a látóteret is Végrehajtás: új projekciómátrix = projekciómátrix · specifikált mátrix
Ortografikus vetítés (OpenGL) void glOrtho(double left, double right, double bottom, double top, double near, double far);
Orthogonális (ortografikus) vetítés vágási terének megadása 2D eset: void gluOrtho2D( double left, double right, double bottom, double top);
Perspektív vetítés (OpenGL)
Perspektív vetítés (OpenGL)
void glFrustum (double left, double right, double bottom, double top, double znear, double zfar); left, right: a bal és jobb
oldali vágósík x koordinátája bottom, top: az alsó és felső
Szimmetrikus látótér megadása: void gluPerspective (double fovy, double aspect, double near, double far); fovy: a látótér szöge y irányban aspect: w/h near, far: a vágósíkok távolsága a megfigyelőtől
vágósík y koordinátája znear, zfar: a közeli és távoli
vágósík z koordinátája. Nézőpont: az origó: (0, 0, 0)
Ablak (OpenGL)
Ablak (OpenGL)
2D-s leképzés az ablak egy téglalap alakú (viewport) részébe: void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
Alapértelmezés: (0, 0, winWidth, winHeight), ahol winWidth és winHeight az ablak méretei
a viewport bal alsó sarka az ablakban,
x, y:
width, height: a viewport mérete pixelben,
y
(0, 0)
09_trafo
(150, 100) Vágási tér x
z=x
y
Ablak 300*200 Viewport 150*100
(150, 100) Vágási x tér
z=x
Ablak, Viewport 300*200
(0, 0)
8
Máté: Számítógépes grafika alapjai
Perspektív vetítés (OpenGL) Pl.: Módosítsuk viewport-ot és a vágási teret perspektív vetítésnél
Transzformációs mátrixok (OpenGL)
void ChangeSize(GLsizei w, GLsizei h){ GLfloat fAspect; if (h == 0) h = 1; // ne ossszunk 0-val // az ablakon beállítjuk a viewport-ot glViewport(0, 0, w, h); fAspect = (GLfloat)w/(GLfloat)h; // vetítési mátrix glMatrixMode(GL_PROJECTION); glLoadIdentity(); // vágási tér megadás, perspektív vetítés gluPerspective(60.0f, fAspect, 1.0, 400.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
⎛ x0 ⎞ ⎛ ⎞ ⎞ ⎛ xe ⎞ ⎛ ⎜ ⎟ ⎜ ⎟ ⎟ ⎜ ⎟ ⎜ ⎜ y 0 ⎟ ⎜ Modelview ⎟ ⎜ y e ⎟ ⎜ Projekció ⎟ ⎜ z ⎟ → ⎜ mátrix ⎟ → ⎜ z ⎟ → ⎜ mátrix ⎟ → ⎜ 0⎟ ⎜ ⎟ ⎟ ⎜ e⎟ ⎜ ⎟ ⎟ ⎜w ⎟ ⎜ ⎜w ⎟ ⎜ ⎠ ⎠ ⎝ e⎠ ⎝ ⎝ 0⎠ ⎝ Eredeti Szem koordináták koordináták x ⎛ c⎞ ⎛ ⎛ ⎞ ⎞ ⎜ ⎟ ⎜ ⎟ ⎟ ⎛ xc / w c ⎞ ⎜ ⎟ ⎜ Viewport ⎟ ⎜ y c ⎟ ⎜Perspektív ⎟ ⎜ y / w → → → ⎜ z ⎟ ⎜ osztás ⎟ ⎜ c c ⎟ ⎜ transzf. ⎟ → ⎜ c⎟ ⎜ ⎟ ⎜⎝ zc / w c ⎟⎠ ⎜ mátrix ⎟ ⎜ ⎟ ⎟ ⎜w ⎟ ⎜ ⎝ ⎠ ⎠ ⎝ c⎠ ⎝ Normalizát Vágási koordináták koordináták
Transzformációs mátrixok (OpenGL)
Mátrix vermek (OpenGL) Mátrix módok: GL_TEXTURE, GL_MODELVIEW, GL_COLOR, GL_PROJECTION
⎛ ⎛ xc / w c ⎞ ⎜ Viewport ⎟ ⎜ ⎜ → ⎜ y c / w c ⎟ → ⎜ transzf. ⎜ z / w ⎟ ⎜ mátrix ⎝ c c⎠ ⎜ ⎝ Normalizát (inhomogén) koordináták
⎞ ⎟ ⎟ ⎟→ ⎟ ⎟ ⎠
Minden mátrix mód számára van egy mátrix verem Az aktuális mátrix a verem tetején lévő mátrix. A műveletek: void glPushMatrix( void ); void glPopMatrix( void );
Mátrix vermek (OpenGL)
Feladat (OpenGL)
glGet(GL_MAX_MODELVIEW_STACK_DEPTH)
(Microsoft: maximális mélység 32) glGet(GL_MAX_PROJECTION_STACK_DEPTH)
(Microsoft: maximális mélység 2)
Rajzoljuk meg egy dobókocka perspektivikus képét!
GL_STACK_OVERFLOW, GL_STACK_UNDERFLOW
Alapállapot: egységmátrix, GL_MODELVIEW
09_trafo
9