1 Viewing Megtekintés
2 Miről lesz szó? ► Modellek megtekintése különböző, vagy tetszőleges irányokból ► Nézőpont áthelyezése a háromdimenziós térben ► Vágósíkok elhelyezése a modelltérben ► Mátrixvermek manipulációja ► Példák: ► Tutorial ► Robotkar mozgás modellezés ► Vágósíkok
3 Kamera analógia ► A grafikus rendszerek képalkotási lépései hasonlóak a valódi fényképkészítéssel: Nézet transzformáció (a fényképezőgép elhelyezése a térben) (viewing transformation) a modell belehelyezése a nézet térfogatba (modelling transformation) a lencse kiválasztása (nagyítás, vetítés transzformáció) (projection transformation) a fénykép méretének beállítása (viewport transformation)
4 Képalkotás lépései
5 Vertex transzformáció Mátrix szorzás: (ismétlés) Eltolás megvalósítása mátrix- vektor szorzással:
6 Példa: téglatest rajzolás a térben #include void display(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); // egységmátrix // // model transformation // glTranslatef(0.0, 0.0, -5.0); glScalef (1.0, 2.0, 1.0); glRotatef(30.0f, 0.0f,1.0f,0.0f); glutWireCube (1.0); glFlush (); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); glMatrixMode (GL_MODELVIEW); }
7 Példa: téglatest rajzolás a térben (folytatás) int main() { glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutCreateWindow ("Teglatest Rajzolasa"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }
8 A bemutatott példa magyarázata Nézet transzformáció (viewing transformation) A bemutatott példa magyarázata Nézet transzformáció (viewing transformation) ► A fényképezőgép elhelyezése a térben. egységmátrix betöltése, glLoadIdentity(); a fényképező eltolása -5-el z irányba glTranslatef(x, y, z); ► A modell manipulálása a térben skálázás: glScalef (x,y,z); elforgatás: glRotatef(szog, x, y, z);
9 ► glMatrixMode() – a mátrixmód kiválasztása ► GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE ► glLoadIdentity() – egységmátrix betöltése az aktuális mátrixba ► glViewport() – azt a téglalapot definiálja, ahol az eredmény megjelenik. A viewport megváltoztatásával a kép torzítható. A bemutatott példa magyarázata: (folyt)
10 Leképzés (projektion) transzformáció ► Analóg a fényképező lencse megválasztásával: a transzformáció meghatározza a leképzési térfogat méretét (viewing volume), meghatározza, hogy mely objektumok fognak látszani, melyek nem. (melyek esnek a térfogaton belülre) ► Az OpenGL kétféle vetítési módot támogat: Perspektivikus vetítés: ► a valóságos látáshoz hasonló. ► a távolabbi élek rövidülnek. ► glFrustum() Ortogonális vetítés ► A távoli élek nem rövidülnek ► Mérnöki háromdimenziós vetületek (CAD rendszerek, műszaki rajzok) ► glOrtho();
11 OpenGL mátrixok A lekérdezett (4x4) – es mátrixot érdemes m[16] 16 elemű tömbként kezelni, mivel m[4][4] esetén a sorok és oszlopok felcserélődnek és hibák forrása lehet. ► glLoadMatrix{fd}(const TYPE *m) – mátrix betöltés ► glMultMatrix{fd}(const TYPE *m) – mátrix szorzás
12 Transzformációs mátrixok
13 Transzformációs mátrixok
14 Transzformációs mátrix GLfloat m[16] = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 2.0, 3.0, 1.0}; glMultMatrixf(m); Megfelel egy eltolásnak: ► glTranslatef(1.0, 2.0, 3.0);
15 Transzformációk sorrendje glRotate() – glTranslate()glTranslate() – glRotate() Lényeges különbség van az elforgatás majd eltolás vagy az eltolás és azután elforgatás között.
16 Transzformációk sorrendje glMatrixMode(GL_MODELVIEW);glLoadIdentity();glMultmatrix(N);glMultmatrix(M);glMultmatrix(L);glBegin(G_TRIANGLES);glVertex3f(….);glEnd(); ► A modell mátrix I, N, NM, NML értékeket fogja tartalmazni, tehát a transzformációk fordított sorrendben lesznek! ► A transzformációk sorozata vizsgálható egy globális koordináta rendszerből vagy a modellhez kötött lokális koordináta rendszerrel.
17 Példa: forgatás, eltolás, skálázás
18 void kirajzol(void) { glClearColor(0.0f,0.0f,0.0f,0.0f);// fekete szín glClear(GL_COLOR_BUFFER_BIT);// képernyőtörlés glLoadIdentity();// simán kirajzol glColor3f(1.0, 1.0, 1.0); rajzolharomszog();// // eltolás //glEnable(GL_LINE_STIPPLE); glLineStipple(1, 0xF0F0); glTranslatef(-1,0,0);rajzolharomszog();// // skálázás //glEnable(GL_LINE_STIPPLE); glLineStipple(1, 0xF00F); glLoadIdentity();glScalef(1.5,0.5,1.0);rajzolharomszog();// // elforgatás //glEnable(GL_LINE_STIPPLE); glLineStipple(1, 0x8888); glLoadIdentity(); glRotatef(90.0, 0.0, 0.0, 1.0); rajzolharomszog(); glDisable(GL_LINE_STIPPLE);// kikapcsoljuk, de miért ha úgyis vége a rajzolásnak???? (pedig szükség van rá) glFlush();// rajzold ki (de) azonnal! }
19 Nézőpont transzformációk ► Nézőpont transzformáció glTranslate és glRotate segítségével ► Nézőpont transzformáció a glu beépített függvényekkel. gluLookAt(), gluPerspective() ► Saját nézőpont transzformációs függvények létrehozása ► Fontos: a képzeletbeli kamera alapértelmezett pozíciója a 0,0,0 és az iránya a –z irány!
20 Perspektivikus leképzés 1 near far w h aspect = w/h
21 Perspektivikus leképzés 2 near far top left bottom right
22 Perspektivikus leképzés 1. glFrustum(left, right, bottom, top, near, far); Mátrix létrehozása a nézeti csonka gúla méreteinek megadásával majd szorzás az aktuális mátrixal. 2. gluPerspective(omega, aspect, near, far); Mátrix létrehozása a nézeti csonka gúla méreteinek szimmetrikus megadásával majd szorzás az aktuális mátrixal.
23 GluLookAt ► gluLookAt(eye, center, up); void gluLookAt(double eyex, double eyey, double eyez, double centerx, double centery, double centerz, double upx, double upy, double upz);
24 Orthographic projektion (merőleges leképzés) near right bottom far left top viewpoint
25 Merőleges leképzés ► glOrtho(left, right, bottom, top, near, far); merőleges leképzés mátrixának létrehozása és a megszorzása az aktuális mátrixal. ► Minden mérnöki tervezőrendszer használja, pl. CAD/CAM rendszerek.
26 Viewport transformation ► Viewport az a téglalap alakú tartomány, ahová a kép kirajzolódik. Méretének mértékegysége: ablak koordináták (window koordinates) vagy pixelek. ► aspect ratio: a téglalap szélessége osztva a magasságával (w/h).
27 Viewport transformation ► glViewport(x, y, width, height); x,y a viewport bal alsó kezdőpozíciója – width és height a szélessége és a magassága (pixelekben mérve)
28 Viewpont manipulációs példa 1.
29 Nézőpont transzformációs példa 2.
30 Speciális (nézőpont) transzformációk void pilotview( double planex, double planey, double planez, double roll, double pitch, double heading) { glRotated(roll, 0.0, 0.0, 1.0); glRotated(pitch, 0.0, 1.0, 0.0); glRotated(heading, 1.0, 0.0, 0.0); glTranslated(-planex, -planey, -planez); }
31 Speciális (nézőpont) transzformációk void polarview( double distance, double twist, double elevation, double azimuth) { glTranslated(0.0, 0.0, -distance); glRotated(-twist, 0.0, 0.0, 1.0); glRotated(-elevation, 1.0, 0.0, 0.0); glRotated(azimuth, 0.0, 0.0, 1.0); }
32 Vertex transzformáció fázisai ( összefoglalás)
33 Objektum koordináta –> Ablak koordináta transzformáció „egy lépésben” ► int gluProject ( GLdouble objx, GLdouble objy, GLdouble objz, const GLdouble modelMatrix[16], const GLdouble projMatrix[16], const GLint viewport[4], GLdouble * winx, GLdouble * winy, GLdouble * winz ); ► Paraméterek: objx, objy, objz objektum koordináták modelMatrix aktuális modelview mátrix (glGetDoublev()). projMatrix aktuális projection mátrix (glGetDoublev()). viewport aktuális viewport (glGetDoublev()). winx, winy, winz A kiszámított ablak koordináták.
34 Ablak koordináta –> Objektum koordináta transzformáció „egy lépésben” int gluUnProject ( GLdouble winx, GLdouble winy, GLdouble winz, const GLdouble modelMatrix[16], const GLdouble projMatrix[16], const GLint viewport[4], GLdouble *objx, GLdouble *objy, GLdouble *objz ); Parameters: winx, winy, winz The window coordinates to be mapped. modelMatrix The modelview matrix (glGetDoublev(). projMatrix The projection matrix (glGetDoublev(). viewport The viewport (glGetDoublev(). objx, objy, objz The computed object coordinates.
35 Példa: száguldás gömbök között
36 Példa: száguldás gömbök között ► 1000 db gömb – glutWireSphere( radius, s1, s2) ► Billentyűkezelő beállítása a main()-ban: glutKeyboardFunc(keyboard); ► A dupla-bufferelés (double-buffering) alkalmazása void keyboard(unsigned char key, int x, int y) { switch (key) { case 'w': fHajoZ += 10.0f; break; case 's': fHajoZ -= 10.0f; break; } glutPostRedisplay();// újrarajzolás üzenet küldése }
37 Példa: száguldás gömbök között void display(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); // egységmátrix // // nézőpont transzformáció viewing transformation // glTranslatef(-150.0,-150.0, fHajoZ); // // model transzformacio // for(int i = 0; i < GOMBOKSZAMA; i++ ) { glTranslatef(posx, posy, posz); glutWireSphere(2.0, 10.0, 10.0); glTranslatef(-posx, -posy, -posz); }
38 Mátrix verem (stack) Maximális veremméret lekérdezése: glIntegerv(): GL_MAX_MODELVIEW_STACK_DEPTH GL_MAX_PROJECTION_STACK_DEPTH
39 Mátrix verem (stack) ► Manipulációs függvények: (FIFO) glPushMatrix(); aktuális mátrix tárolása a veremben, az aktuális mátrixot a glMatrixMode() határozza meg glPopMatrix(); mátrix kivétele a veremből, a tárolt mátrixok száma egyel csökken
40 Projekciós verem alkalmazása ► Help szöveg kiíratása a síkban: (a 3d-s leképzés megtartása mellett) glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(); help_kiiratása(); glPopMatrix();
41 Rövid példa a vermek használatára void display(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); // egységmátrix // // nézőpont transzformáció viewing transformation // gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // // modeling transformation // glColor3f(1.0, 0.0, 1.0); glutWireCube (1.0); glPushMatrix(); glTranslatef(1.5, 0.0, 0.0); glColor3f(1.0,0.0,0.0); glutWireCube (1.0); glPopMatrix(); glRotatef(45, 0, 0, 1); glColor3f(0, 1.0,0); glutWireCube (1.0); glFlush (); } Feladat: töröljük ki a push és popmatrix hívásokat és magyarázzuk meg mi történik!
42 Robotkar példa a vermek használatára glPushMatrix();// mátrix mentés glTranslatef(-1.0, -0.5, 0.0);// 1-es pont glRotatef(45, 0.0, 0.0, 1.0);// 1-es körül elforgatás glTranslatef(1.0,0.0,0.0);// 2-es pont glPushMatrix();// mátrix mentés (kar 1 rendszer) glScalef(2.0, 0.4, 1.0);// skálázás glutWireCube (1.0);// rajzolás glPopMatrix();// vissza a 2. ponthoz glTranslatef(1.0, 0.0, 0.0);// 3. ponthoz glRotatef(20, 0.0, 0.0, 1.0);// 3. pont körü forgat glTranslatef(1.0, 0.0, 0.0);// 4. ponthoz glPushMatrix();// mátrix mentés (kar 2 rendszer) glScalef(2.0, 0.4, 1.0);// skálázás glutWireCube (1.0);// rajzolás glPopMatrix();// vissza a kar 1 rendszerbe glPopMatrix();// vissza a globálisba
43 Vágósíkok ► 6 vágósík adható meg: Ax+By+Cz+D = 0, alakban.
44 Vágósíkok ► glClipPlane(GLenum plane, const GLdouble *equation); plane: GL_CLIP_PLANEi, ahol i = 0…5, a vágósík száma equation: a síkot reprzentáló egyenlet együtthatóit tartalmazó vektor A vágósíkok bekapcsolása: glEnable(GL_CLIP_PLANEi)kikapcsolása:glDisable(GL_CLIP_PLANEi);
45 Vágósíkok void display() { GLdouble egy1[4] = {0.0, 1.0, 0.0, 0.0}; GLdouble egy2[4] = {-1.0, 0.0, 0.0, 0.0}; glClearColor(0.2, 0.2, 0.2, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glPushMatrix(); glTranslatef(0.0, 0.0, -5.0); glClipPlane(GL_CLIP_PLANE0, egy1); glEnable(GL_CLIP_PLANE0); glClipPlane (GL_CLIP_PLANE1, egy2); glEnable(GL_CLIP_PLANE1); glutWireSphere(2.0, 40, 40); glPopMatrix(); glFlush(); }