Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./0. 3D grafika programozása OpenGL támogatással Transzformációk
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./1. Transzformációk az OpenGL-ben Modelltranszformációk Nézet-transzformációk kamera orientálása vetítési transzformációk Animációk Leképezés a képernyőre
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./2. Kamera analógia A 3D megjelenítés egy fénykép készítéseként fogható fel (sok fénykép készítéseként!) nézeti tértartomány kamera modell állvány
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./3. Kamera analógia és transzformációk Vetítési transzformációk (projection) a kamera lencséinek beállítása Látvány transzformációk (camera) a kamera helye és orientációja által meghatározott nézeti térfogat a világkoordinátarendszerben nézeti térfogat Modell-transzformációk (modell) a modell mozgatása Kép transzformációk (viewport) a síkbeli kép nagyítása/kicsinyítése kamera állvány modell
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./4. Koordinátarendszerek és transzformációk A kép létrehozásának lépései a modellgeometria megadása világ koordináták a kamera helyzetének megadása kamera koordináták a vetítés megadása ablakkoordináták leképezés a képernyőre képernyőkoordináták Mindegyik lépés transzformációkat jelent Mindegyik transzformáció változásokat jelent a koordinátarendszerekben nézeti térfogat kamera modell állvány
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./5. Affin transzformációk A geometriai viszonyokat megőrző transzformációkat végzünk Vonalakkal, sokszögekkel, 3D primitívekkel (quadrics, pl. gömb) Affine = hasonlósági, lineáris, elsőfokú Forgatás (rotation), eltolás (translation), skálázás (scaling) Vetítés (projection) Konkatenálás (összefűzés, egymás utáni alkalmazás) https://www.cs.auckland.ac.nz/courses/compsci773s1c/lectures/imageprocessing-html/topic2.htm
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./6. Homogén koordináták Minden vertex egy oszlopvektor v x y z w w rendszerint 1.0 Minden művelet mátrixszorzás Irányok (irányított vonal szakaszok) x=0.0 értékkel reprezentálhatók https://www.cs.auckland.ac.nz/courses/compsci773s1c/lectures/imageprocessing-html/topic2.htm
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./7. 3D transzformációk Minden vertex 4x4-es mátrixokkal transzformálódik minden affin művelet mátrixszorzással valósul meg a mátrixokat oszlopfolytonosan tárolja az OpenGL a mátrixok mindig hátulról szorzottak a mátrix és vektor szorzása Mv alakú M m m m m 0 1 2 3 m m m m 4 5 6 7 m m m m 8 9 10 11 m m m m 12 13 14 15 https://www.cs.auckland.ac.nz/courses/compsci773s1c/lectures/imageprocessing-html/topic2.htm
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./8. A transzformációk megadása A transzformációkat kétféle módon adhatjuk meg mátrixokkal (glloadmatrix, glmultmatrix) transzformációs művelettel (glrotate, glortho) A programozónak nem kell emlékeznie a mátrixok értékeire nézzük meg a Red Book függelékét (Programming Guide)
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./9. A transzformációk programozása A kép létrehozása (renderelés) előtt adjuk meg a nézetet, kamera pozíciót és orientációt kamera helyének és orientációjának megadása a modell 3D geometriájának megadása Alkalmazzuk a mátrixokat beleértve a mátrix stack-et is Kombináljük, fűzzük össze a transzformációs lépéseket
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./10. Transzformációs pipeline v e r t e x tárgy szem vágás normalizált eszköz Modellnézet Mátrix Projekciós Mátrix Perspekíva Kezelés Ablak Transzf. ablak Modellnézet Modellnézet Projekció További számítások itt - anyag -> szín - árnyalási modell (flat) - sokszög renderelési mód - sokszög döfés (culling) - vágás (clipping)
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./11. Mátrix műveletek A kurrens mátrix stack megadása glmatrixmode( GL_MODELVIEW or GL_PROJECTION ) Egyéb mátrix, vagy stack műveletek glloadidentity() glpushmatrix() glpopmatrix() Ablak (viewport) Rendszerint az ablak kliens méretével egyezik Az y/x méretaránya egyezzen a projekciós transzformációnál használttal, egyébként torzul az ábra glviewport( x, y, width, height ) x, y bal alsó sarok, width, height a viewport mérete, lehetőleg egyezzen az ablak kliens méreteivel
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./12. Vetítési, projekciós transzformáció A nézési csonkagúla alakja Perspektivikus vetítés gluperspective( fovy, aspect, znear, zfar ) glfrustum( left, right, bottom, top, znear, zfar ) Merőleges (orthographic) vetítés glortho( left, right, bottom, top, znear, zfar ) gluortho2d( left, right, bottom, top ) - egy közel nulla z értékkel hívja a glortho-t http://what-when-how.com/opengl-programming-guide/projection-transformations-viewing-opengl-programming/
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./13. Vetítési transzformációk alkalmazása Merőleges vetítés glmatrixmode( GL_PROJECTION); glloadidentity(); glortho( left, right, bottom, top, znear, zfar); http://what-when-how.com/opengl-programming-guide/projection-transformations-viewing-opengl-programming/
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./14. Látvány transzformációk alkalmazása Kamera pozíció a modelltérben pozicionáljuk a kamerát és irányítsuk a tárgyra A színen történő átrepüléshez változtassuk a látványtranszformációt rajzoljuk újra a tárgyat glulookat ( szem_x, szem_y, szem_z, center_x, center_y, center_z, uniq-x, uniq_y, uniq_z) uniq vektor egyedi orientációt ad meg (a függőleges iránya) kerüljük el a hibás pozíciók megadását http://what-when-how.com/opengl-programming-guide/projection-transformations-viewing-opengl-programming/
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./15. Vetítési mintaalkalmazás, Nate Robin
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./16. Modell transzformációk A tárgy mozgatása gltranslate{fd}( x, y, z ) A tárgy forgatása tetszőleges tengely körül glrotate{fd}( angle, x, y, z ) az angle szög fokokban adandó meg Skálázás (zoomolás), tükrözés glscale{fd}( x, y, z )
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./17. Modelltranszformációs mintaalkalmazás, Nate Robin
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./18. A vetítés balkezes forgatású A vetítési transzformációk (gluperspective, glortho) balkezes koordinátarendszereket használnak znear és zfar úgy tekinthető, mint a nézési ponttól vett távolságok Minden más transzformáció koordinátarendszere jobbkezes, beleértve a renderelendő vertexeket is y z+ y balkezes x jobbkezes x z+
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./19. A transzformációk általános használata Példák a resize( ) függvényre a vetítés újrabeállítása & látványtranszformációk végrehajtása az angle szög fokokban adandó meg Rendszerint az ablak átméretezésekor hívjuk meg Regisztrálandó, mint callback függvény a glutreshapefunc() számára
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./20. Resize(): Perspektive és LookAt használata void resize( int w, int h ) { glviewport( 0, 0, (GLsizei) w, (GLsizei) h ); glmatrixmode( GL_PROJECTION ); glloadidentity(); gluperspective( 65.0, (GLfloat) w / h, 1.0, 100.0 ); glmatrixmode( GL_MODELVIEW ); glloadidentity(); glulookat( 0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ); }
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./21. Resize(): Perspektive és Translate használata Ugyanaz a hatás elérhető Translate-vel is: void resize( int w, int h ) { glviewport( 0, 0, (GLsizei) w, (GLsizei) h ); glmatrixmode( GL_PROJECTION ); glloadidentity(); gluperspective( 65.0, (GLfloat) w/h, 1.0, 100.0 ); glmatrixmode( GL_MODELVIEW ); glloadidentity(); gltranslatef( 0.0, 0.0, -5.0 ); } A világbeli összes objektum öt egységgel való eltávolítása (-5) magunktól ugyanaz, mint a kamerát öt egység távolságra (5) megadni.
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./22. Resize(): Ortho (1. rész) Az új aspect értékkel fogjuk módosítani a világtér határait a modelltérnél (left, right, bottom, top) az új modelltér alakjától függően. void resize( int width, int height ) { GLdouble aspect = (GLdouble) width / height; GLdouble left = -2.5, right = 2.5; GLdouble bottom = -2.5, top = 2.5; glviewport( 0, 0, (GLsizei) width, (GLsizei) height ); glmatrixmode( GL_PROJECTION ); glloadidentity(); folytatódik
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./23. Resize(): Ortho (2. rész) Az ablak új aspect értékének megfelelően kell átméretezni a modelltér méreteit (a Frustum-ot). } if ( aspect < 1.0 ) { left /= aspect; right /= aspect; } else { bottom *= aspect; top *= aspect; } glortho( left, right, bottom, top, near, far ); glmatrixmode( GL_MODELVIEW ); glloadidentity();
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./24. Modelltranszformáció láncolatok létrehozása Első probléma: hierarchikus objektumszerkezet a pozíciók függenek az előző pozícióktól példa: robotkar robotkéz; Megoldás: mozgó lokális koordinátarendszer a modelltranszformációk mozgatják a koordinátarendszert hátulról szorzó oszlopfolytonos mátrixok az OpenGL jobbról szorozza a mátrixokat.
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./25. Modelltranszformáció láncolatok létrehozása.. Második probléma: az objektumok a világkoordinátarendszer origójához képest mozognak hibaeset: az objektumom rossz origó körül forog Megoldás: rögzített koordinátarendszer a modelltranszformációkat rögzített koordinátarendszerben képzeljük el elölről szorzó oszlopfolytonos mátrixok az OpenGL jobbról szorozza a mátrixokat meg kell fordítani a műveletek sorrendjét hogy elérjük a kívánt mozgást
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./26. További vágósíkok Legalább 6 további vágósík alkalmazható (lassulás!) Jól alkalmazható belső metszetek készítéséhez A modellnézet mátrix mozgatja a vágósíkot Ax+Bx+Cz+D < 0 lesz lemetszve (coeff vektorban adva A,B,C,D) glenable( GL_CLIP_PLANEi ) glclipplane( GL_CLIP_PLANEi, GLdouble* coeff )
Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./27. A transzformációs átszámítás irányának megváltoztatása Képernyő adatot akarunk megtudni a világ koordinátarendszerben glgetintegerv( GL_VIEWPORT, GLint viewport[4] ) glgetdoublev( GL_MODELVIEW_MATRIX, GLdouble mvmatrix[16] ) glgetdoublev( GL_PROJECTION_MATRIX, GLdouble projmatrix[16] ) gluunproject( GLdouble winx, winy, winz, mvmatrix[16], projmatrix[16], GLint viewport[4], GLdouble *objx, *objy, *objz ) winz = 0 -> near síkba, winz = 1 far síkba számol át; interpoláció kell gluproject a világ koordinátákat számítja át a képernyő koordinátarendszerbe