OpenGLProgrammation 3D avecOpenGLIUT informatique Johann Vandrommejohann.vandromme@lifl.frannée 2005-2006Cours 3• 1 – Les transformations• 2 – La projection perspective1 – Les transformations• Nous allons revenir sur la notion de transformations vue la foisdernière• Méthode d ’approximation par repère local• Création d ’objets complexes hiérarchisés : le robot1123Les transformations – repère local• Pour savoir l’impact de transformations successives, on vaconsidérer que chaque appel à une fonction de transformationva modifier le reprère courant.• Lorsque l’on dessinera l’objet, il sera dessiné dans le repèrecourant.• Première transformation : – void glTranslatef (float transX, float transY, float transZ);• Déplace le repère courant111glTranslatef (3.5, -0.9, 0);1Les transformations – repère local• void glScalef (float factX, float factY, float factZ);• Agrandit / rétrécit le repère courant11 glScalef (1/2, 2, 0);11• void glRotatef (float angle, float axeX, float axeY, float axeZ);• fait tourner le repère courant1 glRotatef (43, 0, 0, 1); 111Les transformations – la rotation• Soit le repère courant suivant :11• Dessin d’un cube de côté 1:Donner une liste deDonner une liste de1 transformations possibles pourtransformations possibles pourobtenir le résultat suivant.obtenir le résultat suivant.12456Le robot• Pour exemple, nous allons construire un robot.Hiérarchie• Hiérarchie du robot:Proportions• Le corps : ...
IUT informatique Johann Vandromme johann.vandromme@lifl.fr année 20052006
1 – Les transformations 2 – La projection perspective
Cours 3
1 – Les transformations
Nous allons revenir sur la notion de transformations vue la fois dernière
Méthode d ’approximation par repère local
Création d ’objets complexes hiérarchisés : le robot
1
Les transformations – repère local
Pour savoir l’impact de transformations successives, on va considérer que chaque appel à une fonction de transformation va modifier le reprère courant. Lorsque l’on dessinera l’objet, il sera dessiné dans le repère courant. Première transformation : void glTranslatef (float transX, float transY, float transZ); – Déplace le repère courant
Toutes ces transformations modifient la matrice courante. Pour OpenGl, il existe 3 matrices: la matrice de transformation (celle qui nous interesse ici) – la matrice de projection (vu dans le cours 2 pour la perspective) – la matrice de texture (vu plus tard) – choix de la matrice active (celle qui sera modifiée): glMatrixMode (enum mode) ; – la variable mode peut prendre les valeurs suivantes : – GL_MODELVIEW GL_PROJECTION GL_TEXTURE Toujours s ’assurer que la matrice active est la bonne avant de la modifier
2 - La perspective
En projection orthographique (parallèle / cavalière) : difficulté à percevoir la notion de profondeur. – Ex : quelle est la face du cube la plus proche de l ’observateur dans la fig 1 ? –
5
La perspective
La perspective est calculée dans une matrice à part (GL_PROJECTION)
Pour un objet O composé des points {p}, les points résultants d ’une projection et d ’un ensemble de transformations est l ’ensemble {p ’} tel que : {p ’} = Mp * Mt * {p};
Le fait d ’avoir séparer la matrice d ’affichage avec la matrice de projection permet d ’initialiser la matrice de projection une fois pour toute dans le programme;
fonction de paramétrage de la matrice de projection :
void gluPerspective (GLdoublefovy, GLdoubleaspect, GLdoublezNear, GLdoublezFar); (voir le cours 2 pour les paramètres)
Utiliser la matrice de projection
Initialisation :
int main (int argc, char **argv) { // initialisation de glut … winId = glutCreateWindow("mon programme"); // initialisation d ’openGL ... glMatrixMode (GL_PROJECTION); glLoadIdentity(); gluPerpective(angleFOV, ...); glMatrixMode (GL_MODELVIEW); }
Utiliser la matrice de projection
Modification de la matrice en cours de programme Par exemple, les touches « a » et « z » modifient la valeur de l ’angle de champs de vision : void clavier (unsigned char key, int x, int y) { switch(key) { case ‘a’: glMatrixMode (GL_PROJECTION); glLoadIdentity(); gluPerpective(angleFOV++, ...); glMatrixMode (GL_MODELVIEW); break; case ‘z’: glMatrixMode (GL_PROJECTION); glLoadIdentity(); gluPerpective(angleFOV, ...); glMatrixMode (GL_MODELVIEW); break; } }
6
Erreur fréquente
Dans la fonction d’affichage, on peut paramétrer la perspective et mettre toutes les transformations de la scène sans activer la matrice de transformation
Cette méthode fonctionne mais n ’est pas utilisée (peu optimisée: redéfinition de la projection + calculs associés à chaque fois)
La fonction gluLookAt
La fonction gluLookAt permet de simuler une caméra. Ses paramètres sont les suivants : position de la caméra (eye) – direction de la caméra (center) – normale à la caméra (up) – gluLookAt (float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ); Cette fonction permet de générer les glTranslatef, glRotatef correspondants. Elle modifie donc la matrice de transformation – Pour la placer aux coordonnées du monde et que tous les objets subissent les transformations nécessaires, on appellera cette fonction en tout premier ATTENTION : les paramètres centerX, centerY et centerZ définissent la position ABSOLUE du point à viser.
Lorsque l ’on défini un objet, la liste de vertexes et de polygones qui le composent sont envoyés à la carte graphique. Plutôt que de redéfinir un même objet à chaque fois dans la fonction d ’affichage, on pourrait l ’envoyer dans la mémoire de la carte graphique une seule fois et rappeler l ’affichage de cette objet à chaque fois (évite les transferts mémoires) Utilisation des listes d ’affichage. Principe : on défini un objet une fois pour toute et on lui donne un identifiant. – À chaque dessin de l ’objet, on ne le redéfinie pas : on l ’appel par son identifiant. –
Listes d ’affichage : fonctions
unsigned int glGenLists (nbLists); génère nbLists numéros identifiant uniques et renvoie l ’index de la première liste. – glNewList(unsigned int idList, GLenum mode); déclare le début de définition de la liste idList. – Le mode peut être : GL_COMPILE (permet d ’aller « enregistrer » la liste; ou – GL_COMPILE_AND_EXECUTE : enregistre la liste ET la dessine glEndList(); fin de la définition de la liste courante – glDeleteLists(unsigned int listId, unsigned int range); supprime range listes à partir de l ’index listId. –