#include #include #include #include #include float angle = 0.0; float angle_bleu = 0.0; float angle_local_bleu = 0.0; float angle_rouge = 0.0; float angle_jaune = 0.0; /* Pour l'animation */ void idle() { angle += 0.5; angle_bleu += 1; angle_local_bleu += 0.5; angle_rouge += 3; angle_jaune += 0.5; glutPostRedisplay(); /* force l'appel au display() à la prochaine boucle */ } void tracerCentre() { glPushMatrix(); glColor3f(1, 1, 1); glBegin(GL_POINT); { glVertex3f(0, 0, 0); } glEnd(); glPopMatrix(); } void tracerCarre() { glPushMatrix(); glBegin(GL_POLYGON); { glColor3f(1, 0, 0); glVertex3f(-1, -1, 0); glColor3f(0, 1, 0); glVertex3f(1, -1, 0); glColor3f(0, 0, 1); glVertex3f(1, 1, 0); glColor3f(1, 0, 1); glVertex3f(-1, 1, 0); } glEnd(); /* Moyenne pondérée des couleurs : interpolation de Gouraud. */ glPopMatrix(); } /* Pour les changements de taille de fenêtre */ void reshape(int width, int height) { glViewport(0, 0, (GLint)width, (GLint)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); } /* Redessine l'affichage */ void display() { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0, 0, -5); tracerCentre(); glRotatef(angle, 0, 0, -1); glScalef(2.0, 0.5, 1.0); /* glTranslatef(1.5, 0, 0); */ /* Dessiner */ tracerCarre(); /* glTranslatef(0, 0, 5); /\* On l'ajoute, sinon on éloignerait le repère de + en +... et on ne verrait plus rien *\/ */ /* Il n'a plus d'incidence car on supprime toutes les modifs avec le POP juste après */ glPopMatrix(); /* glFlush(); /\* Demande la synchro avec X *\/ Inutile en DOUBLEBUFF */ glutSwapBuffers(); } /* 5/ Primitives glut & mvts */ void display2() { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0, 0, -10); glRotatef(angle, 1, 1, 0); /* Dessiner */ glColor3f(0, 0.5, 0.8); glutSolidTorus(1.0, 3.0, 4, 10); /* glTranslatef(1.5, 0, 0); */ glPopMatrix(); glutSwapBuffers(); } /* Planetes */ void display3() { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0, 0, -10); /* Dessiner */ glColor3f(0, 1, 0); glutSolidSphere(1, 10, 10); /* Cone bleu */ glPushMatrix(); { glRotatef(angle_bleu, 0, 0, -1); glTranslatef(2, 0, 0); glRotatef(90, 0, -1, 0); /* Sphere rouge */ glPushMatrix(); { glRotatef(angle_rouge, 0, 0, -1); glTranslatef(0, 1, 0); glColor3f(1, 0, 0); glutSolidSphere(0.3, 10, 10); } glPopMatrix(); glRotatef(angle_local_bleu, -1, 0, 0); glColor3f(0, 0, 1); glutSolidCone(0.4, 0.5, 10, 10); } glPopMatrix(); /* Sphere jaune */ glPushMatrix(); { glRotatef(angle_jaune, 0, 0, -1); glTranslatef(3, 0, 0); glColor3f(1, 1, 0); glutSolidSphere(0.5, 10, 10); } glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } void init() { glEnable(GL_DEPTH_TEST); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); /* Lum blanche, direction : (0, 0, -1); */ glEnable(GL_COLOR_MATERIAL); /* Permet de dire que les glColor() affecteront les matériaux */ glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); /* Front : faces directes (sens antihoraire) */ /* glShadeModel(GL_FLAT); */ } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowSize(512, 512); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); glutCreateWindow("Pouet"); init(); glutReshapeFunc(reshape); glutDisplayFunc(display3); glutIdleFunc(idle); glutMainLoop(); return EXIT_SUCCESS; }