Le cube tournant en OpenGL
Par Xavier Michelon


 
 
Les fonctions de rappel liées à la souris :

Glut permet de définir une fonction de rappel pour les boutons de la souris. On met en place le rappel avec glutMouseFunc(). La fonction enregistrée sera appelée à chaque fois que l'utilisateur appuiera sur un des boutons de la souris ou le relâchera. Enregistrons une fonction appelée mouse() :

  glutMouseFunc(mouse);

Le prototype de la fonction mouse() doit être le suivant :

void mouse(int bouton,int etat,int x,int y)

Lorsque la fonction est lancée par le gestionnaire d'événements de glut, 'bouton' contient le nom du bouton qui a été pressé ou relâché (GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON), 'etat' indique si le bouton a été pressé (GLUT DOWN) ou relaché (GLUT_UP) et 'x' et 'y' contient les coordonnées de la souris au moment de l'événement. Nous souhaitons que le mouvement de la souris ne soit appliqué au cube que lorsque le bouton gauche est enfoncé. Nous allons mettre en place une variable globale 'pressé' (de type char) qui vaudra 1 lorsque le bouton est pressé, et 0 lorsque le bouton est relâché. Nous allons également introduire deux entiers x_old et y_old (défini comme variable globale afin qu'ils soient accessibles depuis l'autre fonction de rappel pour la souris). Ils vont servir à stocker la position de la souris lors de l'appui sur le bouton de gauche.

void mouse(int button, int state,int x,int y)
{
  /* si on appuie sur le bouton gauche */
  if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
  {
    presse = 1; /* le booleen presse passe a 1 (vrai) */
    xold = x; /* on sauvegarde la position de la souris */
    yold=y;
  }
  /* si on relache le bouton gauche */
  if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) 
    presse=0; /* le booleen presse passe a 0 (faux) */
}

Le second rappel lié à la souris génère un événement lorsque la souris est déplacée alors qu'au moins un des boutons est pressé. L'enregistrement de la fonction de rappel se fait avec glutMotionFunc(), et le prototype de la fonction enregistrée doit être le suivant :

void mousemotion(int x,int y)

'x' et 'y' sont les coordonnées de la souris par rapport au coin supérieur gauche de la fenêtre au moment de la génération de l'événement. Notre fonction mousemotion a pour but de mettre à jour les valeurs de 'anglex' et 'angley' en fonction du déplacement relatif de la souris si le bouton gauche est enfoncé (c'est-à-dire si 'presse' vaut 1) :

void mousemotion(int x,int y)
  {
    if (presse) /* si le bouton gauche est presse */
    {
      /* on modifie les angles de rotation de l'objet
	 en fonction de la position actuelle de la souris et de la derniere
	 position sauvegardee */
      anglex=anglex+(x-xold); 
      angley=angley+(y-yold);
      glutPostRedisplay(); /* on demande un rafraichissement de l'affichage */
    }
    
    xold=x; /* sauvegarde des valeurs courante de le position de la souris */
    yold=y;
  }