Modélisation Géométrique et Synthèse d’image Sandrine LANQUETIN Marc NEVEU 1
OpenGL 2
Introduction Indépendant du matériel et du système d’exploitation développé par Silicon graphics bibliothèque de fonctions bas niveaux fonctions bas niveaux pour définir des objets graphiques simples, des couleurs, les points de vue, les sources de lumière,.... OpenGL = librairie graphique 3D 3
Pas un langage de programmation Pas orienté objet Pas d’outils de modélisation Introduction Pas d’interaction avec l’utilisateur (écran, souris, clavier,etc…) Pas d’outil de fenêtrage Pas de gestion des événements GLUT : OpenGL Utility Toolkit GLU : OpenGL Utility Library Pas d’interaction avec l’utilisateur (écran, souris, clavier,etc…) Pas de gestion des événements 4
Installation freeglut VS admin Récupérer Freeglut sur Copier freeglut.dll dans C:\Windows\System32 (admin) Copier freeglut.lib dans le répertoire Lib de Visual C++, pour VS8 : c:\Program Files\Microsoft Visual Studio 8 \VC\PlatformSDK\Lib Copier freeglut.h et tous les.h dans le répertoire Include/gl de Visual C++ pour VS8 : c:\Program Files\Microsoft Visual Studio 8 \VC\PlatformSDK\Include\gl 5
Installation freeglut VS admin Récupérer Freeglut sur Copier freeglut.dll dans C:\Windows\System32 (admin) Copier freeglut.lib dans le répertoire Lib de Visual C++, pour VS8 : c:\Program Files\Microsoft Visual Studio 8 \VC\PlatformSDK\Lib Copier freeglut.h et tous les.h dans le répertoire Include/gl de Visual C++ pour VS8 : c:\Program Files\Microsoft Visual Studio 8 \VC\PlatformSDK\Include\gl 6
Installation freeglut VS lambda Récupérer Freeglut sur wnload Pas admin : rep Include (.h) et Lib (.lib) Outils Options Projets et solutions Répertoire de VC++ 7
Installation freeglut VS lambda 8
Copier freeglut.dll dans Debug ou Release 9
Installation freeglut Linux (Ubuntu) Admin sudo apt-get install freeglut3 freeglut3-dev Pas admin 10
Code C++ Inclure #include freeglut.h #include GL/glu.h ou #include GL/freeglut.h 11
Fonctions OpenGL Primitives géométriques : points, segments, polygones préfixe : gl glColor2f() 12
GLUT : OpenGL Utility Toolkit Gestion de fenêtres Gestion d ’événements (souris, clavier) Affichage et mise à jour Primitives : sphère, cylindre… glutMouseFunc() 13
GLU OpenGL Utility Library Transformations géométriques Triangulation de polygones Rendu des surfaces gluLookAt() 14
GLUT : fenêtres glutInit(int *arg, char **argv) initialise GLUT 15 Ex : int main(int argc, char** argv) { glutInit(&argc,argv); …}
GLUT : fenêtres void glutInitDisplayMode(unsigned int mode) choix : RGBA ou color-index, un ou deux tampons Ex : glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); Fenêtre en double tampon Modèle chromatique RVBA Tampon de profondeur
GLUT : fenêtres glutInitWindowPosition ( int x, int y) coordonnées écran du coin haut gauche de la fenêtre glutInitWindowSize(int width, int size) taille en pixels de la fenêtre 17 Ex : //position de la fenêtre glutInitWindowPosition(200,200); //taille initiale de la fenêtre glutInitWindowSize(500,500) ;
GLUT : fenêtres glutCreateWindow(char *string) crée une fenêtre avec un nom de type string, fenêtre affichée que lorsque glutMainLoop() est appelée 18 Ex : //création de la fenêtre glutCreateWindow(argv[0]) ;
void main(int argc, char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); //taille initiale de la fenêtre glutInitWindowSize(500,500) ; //position de la fenêtre glutInitWindowPosition(200,200); //création de la fenêtre glutCreateWindow( " Robot " ) ; Init() ; //lancement de la boucle principale glutMainLoop(); return (0); } main(int argc, char** argv) 19
GLUT : Actualisation Affichage glutDisplayFunc(void *(func)(void)) événement le plus important, actualisation d ’affichage Appel de la fonction d’affichage Toutes les routines nécessaires à la reconstitution de la scène doivent être dans la fonction d'affichage Ex : glutDisplayFunc(affichage); void affichage() { … }
GLUT : Actualisation Affichage glutMainLoop(void) dernière chose à faire toutes les fenêtres qui ont été créées sont maintenant affichées le rendu dans ces fenêtres effectué glutPostRedisplay(void) lorsqu’une fenêtre est modifiée 22
GLUT : Actualisation Affichage void clavier(…) { switch(touche){ case 27 : exit(0) ; case ‘a’ : case ‘A’ : …. glutPostRedisplay(); break; }
GLUT : évènements glutReshapeFunc (void (*func)(int w, int h)) action à exécuter quand la fenêtre est redimensionnée Ex : glutReshapeFunc (refenetrer); void refenetrer (int w, int h) { … }
GLUT : évènements glutKeyboardFunc(void (* func)(unsigned char key, int x, int y)) associer une routine à une touche du clavier 25 Ex : glutKeyboardFunc(clavier); void clavier(unsigned char key, int x, int y) { … }
GLUT : évènements Touches spéciales GLUT_KEY_UP GLUT_KEY_DOWN GLUT_KEY_LEFT GLUT_KEY_RIGHT freeglut_std.h
GLUT : évènements glutMouseFunc(void (* func)(int button, int state, int x, int y)) associer une routine à un bouton (pression ou relachement) 27 Ex : glutMouseFunc(souris); void souris(int button, int state, int x, int y) { … }
GLUT : évènements Bouton GLUT_LEFT_BUTTON GLUT_RIGHT_BUTTON GLUT_MIDDLE_BUTTON Etat GLUT_DOWN GLUT_UP
GLUT : évènements glutMotionFunc(void (*func)(int x, int y)) appel d’une routine pendant que la souris se déplace tout en appuyant sur un bouton 29 Ex : glutMotionFunc(souris2); void souris2(int x, int y) { … }
GLUT : processus arrière- plan glutIdleFunc (void (*func)(void)) fonction à exécuter quand aucun évènement est en cours 30 Ex : glutIdleFunc (anim); void anim() { … }
GLUT : objets 3D Wire mode fil de fer Solid plein void glutSolidCube (GLdouble width) void glutWireCube (GLdouble width) void glutSolidSphere (GLdouble radius, GLint slices, GLint stacks) void glutWireSphere (GLdouble radius, GLint slices, GLint stacks) 31
glutSolidSphere (GLdouble r, GLint m, GLint p); glutWireSphere (GLdouble r, GLint m, GLint p); GLUT : sphère 32 glutSolidSphere (2.0, 30, 20);
glutSolidCube (GLdouble taille); glutWireCube (GLdouble taille); GLUT : cube 33 glutSolidCube (1.5);
glutSolidCone (GLdouble r, GLdouble h, GLint m, GLint p); glutWireCone (GLdouble r, GLdouble h, GLint m, GLint p); GLUT : cone 34 glutSolidCone (1.5, 2.0, 20, 15);
glutSolidTorus (GLdouble rIn, GLdouble rOut, GLint m, GLint p); glutWireTorus (GLdouble rIn, GLdouble rOut, GLint m, GLint p); GLUT : tore 35 glutSolidTorus (0.2, 1.0, 20, 15);
glutSolidTeapot (GLdouble taille); glutWireTeapot (GLdouble taille); GLUT : théière 36 glutSolidTeapot (2.0);
void glutSolidCylinder (GLdouble r, GLdouble h, GLint m, GLint p) freeGLUT : cylindre 37 glutSolidCylinder (0.5, 1.0, 10, 5)
glutSolidDodecahedron ( ); glutWireDodecahedron ( ); glutSolidOctahedron ( ); glutWireOctahedron ( ); glutSolidTetraahedron ( ); glutWireTetraahedron ( ); GLUT : objets 3D 38
OpenGL : Dessin Effacer une fenêtre Spécifier une couleur glColor3f(0.0,0.0,0.0,0.0); //Noir glColor3f(1.0,0.0,0.0,0.0); //Rouge Achever un dessin glFlush(); glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); 39
OpenGL : Dessin Un Point Un sommet Un Segment
OpenGL : Dessin void glVertex{234}{sifd}(coords); Valeur de z par défaut : 0 Valeur de w par défaut : 1 L’appel à glVertex*() est effectif seulement entre glBegin() et glEnd()
OpenGL : Dessin Appeler un sommets glVertex3f(1.1, 1.0, 3.5);//S(1.1, 1.0, 3.5) 42 Exemple : Afficher un point glBegin (GL_POINTS); glVertex3f(1.1, 1.0, 3.5); glEnd();
OpenGL : Dessin Afficher une primitive géométrique glBegin (mode); //appel des sommets glEnd(); Tout dessin est une liste d’appel de la fonction glVertex*() 43
OpenGL : Dessin Exemple : Afficher un quadrilatère glBegin (GL_POLYGON); glVertex2d(0,0) glVertex2d(1,0); glVertex2d(1,1); glVertex2d(0,1); glEnd(); (0,0)(1,0) (1,1)(0,1) 44
glBegin(GL_POLYGON); { glVertex2f(0.0, 0.0); glVertex2f(4.0, 0.0); glVertex2f(6.0, 1.5); glVertex2f(4.0, 3.0); glVertex2f(0.0, 3.0); } glEnd(); OpenGL : Dessin
glBegin(GL_POINTS); { glVertex2f(0.0, 0.0); glVertex2f(4.0, 0.0); glVertex2f(6.0, 1.5); glVertex2f(4.0, 3.0); glVertex2f(0.0, 3.0); } glEnd(); Geometric Drawing Primitives
OpenGL : Points GL_POINTS V0V0 V2V2 V4V4 V3V3 V1V1 47
OpenGL : Lignes GL_LINES V0V0 V1V1 V2V2 V3V3 V4V4 V5V5 V6V6 V7V7 GL_LINE_STRIP V0V0 V1V1 V2V2 V3V3 V4V4 GL_LINE_LOOP V0V0 V1V1 V2V2 V3V3 V4V4 48
OpenGL : Triangles GL_TRIANGLES V0V0 V1V1 V2V2 V3V3 V4V4 V5V5 V6V6 V7V7 V8V8 49 GL_TRIANGLE_STRIP V0V0 V1V1 V2V2 V3V3 V4V4 V5V5 V6V6 GL_TRIANGLE_FAN V0V0 V1V1 V2V2 V3V3 V4V4
OpenGL : Quadrilatères 50 GL_QUADS V0V0 V1V1 V2V2 V3V3 V4V4 V5V5 V6V6 V7V7 GL_QUAD_STRIP V0V0 V1V1 V2V2 V3V3 V4V4 V5V5 V6V6 V7V7
OpenGL : Polygone GL_POINTS V0V0 V2V2 V4V4 V3V3 V1V1 GL_POLYGON V0V0 V2V2 V4V4 V3V3 V1V1 51
glBegin() & glEnd() V0V0 V1V1 V2V2 V3V3 V4V4 V5V5 V6V6 V7V7 GL_POINTS
glBegin() & glEnd() V0V0 V1V1 V2V2 V3V3 V4V4 V5V5 V6V6 V7V7 GL_LINES
glBegin() & glEnd() V0V0 V1V1 V2V2 V3V3 V4V4 V5V5 V6V6 V7V7 GL_LINE_LOOP
glBegin() & glEnd() V0V0 V1V1 V2V2 V3V3 V4V4 V5V5 V6V6 V7V7 GL_TRIANGLES
glBegin() & glEnd() V0V0 V1V1 V2V2 V3V3 V4V4 V5V5 V6V6 V7V7 GL_POLYGON
OpenGL : Dessins Exemple #define PI #define n 20 … glBegin(GL_LINE_LOOP); for(int i=0;i<n;i++) { angle = 2.0*PI*i/n; glVertex2f(cos(angle ),sin(angle)); } glEnd(); … Que dessine cet exemple ? 57
Un polygone peut être dessiné en mode Un polygone possède deux faces Avant Arrière OpenGL : Polygones Fil de fer Rempli avec la couleur courante GL_FRONT GL_BACK GL_LINE GL_FILL GL_FRONT_AND_BACK 58
Faces avant/arrière ? Ordre trigo Face avant Ordre “Clockwise” Face arrière V0V0 V1V1 V2V2 V0V0 V2V2 V1V1
OpenGL : Polygones void glPolygonMode( GLenum face, GLenum mode ); Controle le mode de dessin des faces avant et arrière d’un polygone face : GL_FRONT, GL_BACK GL_FRONT_AND_BACK mode :GL_POINT, GL_LINE, GL_FILL
Exemple : glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glPolygonMode(GL_FRONT, GL_FILL); glPolygonMode(GL_FRONT, GL_LINE); glPolygonMode(GL_BACK, GL_LINE); glPolygonMode(GL_BACK, GL_FILL); OpenGL : Polygones 61
OpenGL : Couleurs Il existe deux modes d’utilisation des couleurs RVBA : glColor*() Indexé : glIndex*() RVBA : glColor*() Trois valeurs pour définir la couleur Une 4ème (optionnelle) pour spécifier l’opacité du point glColor3f(0.0,0.0,0.0,0.0); //Noir glColor3f(1.0,0.0,0.0,0.0); //Rouge glColor3f(1.0,1.0,1.0,0.0); //Blanc 62
Exemple // couleur courante fixée à bleu glColor3f( 0.0f, 0.0f, 1.0f ); // vache afficherVache(); // couleur courante fixée à vert glColor3f( 0.0f, 1.0f, 0.0f ); // sol afficherSol(); Couleur courante
OpenGL : Taille taille par défaut 1.0 représentation par un carré Void glPointSize(GLfloat Size); Void glLineWidth (GLfloat Size); largeur par défaut Contrôler la taille d’un point Contrôler la largeur d’une ligne
1.Une fonction d’initialisation (void initialiser()). 2.Une fonction d’affichage (void afficher()). 3.Une fonction de fenêtrage (void refenêtrer()). 4.Une fonction de gestion de clavier (void clavier()). 5.Une fonction de gestion de la souris (void souris()). 6.La partie principale (main). initialiser() afficher() refenêtrer() clavier() souris() main() OpenGL : Programme type Un programme est généralement constitué de 5 parties : 65
Void Initialiser() { glClearColor(0,0,0,0); glColor3f(1.0,2.0,3.0); } Initialiser() 66
Void afficher() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON) glVertex3f(10.0,12.0,15.0) ; …. glEnd(); } afficher() 67
Void refenetrer() { } refenetrer() 68
Void clavier() { switch(touche){ case 27 : exit(0) ; case ‘a’ : case ‘A’ : …. } clavier() 69
Void souris(int btn, int state, int x, int y) { switch(bouton){ case GLUT_LEFT_BUTTON : if (etat==GLUT_DOWN) …. break ; case GLUT_MIDDLE_BUTTON : if (etat==GLUT_DOWN) …. break ; case GLUT_RIGHT_BUTTON : if (etat==GLUT_DOWN) …. break ; } souris() 70
void main(int argc, char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); glutInitWindowSize(500,500) ; //taille initiale de la fenêtre glutInitWindowPosition(200,200); //position de la fenêtre glutCreateWindow(argv[0]) ; //création de la fenêtre Init() ; glutDisplayFunc(afficher); glutDisplayFunc(refenetrer); glutDisplayFunc(clavier); glutDisplayFunc(souris); glutMainLoop(); //lancement de la boucle principale return (0); } main(int argc, char** argv) 71
Projection orthogonale : glOrtho(), glOrtho2() Transformation de perspective : glFrustum(), gluPrespective(). OpenGL : Projections 72
Sélection de la matrice active : glMatrixMode() Initialisation de la matrice active : glLoadIdentity() Modification de la matrice active : glLoadMatrix(), glMultMatrix() Gestion de la pile des matrices : glPushMatrix(), glPopMatrix() OpenGL : Matrices
Matrice Push / Pop void glPushMatrix(void); “rappelle-toi où tu es” Matrice du haut copiée : Contenu 1ère matrice (matrice courante) =contenu 2ème matrice Push Matrix
Matrice Push / Pop Pop Matrix void glPopMatrix(void); “retourne où tu étais”
affichageVoiture() { glTranslatef( c_x, c_y, c_z); affichageCarrosserie(); glPushMatrix(); glTranslate( f_x, f_y, f_z); glPushMatrix(); glTranslate( l_x, l_y, l_z); affichagePneu(); glPopMatrix(); glPushMatrix(); glTranslate( r_x, r_y, r_z); affichagePneu(); glPopMatrix();... } Matrice Push / Pop
Rotation : Translation : Changement d'échelle : Repère de l'œil : OpenGL : Transformations 77 glRotatef(angle, x, y, z); glTranslatef(x, y, z); glScalef(x, y, z); gluLookAt( … );
Transformations
Définitions des lumières : glLight*(); glLightModel*(); Propriétés des surfaces : glMaterial*(); glColorMaterial(); OpenGL : Éclairage 79
Listes d'affichage
Liste d'affichage Un groupe de commandes OpenGL seulement Stockées et destinées à être exécutées plus tard dans l’ordre dans lequel elles ont été crées Optimise les performances d’affichage Car affichage d’un seul coup de tout le contenu de la liste
glNewList(listName, mode) mode = GL_COMPILE ou mode = GL_COMPILE_AND_EXECUTE Liste d'affichage : création GL_COMPILE pour ne pas exécuter les commandes dès qu’elles sont placées dans la liste GL_COMPILE_AND_EXECUTE pour exécuter les commandes Immédiatement et les réutiliser après
Gluint MaListe ; /* index de liste */ glNewList (MaListe, GL_COMPILE) ; glColor3f (1.0, 0.0,0.0) ; glBegin (GL_POINTS) ; glVertex2f (0.0, 0.0) ; glEnd () ; glTranslatef (1.5, 0.0, 0.0) ; glEndList (); Liste d'affichage : création
glCallList(MaListe); Exécute la liste MaListe Liste d'affichage : appel glNewList (velo, GL_COMPILE) ; glCallList(guidon) ; glCallList(cadre) ; glTranslatef (1.0, 0.0, 0.0) ; glCallList(roue) ; glTranslatef (3.0, 0.0, 0.0) ; glCallList(roue) ; glEndList ();
Liste d'affichage : gestion glGenLists (Glsizei range) ; générer une suite de nouveaux numéros de liste MaListe = glGenLists (1); glIsList (Gluint list) ; retourne GL_TRUE si le numéro est déjà utilisé glDleteLists (Gluint list, Glsizei range) ; efface une suite de listes
Liste d'affichage : Exemple void triangle() { glBegin(GL_TRIANGLES); glColor3f(0.0,1.0,0.0); glVertex3f(0.0,1.0,0.0); glVertex3f(0.0,0.0,0.0); glVertex3f(1.0,0.0,0.0); glEnd(); }
Liste d'affichage : Exemple void init() { LeTriangle=glGenLists(1); glNewList(LeTriangle,GL_COMPILE); triangle(); glEndList(); } void affichage() { glCallList(LeTriangle); glFlush(); }
Interaction
Clavier Modifier des variables dans clavier() Mettre à jour avec Void clavier() { switch(touche){ case 27 : exit(0) ; case ‘a’ : case ‘A’ : … glutPostRedisplay( ); break; glutPostRedisplay( )
Souris Modifier des variables dans souris() Mettre à jour avec glutPostRedisplay( ) Void souris(int btn, int state, int x, int y) { switch(bouton){ case GLUT_LEFT_BUTTON : if (etat==GLUT_DOWN) …. glutPostRedisplay( ); break ;
Animation Modifier des variables dans anim1( ) Mettre à jour avec Appeler glutIdleFunction( anim1); Void anim1( ) { angle+=2.0; if(angle>360) angle-=360; glutPostRedisplay( ); } GLfloat angle; glutPostRedisplay( )
Visualisation
Visualisation 3D avec OpenGL Transformations de modélisation Transformations de Projection Perspective Parallèle Transformations de clôture 93
Trois types de matrices prédéfinies: Une seule matrice active à la fois Matrices de modélisation-visualisation : GL_MODELVIEW Matrices de projection : GL_PROJECTION Matrices de texture : GL_TEXTURE glMatrixMode(mode); Visualisation sous OpenGL 94
Matrices de modélisation-visualisation : GL_MODELVIEW glTranslate*(), glRotate*(), glScale*() gluLookAt(oeilx,oeily,oeilz, centrex,centrey,centrez, upx,upy,upz); Exemple : glMatrixMode( GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0); glScalef(1.0,2.0,1.0); Visualisation sous OpenGL 95
Visualisation sous OpenGL Deux primitives importantes : glLoadMatrix{fd}(M); M est un tableau de 16 valeurs : m 1,m 2,m 3,.....m 16 Modifie la matrice actice avec les valeurs de M glMultMatrix{fd}(M); Multiplie M par la matrice active (à droite CM) et stocke le résultat comme matrice active 96
Règle : Définir les transformations dans l'ordre inverse Exemple : glMatrixMode( GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(N); glMultMatrixf(M); glMultMatrixf(L); // L est appliqué en premier : N(M(Lv)) glBegin(GL_POINTS); glVertex3f(v); glEnd(); Visualisation sous OpenGL 97
Approche indirecte Suite de transformations : glTranslatef + glRotatef Opérations matricielles Changement de repère : set_view_reference_point + set_view_plane_normal + set_view_up Approche directe gluLookAt Transformations de modélisation 98
glMatrixMode(GL_MODELVIEW) ; glTranslatef(0.0,0.0,1.0) ; glRotatef(90.0,0.0,1.0,0.0) ; 1 ère approche : suite de transformations 99
set_view_reference_point(x,y,z) permet de définir l’emplacement de la caméra (x,y,z) set_view_plane_normal(n x,n y,n z ) permet de définir la normale du plan de vision set_view_up(h x,h y,h z ) permet de définir le haut du plan de vision 2 ème approche : changement de repère 100
gluLookAt( Oeil x, Oeil y, Oeil z, PR x, PR y, PR z, V x, V y, V z ); Oeil y Oeil z Oeil x PR y Y X Z V 3 ème approche : gluLookAt 101
PR z x y H N = oeil - PR P = V N H = N P V // Y N P H P 3 ème approche : gluLookAt 102 N V P N H
Pile de matrices : glMatrixMode(GL_PROJECTION); Projection des objets de la scène sur l’image de la caméra. Transformations de projection Objectif : définir un volume de vision 103
glFrustum(GLdouble xmin, GLdouble xmax, Gldouble ymin, Gldouble ymax, Gldouble zmin, Gldouble zmax) ; (xmin, ymin, zmin) (xmax, ymax, zmax) z x y Transformations de projection : Perspective 104
Matrices de projection : GL_PROJECTION Objectif : définir un volume de vision Projection en perspective : glFrustum(gauche, droit,bas,haut,proche, eloigne); haut gauche droit bas Visualisation sous OpenGL 105
glFrustum(); N'est pas trés intuitive : gluPerspective(angle,aspect, proche, eloigne); h Visualisation sous OpenGL 106
gluPerspective(angle_de_vue, rapport, zmin, zmax) (zmin) (zmax) z x y Transformations de projection : Perspective 107
Projection Perspective Oeil Plan Clipping Proche Plan Clipping Eloigné Plan Clipping Droit
glOrtho(xmin, xmax, ymin, ymax, zmin, zmax) z x y (xmin, ymin, zmin) (xmax, ymax, zmax) Transformations de projection : Parallèle 109 Projection orthogonale glOrtho(gauche, droit,bas,haut,proche, eloigne);
Projection Orthographique Oeil Plan Clipping Proche Plan Clipping Eloigné Plan Clipping Droit
glViewport(GLint x, GLint y, GLsizei largeur, GLsizei hauteur) (x,y) largeur hauteur Transformations de clôture Transformations de cadrage : définition d'une zone dans la fenêtre de travail 111
Projections