Le cube tournant en OpenGL
Par Xavier Michelon


 
 

La fonction de rappel 'redimensionnement' :

J'ai évoqué la dernière fois un problème qui se pose lorsque qu'on redimensionne la fenêtre OpenGL. Par défaut, la scène OpenGL occupe toute la fenêtre, et la scène représente tous les points dont les coordonnées en x et y sont comprises entre -1 et 1. Si on redimensionne la fenêtre et que le nouveau rapport hauteur/largeur de la fenêtre ne vaut pas 1, l'image subit une déformation. Une technique pour éviter ceci consiste à limiter la zone utilisée pour le dessin à la plus grande sous partie carrée de la fenêtre OpenGL, qu'on prendra soin de centrer. Si on redimensionne la fenêtre à une taille 'w' par 'h', la plus grande sous partie carré de la fenêtre mesure w pixels si w<h et h pixels si w>h.

glut propose une fonction de rappel pour les redimensionnements de la fenêtre. Cette fonction doit être enregistrée grâce à glutReshapeFunc(). Voici la fonction de rappel que je vous propose :

void reshape(int x,int y)
{
  if (x<y)
    glViewport(0,(y-x)/2,x,x);
  else 
    glViewport((x-y)/2,0,y,y);
}

Lors de l'appel à reshape(), 'x' contient la nouvelle largeur de la fenêtre, et 'y' la nouvelle hauteur. La fonction glViewport() permet de limiter la zone de dessin à une portion de la fenêtre. Son prototype est :

void glViewport(GLint x,GLint y,GLSizei largeur,GLSizei hauteur)

'x' et 'y' sont les coordonnées du coin supérieur gauche de la sous-fenêtre. Je vous laisse le soin de deviner ce que sont les paramètres 'largeur' et 'hauteur'.