Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
OpenGL és a mátrixok Róth Gergő
2013. március 4.
Róth Gergő
1/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
A rajzoláskor a videókártya minden csúcson végrehajt egy transzformációt. Mire jó? I
Kamera helyének beállítása
I
Egy objektum több pozícióra is kirajzolható
I
Egy objektum több méretben is kirajzolható
I
Egy objektum több szemszögből is kirajzolható
I
A transzformációk nem a CPU-n, hanem a GPU-n hajtódnak végre, ezáltal gyorsabb (párhuzamos végrehajtás)
2D / 3D grafikában minden transzformáció egy mátrixműveletnek felel meg. Róth Gergő
2/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Skalárszorzás Összeadás Mátrixszorzás
Mátrix szorzása skalárral
Róth Gergő
3/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Skalárszorzás Összeadás Mátrixszorzás
Mátrixok összeadása I
Csak ugyanolyan méretű mátrixokat tudunk összeadni
Róth Gergő
4/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Skalárszorzás Összeadás Mátrixszorzás
Mátrix szorzása mátrixszal I I I
I
n x m méretű mátrixot csak m x p méretűvel tudunk beszorozni Az eredmény n x p dimenziókkal rendelkező mátrix A művelet nem kommutatív, vagyis nem lehet felcserélni az operandusokat: A * B != B * A A művelet asszociatív (csoportosítható): (A * B) * C = A * (B * C)
Róth Gergő
5/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Egységmátrix Átméretezés Forgatás
N dimenziós koordinátát nxn méretű négyzetes mátrixszal tudunk transzformálni: v0 a0 a3 a6 a1 a4 a7 ∗ v1 v2 a2 a5 a8
Róth Gergő
6/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Egységmátrix Átméretezés Forgatás
Egységmátrix (identity matrix):
1 0 v v ∗ 0 = 0 0 1 v1 v1
v0 1 0 0 v0 0 1 0 ∗ v1 = v1 v2 v2 0 0 1
Róth Gergő
7/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Egységmátrix Átméretezés Forgatás
Átméretezés az origo középpontjából (scale):
sx 0
sx 0 0
0 v0 sx ∗ v0 ∗ = sy v1 sy ∗ v1 0 sy 0
sx ∗ v0 0 v0 0 ∗ v1 = sy ∗ v1 v2 sz ∗ v2 sz
Róth Gergő
8/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Egységmátrix Átméretezés Forgatás
Forgatás 2 dimenzióban az origo körül (rotate):
cos(α) −sin(α) sin(α) cos(α)
Róth Gergő
9/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Egységmátrix Átméretezés Forgatás
Forgatás 3 dimenzióban az origon átmenő egységvektor (l, m, n) körül (rotate):
Róth Gergő
10/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Egységmátrix Átméretezés Forgatás
A lineáris transzformációk halmozhatók. Példa (R - rotate, S - scale): rotate, scale, rotate, rotate M=R*R*S*R Elég csak M-et átadni a GPU-nak. Egyetlen szorzással (M * v) elvégezhető az összes transzformáció.
Róth Gergő
11/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Eltolás
Eltolás (translate): tx v0 tx + v0 + = ty v1 ty + v1 tx + v0 v0 tx ty + v1 = ty + v1 tz + v2 v2 tz
Róth Gergő
12/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Eltolás
Mi a baj az eltolással? Nem halmozható, mivel az eltolást az összeadással lehet elvégezni, a többit pedig szorzással. Példa: (R - rotate, S - scale, T - translate): translate, rotate, scale, translate, scale, rotate M != R * S * T * S * R * T
Róth Gergő
13/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
I
A koordináták kiegészülnek egy újabb komponenssel: w
I
2D: (x, y) -> (wx, wy, w)
I
3D: (x, y, z) -> (wx, wy, wz, w)
I
Kezdetben általában egynek veszik w értékét
I
Homogén koordinátákkal elvégezhető az eltolás mátrixszorzással, így ez a transzformáció is halmozhatóvá válik.
Róth Gergő
14/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Az eltolás mátrixa: 1 0 tx v0 tx + v0 0 1 ty ∗ v1 = ty + v1 0 0 1 1 1 1 0 0 0
0 1 0 0
tx v0 0 tx v1 ty 0 ty ∗ = 1 tz v2 tz 0 1 1
+ v0 + v1 + v2 1
Róth Gergő
15/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Aktuális mátrix Vetítési mátrix Transzformációk Mátrixverem
OpenGL-ben léteznek beépített mátrixok (mindegyik mérete 4x4): I
Modelview matrix: M
I
Projection matrix: P
A csúcs tényleges helyét a következőképpen kapjuk meg: O=P*M*v
Róth Gergő
16/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Aktuális mátrix Vetítési mátrix Transzformációk Mátrixverem
Amikor mátrixműveleteket végzünk OpenGL-el, akkor mindig az aktuális mátrixon végzünk utószorzást. Az aktuális mátrixot be tudjuk állítani a glMatrixMode(..) paranccsal. Paraméterei lehetnek: GL_MODELVIEW vagy GL_PROJECTION Egységmátrix betöltése: glLoadIdentity()
Róth Gergő
17/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Aktuális mátrix Vetítési mátrix Transzformációk Mátrixverem
glMatrixMode(GL_PROJECTION) I
glOrtho(left, right, bottom, top, near, far) // ortogonális (merőleges) vetítés
I
gluPerspective(angle, x / h, near, far) // perspektivikus (a végtelenben az élek összetartanak) vetítés
Róth Gergő
18/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Aktuális mátrix Vetítési mátrix Transzformációk Mátrixverem
Forgatás origon átmenő egységvektor (x, y, z) körül: glRotatef(angle, ax , ay , az ) Eltolás: glTranslatef(tx , ty , tz ) Átméretezés: glScalef(sx , sy , sz )
Róth Gergő
19/20
Mátrix műveletek Lineáris transzformációk Affin transzformációk Homogén koordináta Mátrixműveletek OpenGL-ben
Aktuális mátrix Vetítési mátrix Transzformációk Mátrixverem
I
Állapot elmentése: glPushMatrix()
I
Állapot visszatöltése: glPopMatrix()
Róth Gergő
20/20