La lecture en ligne est gratuite
Le téléchargement nécessite un accès à la bibliothèque YouScribe
Tout savoir sur nos offres
Télécharger Lire

cours 3

De
9 pages
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 : ...
Voir plus Voir moins
OpenGL
Programmation 3D avec OpenGL
IUT informatique Johann Vandromme johann.vandromme@lifl.fr année 20052006
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
1
1 1 glTranslatef (3.5, 0.9, 0);
1
Les transformations – repère local
void glScalef (float factX, float factY, float factZ); Agrandit / rétrécit le repère courant
1
1
glScalef (1/2, 2, 0);
1
1
void glRotatef (float angle, float axeX, float axeY, float axeZ); fait tourner le repère courant
1
1
glRotatef (43, 0, 0, 1);
1
1
Les transformations – la rotation
Soit le repère courant suivant :
Dessin d’un cube de côté 1:
1
1
1
1
Donner une liste de transformations possibles pour obtenir le résultat suivant.
2
Pour exemple, nous allons construire un robot.
Hiérarchie du robot:
Le corps :
Taille : 2, 4, 2;
Articulation : Taille : 1;
Bras jambe : avant bras
cou :
tête :
Taille : 0.5, 2, 0.5;
Taille : 0.4;
Taille : 1.5;
Le robot
Hiérarchie
Proportions
3
Le corps
void dessinerRobot() { glPushMatrix(); glTranslatef (posRobotX, posRobotY, posRobotZ); dessinerCorps(); glPopMatrix(); } void dessinerCorps()
void dessinerBrasGauche()
void dessinerJambeGauche()
Les Bras
void dessinerBrasDroit()
Les jambes
void dessinerJambeDroite()
4
void dessinerTete()
La tête
Les matrices
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
void affichage () { glMatrixMode (GL_PROJECTION); glLoadIdentity(); gluPerpective(); glRotatef(); glTranslatef(); dessinerObjet(); }
Pourquoi cette méthode fonctionnetelle ?
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.
Pourquoi définir une normale à la caméra ?
gluLookAt - exemple
Void affichage() { glMatrixMode (GL_MODELVIEW); glLoadIdentity(); gluLookAt(1, 0, 0, 0, 1, 0, 0, 0, 1); glTranslatef (0, 5, 0); glutSolidSphere (0.5, 10, 10); }
 Résultat de ce code ?
 comment viser la sphère ?
7
gluLookAt : ATTENTION
ATTENTION toutefois au glScale qui modifie la taille du repère
Void affichage() { glMatrixMode (GL_MODELVIEW); glLoadIdentity(); gluLookAt(1, 0, 0, 0, 5, 0, 0, 0, 1); glScalef (0.5, 0.5, 0.5); glTranslatef (0, 5, 0); glutSolidSphere (0.5, 10, 10); }
Les listes d ’affichage
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.
8
Listes d ’affichage : exemple
unsigned int tore;
void initGL() { createLists(); } void createLists() { tore = glGenLists(1); glNewList(tore, GL_COMPILE); glutSolidtore(); glEndList(); } void affichage () { glMatrixMode (GL_MODELVIEW); glLoadIdentity(); glScalef (0.5, 0.5, 0.5); glTranslatef (0, 5, 0); glCallLists (tore, 1); }
void clavier(unsigned char key, int x, int y) { switch (key) { caseq: glDeleteLists(tore, 1); ... } }
9
Un pour Un
Permettre à tous d'accéder à la lecture
Pour chaque accès à la bibliothèque, YouScribe donne un accès à une personne dans le besoin