/* ILLUSTRE LA PRECISION DU TAMPON DE PROFONDEUR TOUCHES: 'p': REDUIT OU AGRANDIT LA PROFONDEUR EN Z DE LA PYRAMIDE DE PROJECTION. LORSQUE LA PROFONDEUR EST TROP GRANDE, LE ZBUFFER DONNE DE MAUVAIX RESULTATS */ #include #include // VARIABLES RELATIVES A LA PROJECTION CENTRALE float AngleDeVue = 45.0f; // Angle de vue en degres double ZLePlusProche[3] = {1.0, 0.00001, 0.0001}, ZLePlusLoin[3] = {1000.0, 10000000000.0, 100000.}; // 3 choix pour la profondeur // VARIABLES STOCKANT LE CHOIX DE L'UTILISATEUR int ChoixProfondeur = 0; // POSITION ET VERTICALITE DE LA CAMERA GLfloat PositionCamera[3] = {100.0, 100.0, 100.0}; GLfloat VerticaleCamera[3] = {0.0, 1.0, 0.0}; // INFORMATION TEXTUELLES void AfficheInformationTextuelle() { double GaucheMonde, DroiteMonde, BasMonde, HautMonde; printf("Touches: 'p' modifie la profondeur de la pyramide de projection\n"); printf(" Z le plus proche: %20.6f Z le plus loin %20.6f\n", ZLePlusProche[ChoixProfondeur], ZLePlusLoin[ChoixProfondeur]); } void GestionEvenementClavier(unsigned char CodeTouche, int x, int y) { switch (CodeTouche) { case 27: exit(-1); case 'p' : // Changement du mode de projection ChoixProfondeur = (ChoixProfondeur + 1) % 3; glutPostRedisplay(); break; } } void DessinDeLaScene() { int i; double GaucheMonde, DroiteMonde, BasMonde, HautMonde; glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); // DETERMINATION DE LA MATRICE DE PROJECTION AfficheInformationTextuelle(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(AngleDeVue, 1.0, ZLePlusProche[ChoixProfondeur], ZLePlusLoin[ChoixProfondeur]); //------------------------------------------- // MATRICE DE MODELISATION glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // POSITIONNEMENT DE LA CAMERA gluLookAt( PositionCamera[0], PositionCamera[1], PositionCamera[2], // eye location 0.0, 0.0, 0.0, // center location VerticaleCamera[0], VerticaleCamera[1], VerticaleCamera[2]); // up vector // DESSIN DES TROIS AXES glLineWidth(5); glBegin(GL_LINES); // DESSIN DE L'AXE Ox MONDE EN ROUGE glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-60.0f, 0.0f, 0.0f); glVertex3f( 60.0f, 0.0f, 0.0f); // DESSIN DE L'AXE Oy MONDE EN VERT glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(0.0f, 60.0f, 0.0f); glVertex3f(0.0f,-60.0f, 0.f); // DESSIN DE L'AXE Oz MONDE EN BLEU glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(0.0f, 0.0f, 60.0f); glVertex3f(0.0f, 0.0f,-60.0f); glEnd(); // DESSIN DE L'OBJET, UN PLAN "LEGEREMENT DEVANT" LES AXES Ox ET Oy glColor3f(0.0f, 1.0f, 1.0f); glBegin(GL_QUADS); glVertex3f( -30., -30., 1.0); glVertex3f( +30., -30., 1.0); glVertex3f( +30., +30., 1.0); glVertex3f( -30., +30., 1.0); glEnd(); glutSwapBuffers(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize( 400, 400); glutCreateWindow("PRECISION TAMPON PROFONDEUR"); glutDisplayFunc(DessinDeLaScene); glutKeyboardFunc(GestionEvenementClavier); glutMainLoop(); return (0); }