Máté: Számítógépes grafika alapjai
3D koordináta-rendszerek
3D transzformációk - homogén koordináták
z
(x,y,z) megadása homogén koordinátákkal: (x,y,z,1)
z
y
x
(x,y,z,w) = (x’,y’,z’,w’), ha van olyan α, hogy x’ = α·x, y’ = α·y, z’ = α·z és w’ = α·w
y x
y
z
x
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 3D térrel való metszete a homogén koordináta
jobbkezes jobb-sodrású
balkezes bal-sodrású
Ha w≠0: (x/w, (x/w y/w, y/w z/w, z/w 1) a szokásos jelölés
1
3D eltolás ⎛1 ⎜ ⎜0 T (d x , d y , d z ) = ⎜ 0 ⎜ ⎜0 ⎝
mert
2
3D skálázás (nagyítás/kicsinyítés) ⎛ sx ⎜ ⎜0 S (s x , s y , sz ) = ⎜ 0 ⎜ ⎜0 ⎝
0 0 dx ⎞ ⎟ 1 0 dy ⎟ 0 1 dz ⎟ ⎟ 0 0 1 ⎟⎠
3
3D forgatások − sin ξ cos ξ 0 0
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
0 ⎛1 ⎜ ⎜ 0 cos ξ R x (ξ ) = ⎜ 0 sin ξ ⎜ ⎜0 0 ⎝
0 − sin ξ cos ξ 0
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
0 sin ξ 1 0 0 cos ξ 0 0
⎛1 ⎜ ⎜0 SH xy (shx , shy ) = ⎜ 0 ⎜ ⎜0 ⎝
0 shx 1 shy 0 1 0
0
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
⎛ x ⎞ ⎛ x + shx z ⎞ ⎜ ⎟ ⎜ ⎟ ⎜ y ⎟ ⎜ y + shy z ⎟ SH xy (shx , shy ) ⎜ ⎟ = ⎜ ⎟ z z ⎜ ⎟ ⎜ ⎟ ⎜1 ⎟ ⎜ 1 ⎟ ⎝ ⎠ ⎝ ⎠
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠ 5
01_bevez
4
mert
Az Y-tengely körül ⎛ cos ξ ⎜ ⎜ 0 R y (ξ ) = ⎜ − sin ξ ⎜ ⎜ 0 ⎝
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
3D nyírás
Az x-tengely körül 0 0 1 0
⎛ x ⎞ ⎛ x ⋅sx ⎞ ⎜ ⎟ ⎜ ⎟ ⎜ y ⎟ ⎜ y ⋅sy ⎟ S (s x , s y , s z )⎜ ⎟ = ⎜ z z⋅ s z ⎟ ⎟ ⎜ ⎟ ⎜ ⎜1 ⎟ ⎜ 1 ⎟ ⎝ ⎠ ⎝ ⎠
0 0 ⎛1 / s x ⎜ s 0 1 / 0 ⎜ y S −1 (s x , s y , s z ) = ⎜ 0 0 1 / sz ⎜ ⎜ 0 0 0 ⎝
T −1 (d x , d y , d z ) = T (− d x ,−d y ,−d z )
⎛ cos ξ ⎜ ⎜ sin ξ Rz (ξ ) = ⎜ 0 ⎜ ⎜ 0 ⎝
0⎞ ⎟ 0⎟ 0⎟ ⎟ 1 ⎟⎠
0 0 sz 0
mertt
⎛ x ⎞ ⎛ x + dx ⎞ ⎜ ⎟ ⎜ ⎟ ⎜ y ⎟ ⎜ y + dy ⎟ T (d x , d y , d z )⎜ ⎟ = ⎜ z z + dz ⎟ ⎜ ⎟ ⎜ ⎟ ⎜1 ⎟ ⎜ 1 ⎟ ⎝ ⎠ ⎝ ⎠
A z-tengely körül
0 sy 0 0
6
1
Máté: Számítógépes grafika alapjai
3D kompozíció-mártix
VETÍTÉSEK
A legáltalánosabb kompozíció alakja:
⎛ t11 t12 ⎜ t ⎜t M = ⎜ 21 22 t t ⎜ 31 32 ⎜0 0 ⎝
t13 t14 ⎞ ⎟ t 23 t 24 ⎟ t33 t34 ⎟ ⎟ 0 1 ⎟⎠
Transzformációk, amelyek n-dimenziós objektumokat kisebb dimenziós terekbe visznek át. Pl.
y
3D→2D
x
MP kiszámításához a mátrix szorzáshoz képest most is meg lehet takarítani műveleteket.
z
8
7
Vetítések fajtái /1 perspektívikus • A •B • A’ • B’
Vetítések fajtái /2
párhuzamos • A • • A’ B B’ •
vetítési sík vetítés középpontja
vetítés vetítési sík középpontja a végtelenben
Perspektívikus
Párhuzamos
Vetítési középpont
Vetítési irány
kevésbé realisztikus közel áll látásunkhoz mérhető távolságok, általában: nem mérszögek változnak hetők a távolságok (rövidülés) és a szögek
9
10
Perspektív vetítések /2
Perspektív vetítések /1 A vetítési síkkal nem, de egymással párhuzamos egyenesek vetületei egy pontban metszik egymást = távlatpont
1.
Egypontos perspektív vetítés y y z-tengely t l távlatpont
y
Elsődleges távlatpont: valamelyik fő(tengely) irányhoz tartozó távlatpont
x z
z
x
vetítési középpont
11
01_bevez
• x
z
vetítési sík 12
2
Máté: Számítógépes grafika alapjai
Perspektív vetítések /2 1.
Párhuzamos vetítések
Egypontos perspektív vetítés
A párhuzamosság megmarad
y
Osztályozásuk a vetítési irány és a vetítési sík egymáshoz viszonyított helyzete szerint:
y z-tengely t l távlatpont x • vetítési középpont
z
• x
z
vetítési sík
1.
Merőleges (ortografikus)
2.
Tetszőleges irányú 14
13
Párhuzamos (ortografikus) /1
Példa
Felülnézet
Oldalnézet Előlnézet A párhuzamosság megmarad, a távolságok megmaradnak vagy számíthatók 15
16
Párhuzamos /2 Axonometrikus (nem merőleges egyik tengelyre sem); szög nem marad meg, távolság számítható Izometrikus (a vetítési irány (dx, dy, dz) minden tengellyel ugyanakkora szöget zár be), azaz
|dx| = |dy| = |dz|, ±dx = ±dy = ±dz Amfiteátrium Jerash-ban
y 120° 120° z 120° x
8 ilyen irány létezik 17
01_bevez
18
3
Máté: Számítógépes grafika alapjai
Tetszőleges irányú /1
Izometrikus vetítés
A vetítési sík normálisa és a vetítési irány nem párhuzamos
y
Leggyakoribb fajtái: - kavalier x - kabinet Vetítési irány z
A vetítési sík normálisa 19
20
Tetszőleges irányú /2
Tetszőleges irányú /3 Kabinet:
Kavalier:
a vetítési irány és a vetítési sík
a vetítési irány és a vetítési sík szöge = 45° y
1
1
1
y
szöge = arctg(2) = 63,4° 1
y 1/2
y
1
1/2
1
1 x
1 z
α 30°
z
α 45°
1
x z
1 α 45°
x z
α 30°
x
21
3-D megjelenítés specifikálása /1 Szükséges:
- látótér - vetítés
3-D megjelenítés specifikálása /2
megadása
3D referencia koordináta rendszer (VRC)
Vetítési sík megadása: egy pontjával - referencia pont (VRP) és a normálisával (VPN) v a fölfelé mutató vektor (VUP) vetülete irányába mutat v
n
01_bevez
v megadása: VRP VUP O ó = VRP Origó u A tengelyek: n VPN n = VPN, v = VUP-nek a vetítési síkra eső vetülete u = olyan, hogy u, v, n jobb-kezes derékszögű koordináta rendszert határozzon meg
VRP
VUP VPN
22
u 23
24
4
Máté: Számítógépes grafika alapjai
3-D megjelenítés specifikálása /3 Ablak:
3-D megjelenítés specifikálása /4
Téglalap a vetítési síkon. Ami azon belül van, az megjelenik, a többi nem CW a közepe
PRP: vetítési referencia pont: (párhuzamos és perspektív vetítésre is) Perspektívikus vetítésnél v
v (Umax , Vmax) • CW
(Umin , Vmin) n
u
VRP n
VPN
VPN
• CW
u
• PRP = vetítési középpont
25
3-D megjelenítés specifikálása /5 DOP:
26
Látótér maghatározása első és hátsó vágási síkokkal /1
vetítési irány
Fajtái:
DOP DOP
• CW • PRP
n VPN
• VRP
• CW
• PRP
n
• VRP VPN
• párhuzamos (ortografikus) • párhuzamos (tetszőleges irányú) • perspektivikus
DOP קVPN
DOP || VPN
27
Látótér maghatározása első és hátsó vágási síkokkal /2
első vágási sík
Látótér maghatározása első és hátsó vágási síkokkal /3
hátsó vágási sík
vetítési sík
Párhuzamos (tetszőleges irányú):
első l ő vágási sík
VRP
vetítési sík ík
hátsó vágási sík
DOP
VRP
VPN
VPN
DOP F elő-táv
B utó-táv
F elő-táv 29
01_bevez
28
B utó-táv 30
5
Máté: Számítógépes grafika alapjai
Vetítések matematikai leírása
Látótér maghatározása első és hátsó vágási síkokkal /4 Perspektivikus: hátsó vágási sík
vetítési sík
l ő első vágási sík
VRP
VPN B utó-táv
F elő-táv
31
32
Perspektivikus vetítések /2
Perspektivikus vetítések /1 y
x
Hasonló háromszögekből:
P(x, y, z)
Az egyszerűség kedvéért tegyük fel hogy:
Pp(xp, yp, d) z
d x
a) A vetítési sík merőleges a z-tengelyre PRP = 0
yp y x , = , z d z z≠0 x y xp = , yp = , zd zd d
xp
z = d-nél,
xp
P(x, y, z)
•
z
d
=
vetületi síkok
z
yp •
P(x, y, z)
y 33
34
Perspektivikus vetítések /3 xp
Hasonló háromszögekből: ⎛ x ⎞ ⎜ ⎟ ⎜ z d ⎟ ⎜ y ⎟ ⎜ z d ⎟ ⎟ ⎜ ⎜ d ⎟ ⎜ 1 ⎟ ⎝ ⎠
Perspektivikus vetítések /4
yp y x , = , z d z z ≠ 0, x y xp = , yp = , zd zd d
=
⎛ x ⎞ ⎜ ⎟ ⎜ y ⎟ koordináta = ⎜ ⎟ = Pp , mivel ez homogén koordináta, z ⎜ ⎟ ⎜z d⎟ ⎝ ⎠
tehát M per
⎛1 ⎜ ⎜0 =⎜ 0 ⎜ ⎜0 ⎝
0 0 1 0 0 1 0 1d
0⎞ ⎟ 0⎟ 0⎟ ⎟ 0 ⎟⎠
, mert
b) A vetítési sík merőleges a z-tengelyre z = 0-ban x xp •
⎛x⎞ ⎛ x ⎞ ⎟ ⎜ ⎟ ⎜ ⎜y ⎟ ⎜ y ⎟ Mper ⋅ ⎜ ⎟ = ⎜ z z ⎟ ⎟ ⎜ ⎟ ⎜ ⎜1 ⎟ ⎜z d ⎟ ⎠ ⎝ ⎠ ⎝
P(x, y, z)
xp
yp x y , , = z d + + d z d z x y , y = , x = z p (z / d) +1 p (z / d) +1 d
d yp• y 35
01_bevez
Más lehetőség
=
P(x, y, z) 36
6
Máté: Számítógépes grafika alapjai
Párhuzamos orthografikus vetítés
Perspektivikus vetítések /5 xp
yp x y , = , d z +d d z +d tehát x y xp = , y = , (z / d) +1 p (z / d) +1 =
ezért
M ' per
⎛1 ⎜ ⎜0 =⎜ 0 ⎜ ⎜0 ⎝
P ' per
⎛ x ⎞ ⎜ ⎟ ⎛ x ⎞ ⎟ ⎜ z / d +1 ⎟ ⎜ y ⎟ y ⎟=⎜ = ⎜⎜ ⎜ ⎟ z / d +1 ⎟ ⎜ 0 ⎟ 1 ⎜ 0 ⎟ ⎜ ⎟ ⎜⎜ 1 ⎟⎟ ⎝ z / d + 1 ⎠ ⎝ ⎠
0⎞ ⎟ 0⎟ 0⎟ ⎟ 0 1 d 1 ⎟⎠
0 1 0
0 0 0
⎛ xp ⎞ ⎛ x ⎞ ⎛x⎞ ⎜ ⎟ ⎜ ⎟ ⎜ ⎟ ⎜ y ⎟ Mort ⎜ y p ⎟ ⎜ y ⎟ P = ⎜ ⎟ ⎯⎯→ ⎯ ⎜ ⎟ = ⎜ ⎟ = Pp , z z 0 ⎜ p⎟ ⎜ ⎟ ⎜ ⎟ ⎜ 1 ⎟ ⎜1 ⎟ ⎜1 ⎟ ⎝ ⎠ ⎝ ⎠ ⎝ ⎠
ahol h l
M ort
⎛1 ⎜ ⎜0 =⎜ 0 ⎜ ⎜0 ⎝
0 0 0⎞ ⎟ 1 0 0⎟ (határértéke M’per-nek, d→∞). 0 0 0⎟ ⎟ 0 0 1 ⎟⎠
37
38
3D megjelenítés implementálása /2
3D megjelenítés implementálása /1
A 3D vágás drága művelet, ezért érdemes előtte a 3D objektumokat u.n. kanonikus látótérbe transzformálni (normalizálás), ahol a vágás egyszerűbb és gyorsabb.
3D objektumok 3D objektumok kanonikus VK-ban normalizálás látótérben, 3D vágás vetítés
2D megjelenített 2D vetített objektum transzformáció objektumok 39
40
3D megjelenítés implementálása /4
3D megjelenítés implementálása /3 párhuzamos vetítésnél x vagy y első vágási sík
hátsó sík
1 1 -1
-z
perspektív vetítésnél
Kanonikus látótér vágási síkjai:
Kanonikus látótér vágási síkjai:
x = -1,
x=1
y = -1,
y=1
x = z,
x = -z
z = 0,
z = -1
y = z,
y = -z
z = -zmin,
z = -1
41
01_bevez
x vagy y első sík
1
hátsó sík
-z -1
42
7
Máté: Számítógépes grafika alapjai
Mátrix műveletek (OpenGL) Az OpenGL oszlopfolytonosan tárolja a mátrixokat Az egység mátrix:
GLfloat 1.0, 0.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, 0.0, 0.0, 1 1.0} 0}
⎛ a1 ⎜ ⎜ a2 ⎜a ⎜ 3 ⎜ ⎝ a4
Mátrix műveletek (OpenGL)
a5 a6 a7
a9 a10 a11
a8
a12
a13 ⎞ ⎟ a14 ⎟ a15 ⎟ ⎟ a16 ⎟⎠
Új aktuális mátrix betöltése:
void glLoadMatrix{fd}( T M[16] ); glMatrixMode(GL_MODELVIEW); glLoadMatrix(M);
// típus // betöltés
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, 0.0, 0.0, 10.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
43
44
Koordináta transzformációk (OpenGL) • Nézeti (Viewing) a néző (kamera) helyének a megadása • Modell (Modeling) az objektumok (modell) mozgatása • Modell Modell-nézet 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) • A megfigyelő nézőpontja kezdetben (0, 0, 0) • A megfigyelő a z tengely negatív irányába néz. y
y
-z -x x
-x
z
x -y
-y
Ahogy a megfigyelő látja a modellt
Í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 46
45
Nézeti (Viewing) transzformáció (OpenGL)
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) p (eyex, eyey, eyez) a szem pozíciója
Ez a transzformáció 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 0, 0) • gluLookAt paranccsal módosítható
(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); 47
01_bevez
48
8
Máté: Számítógépes grafika alapjai
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. eltolás (transzláció)
Szokásos használata: glMatrixMode(GL_MODELVIEW); glLoad Identity(); gluLookAt(x,y,z,tx,ty,tz,0.0f,1.0f,0.0f);
forgatás (rotáció)
A modell vagy egy részének a transzformálására használjuk
skálázás
A csúcspont (vertex) koordinátákat kell csak transzformálni
49
Modell-nézeti dualitás (OpenGL)
50
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, x T y, y T z); (x, y, z): az eltolás vektora pl.: x-tengely mentén 50 egységgel való eltolás nézeti koordináta rendszer mozgatás
glTranslated(50, 0, 0);
modell koordináta rendszer mozgatás
A nézeti és a modell transzformációk duálisak, ezért elegendő lenne csak a modell koordináta rendszert transzformálni
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
51
Orthografikus vetítés (OpenGL)
Vetítési (projection) transzformáció (OpenGL)
void glOrtho(double left, double right, double bottom, double top, double near, double far);
glMatrixMode(GL_PROJECTION);
Kétféle vetítési lehetőség
orthografikus
és
Orthogonális (ortografikus) vetítés vágási terének megadása
perspektivikus
Megadjuk a látóteret is Végrehajtás: új projekciómátrix = projekciómátrix · specifikált mátrix
2D eset:
void gluOrtho2D( double left, double right, double bottom, double top); 53
01_bevez
52
54
9
Máté: Számítógépes grafika alapjai
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ő vágósík y koordinátája
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 g távolsága g a megfigyelőtől g gy
znear, zfar: a közeli és távoli vágósík z koordinátája. Nézőpont: az origó: (0, 0, 0)
top
w h
vágási terület
left
w
right
bottom
near far
vágási terület
near far
55
Ablak (OpenGL)
56
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
(150, 100)
-
y
(150 100) (150,
z=x
z=x vágási terület
ablak 300*200
vágási terület x (0, 0)
h
Ablak, Viewport 300*200 x
(0, 0) viewport 150*100 57
Perspektív vetítés (OpenGL) Pl.: Módosítsuk viewport-ot és a vágási teret perspektív vetítésnél 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); f fAspect = (G (GLfloat)w/(GLfloat)h; fl ) /(G fl )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(); } 59
01_bevez
58
Transzformációs mátrixok (OpenGL) ⎛ x0 ⎞ ⎛ ⎜ ⎟ ⎜ ⎜ y0 ⎟ ⎜ modelview ⎜ z ⎟ →⎜ mátrix ⎜ 0⎟ ⎜ ⎜w ⎟ ⎜ ⎝ 0⎠ ⎝
⎞ ⎛ xe ⎞ ⎛ ⎟ ⎜ ⎟ ⎜ ⎟ ⎜ ye ⎟ ⎜ ⎟ → ⎜ z ⎟ →⎜ ⎟ ⎜ e⎟ ⎜ ⎟ ⎜w ⎟ ⎜ ⎠ ⎝ e⎠ ⎝ szem koordináták k di áták
eredeti koordináták k di áták
perspektív osztás
projekció mátrix
⎛ ⎛ xc / wc ⎞ ⎜ ⎟ ⎜ ⎜ → ⎜ yc / wc ⎟ → ⎜ ⎜z /w ⎟ ⎜ ⎝ c c⎠ ⎜ ⎝ normalizát (inhomogén) koordináták
viewport transzf. mátrix
⎞ ⎛ xc ⎞ ⎟ ⎜ ⎟ ⎟ ⎜ yc ⎟ ⎟ →⎜ z ⎟ → ⎟ ⎜ c⎟ ⎟ ⎜w ⎟ ⎠ ⎝ c⎠ vágási koordináták
⎞ ⎟ ⎟ ⎟→ ⎟ ⎟ ⎠ 60
10
Máté: Számítógépes grafika alapjai
Mátrix vermek (OpenGL)
Mátrix vermek (OpenGL)
Mátrix módok: GL_PROJECTION, GL_MODELVIEW, GL_TEXTURE
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:
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) GL_STACK_OVERFLOW, GL_STACK_UNDERFLOW
void glPushMatrix(void); Alapállapot: egységmátrix,
void glPopMatrix(void);
GL_MODELVIEW 61
62
Feladat (OpenGL)
Rajzoljuk meg egy kocka perspektivikus képét!
63
01_bevez
11