/* CANEVAS POUR UNE INITIATION A OPENGL */ /*======================================*/ /* Compilation sous UNIX : dans le rŽpertoire de travail 1¡) Creez un fichier "Makefile" avec le texte ci-dessous (remplacez par la caractre tabulation). Supprimez -lXi -lXmu suivant les configurations systmes. ----------------------------------------- XLIBS = -L/usr/X11/lib -L/usr/X11R6/lib -lX11 -lXext -lpthread GLLIBS = -L/usr/X11R6/lib -lglut -lGL -lGLU helloGlut : helloGlut.o gcc -o helloGlut helloGlut.o $(GLLIBS) $(XLIBS) -lm 2¡) Compilez avec la commande ----------------------------- make helloGlut 3¡) Executez avec la commande ----------------------------- ./helloGlut */ /* Exemple des fonctionnalites du fenetrage GLUT */ /* ============================================= */ // La scene consiste juste en un triangle et le trace des 3 axes du repere. // Le bouton gauche de la souris donne acces a un menu // Un message specifique revele l'enchainement des fonctions d'interruption declenchees par GLUT #include #include #if defined(__APPLE__) && !defined(__APPLE_X11) #include #else #include #endif /* Variables globales pour parametrer la scene */ /* ------------------------------------------- */ // Position de la camera //float Zcam=20., Xcam=5., Ycam=5.; float Zcam=10., Xcam=3., Ycam=3.; // et direction visee float Vxcam=-1.5, Vycam=-.5, Vzcam=-5.; /* Construction de la scene */ /* ------------------------ */ // Un objet simple dans la scene void construireObjet(void) { glBegin (GL_TRIANGLES); glVertex3f (-1., .0, .0); glVertex3f (1., .0, .0); glVertex3f (0., 1., .0); glEnd (); } // Repere orthonorme void repereScene3D(float l) { glColor3f(1., 0., 0.) ; glBegin (GL_LINES); glVertex3f (0., 0., 0.); glVertex3f (l, 0., 0.); glVertex3f (0., 0., 0.); glVertex3f (0., l, 0.); glVertex3f (0., 0., 0.); glVertex3f (0., 0., l); glEnd (); } void construireScene(void) { printf("On passe dans 'construireScene'\n"); // "effacement" de la fenetre et du z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // initialisation de MODELVIEW glLoadIdentity (); // position de la camera gluLookAt (Xcam, Ycam, Zcam, // position Xcam+Vxcam, Ycam+Vycam, Zcam+Vzcam, // point vise 0.0, 1.0, 0.0); // "verticale appareil" repereScene3D(5.); // glColor3f(0.,1.,0.) ; construireObjet(); glutSwapBuffers (); } /* Fonction liees aux interruptions */ /* -------------------------------- */ void fenetrage(int largeur, int hauteur) { printf("On passe dans 'projection'\n"); glViewport (0, 0, largeur, hauteur); // Projection 3D -> 2D liee ˆ la taille de la fentre glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (65.0, (float) largeur/(float) hauteur, 1.0, 50.0); glMatrixMode (GL_MODELVIEW); } void clavier (unsigned char key, int x, int y) { switch (key) { case 27 : /* escape : fin */ exit (0); break; case ' ' : /* exemple d'action sur la touche ' ' */ printf("vous avez appuye sur la barre espace\n"); break; default : printf("Arretez d'appuyer n'importe ou !\n"); } } void fleches(int key, int x, int y) { printf("Vous avez appuye sur une fleche ou une touche !\n"); switch (key ) { case GLUT_KEY_UP : break; case GLUT_KEY_DOWN : break; case GLUT_KEY_LEFT : break; case GLUT_KEY_RIGHT : break; } // glutPostRedisplay(); pour demander au systeme un nouvel affichage } void souris(int bouton, int state, int x, int y) { // state vaut GLUT_DOWN ou GLUT_UP printf("click souris\n"); switch (bouton) { case GLUT_LEFT_BUTTON : /* inutile ici, car utilise pour le menu (cf main) */ break; case GLUT_MIDDLE_BUTTON : // inserer ici l'action associee au bouton central // glutPostRedisplay(); si l'evenement doit modifier l'affichage break; case GLUT_RIGHT_BUTTON : // inserer ici l'action associee au bouton droit // glutPostRedisplay(); si l'evenement doit modifier l'affichage break; } } void menu(int value) { switch (value) { case 0: /* bascule face pleine/aretes que vous devez programmer */ printf("A VOUS DE LE PROGRAMMER\n") ; break ; case 1: printf("coucou\n"); break ; case 2: exit(0); break ; } } /* Initialisation et boucle d'evenements */ /* ------------------------------------- */ void initScene (void) { glClearColor (0.0, 0.0, 0.0, 0.0); glCullFace (GL_BACK); // designation des faces "non visibles" // glEnable (GL_CULL_FACE); // faces "non visibles" ignorees glPolygonMode (GL_FRONT, GL_FILL); // faces avants pleines (sens trigo des sommets) glPolygonMode (GL_BACK, GL_LINE); // faces arrieres vides glEnable (GL_DEPTH_TEST); } int main (int argc, char **argv) { /* initialisation de la session GLUT */ glutInit (&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); /* creation d'une fenetre hauteur-largeur*/ glutInitWindowSize (512,512); glutInitWindowPosition (50, 50); glutCreateWindow (argv [0]); /* designation des fonctions liees aux interruptions */ glutDisplayFunc(construireScene); glutReshapeFunc(fenetrage); glutKeyboardFunc(clavier); glutMouseFunc(souris); glutSpecialFunc(fleches); /* Un petit menu au bouton gauche */ glutCreateMenu(menu); glutAddMenuEntry("facettes/aretes", 0); glutAddMenuEntry("coucou !", 1); glutAddMenuEntry("quitter", 2); glutAttachMenu(GLUT_LEFT_BUTTON); /* boucle d'evenements */ initScene(); glutMainLoop (); return 0; }