L'exécutable

Déplacement de la fonction gluLookAt de la fonction reshape vers la fonction display juste avant l'appel à la fonction scene.
Introduction d'une variable globale cam sur laquelle est implanté un switch dans la fonction display pour faire varier les paramètres du gluLookAt.
Ajout dans la fonction keyboard d'un contrôle clavier sur la touche espace pour gérer les variations de la variable cam entre les valeurs 0, 1 et 2.
Adaptation des paramètres cmin et cmax de l'appel à la fonction gluPerspective dans la fonction reshape pour que toute la scène soit située entre ces deux distances de la caméra.

 

Fichier source : Camerasc.cpp

static int cam = 0;

/* Fonction executee lors d'un rafraichissement */
/* de la fenetre de dessin                      */

static void display(void) {
  glClearColor(0.15F,0.15F,0.15F,1.0F);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  const GLfloat light0_position[] = { 0.0,0.0,0.0,1.0 };
  const GLfloat light1_position[] = { -1.0,1.0,1.0,0.0 };
  const GLfloat light2_position[] = { 1.0,-1.0,1.0,0.0 };
  glLightfv(GL_LIGHT0,GL_POSITION,light0_position);
  glLightfv(GL_LIGHT1,GL_POSITION,light1_position);
  glLightfv(GL_LIGHT2,GL_POSITION,light2_position);
  glPushMatrix();
  switch (cam) {
    case 0 :
      gluLookAt( 0.0, 0.0, 15.0,
                 0.0, 0.0,  0.0,
                 0.0, 1.0,  0.0);
      break;
    case 1 :
      gluLookAt( 0.0, 0.0, -15.0,
                 0.0, 0.0,  0.0,
                 0.0, 1.0,  0.0);
      break;
    case 2 :
      gluLookAt( 5.0,10.0, 10.0,
                 0.0, 0.0,  0.0,
                 0.0, 1.0,  0.0);
      break; }
  scene();
  glPopMatrix();
  glFlush();
  glutSwapBuffers();
  int error = glGetError();
  if ( error != GL_NO_ERROR )
    printf("Attention erreur %d\n",error);
}

/* Fonction executee lors d'un changement       */
/* de la taille de la fenetre OpenGL            */

static void reshape(int x,int y) {
  glViewport(0,0,x,y); 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(80.0F,(float) x/y,5.0,25.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}

/* Fonction executee lors de l'appui            */
/* d'une touche alphanumerique du clavier       */

static void keyboard(unsigned char key,int x,int y) {
  switch (key) {
    case 0x20 :
      cam = (cam+1)%3;
      glutPostRedisplay();
      break;
    case 0x1B :
      exit(0);
      break; }
}

RETOUR