Les transformations sous OpenGL pour Windows
Les fonctions de transformation vont permettre d'effectuer des opérations sur le repère de la matrice courante.
Les différentes transformations que vous pouvez effectuer sur votre repère sont:
La translation:
L'origine de la matrice courante est déplacée vers x, y et z
La fonction sera glTranslated qui se décline en deux autres fonctions:
void glTranslated(
GLdouble x,
GLdouble y,
GLdouble z
);
et
void glTranslatef(
GLfloat x,
GLfloat y,
GLfloat z
);
L'homothétie:
Il s'agit en fait de faire un agrandissement ou une réduction du repère via une homothétie sur la matrice courante.
La fonction sera glScale qui se décline aussi en deux autres fonctions:
void glScaled(
GLdouble x,
GLdouble y,
GLdouble z
);
et
void glScalef(
GLfloat x,
GLfloat y,
GLfloat z
);
La rotation:
Il s'agit de faire une rotation du repère de la matrice courante.
La fonction sera glRotate qui là encore se décline en deux fonctions:
void glRotated(
GLdouble angle,
GLdouble x,
GLdouble y,
GLdouble z
)
et
void glRotatef(
GLfloat angle,
GLfloat x,
GLfloat y,
GLfloat z
)
Où angle sera donné en degré
Pour connaître
l'effet sur la matrice courante de ces transformations, voir ici.
Remarque:
Ces trois fonctions retourneront GL_INVALID_OPERATION si elles sont déclenchées entre une fonction glBegin et glEnd.
Seules les objets
dessinés après une commande de transformation subiront cette transformation.
Vous pouvez donc fort bien dessiner un objet puis faire subir une rotation au repère, l'objet précédemment dessiner ne subira pas cette rotation. A l'inverse, les objets suivants, quant-à eux, la subiront.
Le jeter de classeurs:
Deux classeurs sont lancés sur l'axe z. Le premier classeur que l'on perçoit est le plus proche de nous initialement. Dans le programme, nous allons effectuer une première translation ainsi qu'une rotation sur notre classeur. Puis nous dessinons un second classeur (donc plus éloigné de nous au départ que le premier classeur) sur lequel nous ne faisons subir qu'une translation identique à la translation de notre premier classeur. Cependant, l'effet est le suivant:
Le second classeur semble subir lui aussi la rotation donnée sur notre premier classeur et semblera aller plus vite que le second !
Normal, puisque comme je l'ai déjà indiqué, les transformations sont faites sur le repère et non un objet précis. Notre second classeur subira donc l'effet de translation et rotation de notre premier classeur + la translation de notre second classeur d'où la rotation et l'impression qu'il va plus vite !
L'avantage est clair, il est inutile de refaire n fois une opération de transformation sur tous les objets, vous pouvez le faire qu'une seule fois. Par contre, il y a un problème si vous voulez ne le faire que sur un objet.
Pour éviter ce phénomène, vous pourrez utiliser la fonction glLoadIdentity(); pour réinitialiser votre repère avant d'effectuer la translation sur le second objet.
Seulement, si vous aviez d'autres transformations qu'il fallait garder, il faudra les refaire...A moins qu'il n'existe un moyen de mémoriser votre matrice avant de faire une nouvelle transformation dessus ???
Réponse dans le chapitre suivant !
Annexes
OpenGL pour Linux, Windows, Android...