OpenGL és a mátrixok Róth Gergő 2013. március 4. Róth Gergő 1/20
A rajzoláskor a videókártya minden csúcson végrehajt egy transzformációt. Mire jó? Kamera helyének beállítása Egy objektum több pozícióra is kirajzolható Egy objektum több méretben is kirajzolható Egy objektum több szemszögből is kirajzolható 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
Skalárszorzás Összeadás Mátrixszorzás Mátrix szorzása skalárral Róth Gergő 3/20
Skalárszorzás Összeadás Mátrixszorzás Mátrixok összeadása Csak ugyanolyan méretű mátrixokat tudunk összeadni Róth Gergő 4/20
Mátrix szorzása mátrixszal Skalárszorzás Összeadás Mátrixszorzás 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
Egységmátrix Átméretezés Forgatás N dimenziós koordinátát nxn méretű négyzetes mátrixszal tudunk transzformálni: a 0 a 3 a 6 v 0 a 1 a 4 a 7 v 1 a 2 a 5 a 8 v 2 Róth Gergő 6/20
Egységmátrix Átméretezés Forgatás Egységmátrix (identity matrix): [ ] 1 0 0 1 [ v0 v 1 ] = [ v0 v 1 1 0 0 v 0 v 0 0 1 0 v 1 = v 1 0 0 1 v 2 v 2 ] Róth Gergő 7/20
Egységmátrix Átméretezés Forgatás Átméretezés az origo középpontjából (scale): [ sx 0 0 s y ] [ v0 v 1 ] [ ] sx v = 0 s y v 1 s x 0 0 v 0 s x v 0 0 s y 0 v 1 = s y v 1 0 0 s z v 2 s z v 2 Róth Gergő 8/20
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
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
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
Eltolás Eltolás (translate): [ tx t y ] + [ v0 v 1 ] [ ] tx + v = 0 t y + v 1 t x v 0 t x + v 0 t y + v 1 = t y + v 1 t z v 2 t z + v 2 Róth Gergő 12/20
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
A koordináták kiegészülnek egy újabb komponenssel: w 2D: (x, y) -> (wx, wy, w) 3D: (x, y, z) -> (wx, wy, wz, w) Kezdetben általában egynek veszik w értékét 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
Az eltolás mátrixa: 1 0 t x v 0 t x + v 0 0 1 t y v 1 = t y + v 1 0 0 1 1 1 1 0 0 t x v 0 t x + v 0 0 1 0 t y 0 0 1 t z v 1 v 2 = t y + v 1 t z + v 2 0 0 0 1 1 1 Róth Gergő 15/20
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): Modelview matrix: M 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
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
Aktuális mátrix Vetítési mátrix Transzformációk Mátrixverem glmatrixmode(gl_projection) glortho(left, right, bottom, top, near, far) // ortogonális (merőleges) vetítés gluperspective(angle, x / h, near, far) // perspektivikus (a végtelenben az élek összetartanak) vetítés Róth Gergő 18/20
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, a x, a y, a z ) Eltolás: gltranslatef(t x, t y, t z ) Átméretezés: glscalef(s x, s y, s z ) Róth Gergő 19/20
Aktuális mátrix Vetítési mátrix Transzformációk Mátrixverem Állapot elmentése: glpushmatrix() Állapot visszatöltése: glpopmatrix() Róth Gergő 20/20