Le cube tournant en OpenGL
Par Xavier Michelon


 
 
Le cube : affichage
 

Voyons maintenant comment utiliser cette structure de données lors de l'affichage de la scène, c'est-à-dire dans notre fonction affichage(). La dernière fois, nous avons vu que la description d'un polygone se fait par énumération des sommets (avec la fonction glVertex()), le tout encadré par un glBegin() et un glEnd(). Avec notre structure de données, nous allons utiliser 2 boucles for imbriquées. La première permet de parcourir chacune des faces, la seconde permet d'énumérer les 4 points de chaque face :

  for (i=0;i<6;i++)
    {
      glBegin(GL_POLYGON);
      for (j=0;j<4;j++)
	{
	  glColor3f(p[f[i][j]].r,p[f[i][j]].g,p[f[i][j]].b);
	  glVertex3f(p[f[i][j]].x,p[f[i][j]].y,p[f[i][j]].z);
	}
      glEnd();
    }

Si vous avez du mal à comprendre la portion de code ci-dessus, je vous conseille d'essayer de simuler 'à la main' sur une feuille de papier le fonctionnement des boucles. Vous verrez que finalement, c'est moins compliqué qu'il n'y parait :).

Animation

Nous souhaitons donner du mouvement à notre cube grâce à la souris. Aussi, il faut essayer de répondre à la question "Comment faire tourner notre cube ?". Sachant que le sujet des transformations d'objets (translation, rotation, mise à l'échelle) est vaste, je vais pour aujourdhui vous 'balancer' une portion de code sans donner d'explications poussées. Dès la prochaine fois, nous étudierons en détail la question.

  glLoadIdentity();
  glRotatef(-angley,1.0,0.0,0.0);
  glRotatef(-anglex,0.0,1.0,0.0);

Ces lignes sont à placer dans la fonction affichage(), juste avant la description des faces. Les transformations d'objets sont stockées dans une matrice. La fonction GlLoadIdentity(angle,x,y,z) permet de réinitialiser la matrice de transformation, glRotatef() ajoute à la matrice de transformation une rotation dont l'axe passe par l'origine et est porté par le vecteur (x,y,z). Ici, nous avons défini une rotation d'angle '-angley' autour de l'axe x, et une rotation d'angle '-anglex' autour de l'axe y. La notation utilisée peut vous paraître bizarre, mais elle est dictée par la souris : un déplacement horizontal (suivant x) de la souris correspond intuitivement à une rotation du cube autour de l'axe y. Il est important de noter que les rotations sont appliquées dans le sens inverse de leur description. Ainsi, nous avons défini ci-dessus une rotation autour de l'axe y suivie d'une rotation autour de x (dont le résultat est en général différent d'une rotation autour de x suivie d'une rotation autour de y).

Il nous faut maintenant déterminer les valeurs des variables anglex et angley en fonction de la position de la souris. Le comportement souhaité est le suivant : pour faire tourner le cube, l'utilisateur doit cliquer sur la fenêtre OpenGL, maintenir le bouton enfoncé et déplacer la souris. Nous allons utiliser deux nouvelles fonctions de rappel offertes par glut.