Bonjour,
je cherche depuis peu à inclure des événements dans mon univers 3D (pour l'instant très pauvre pour les tests :p -> un carré blanc en z = -5).
J'ai alors ajouter à mon programme des événements avec les touches directionneles du clavier HAUT-BAS-GAUCHE-DROITE et F1 et F2 aussi pour des tests) définis tels que :
Avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 GLvoid callback_special(int key, int x, int y){ float speed = 0.5f; // Vitesse de déplacement de la caméra switch (key) { case GLUT_KEY_UP: // Flèche vers le haut : zCam -= speed; // on déplace la caméra selon z- glutPostRedisplay(); // et on demande le réaffichage. break; case GLUT_KEY_DOWN: // Flèche vers le bas : zCam += speed; // on déplace la caméra selon z+ glutPostRedisplay(); // et on demande le réaffichage. break; case GLUT_KEY_LEFT: // Flèche vers la gauche : centreX -= speed; // on déplace la caméra selon centreX- glutPostRedisplay(); // et on demande le réaffichage. break; case GLUT_KEY_RIGHT: // Flèche vers la droite : centreX += speed; // on déplace la caméra selon centreX+ glutPostRedisplay(); // et on demande le réaffichage. break; case GLUT_KEY_F1: xCam -= speed; glutPostRedisplay(); // et on demande le réaffichage. break; case GLUT_KEY_F2: xCam += speed; glutPostRedisplay(); // et on demande le réaffichage. break; } }Et dans ma fonction "display()" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 double zCam = 1.0; double centreX = 0.0; double xCam = 0.0;
Malheureusement, le résultat n'est pas du tout celui attendu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 void display ( void ) // Create The Display Function { if (!initialized) { init(); initialized = true; } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear de la Couleur et de la profondeur. glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // On initialise la matrice de vue avec la matrice identité. gluLookAt(xCam,0.0,zCam, xCam+ centreX,0.0,0.0, 0.0,1.0,0.0); glBegin(GL_QUADS); // In front of : glTexCoord2i(0,0); glVertex3f(-1,-1,-5); glTexCoord2i(1,0); glVertex3f(1,-1,-5); glTexCoord2i(1,1); glVertex3f(1,1,-5); glTexCoord2i(0,1); glVertex3f(-1,1,-5); glEnd(); glutPostRedisplay(); glutSwapBuffers ( ); // buffer de travail. }
Avec cette méthode, la caméra n'est pas entièrement libre dans l'univers 3D et reste attaché aux 3 axes absolus X,Y,Z (z étant la profondeur, x la largeur, et y la hauteur).
Ainsi, si je pivote un peu la caméra en visant un vecteur avec un X plus grand (rotation vers la droite), et que j'essai de me déplacer latéralement vers la gauche (en prenant en compte la petite rotation vers la droite), au lieu de se déplacerlatéralement, la caméra "recule" (car le déplacement latérale est sur l'axe des X décroissant et ne prend pas en compte la rotation et donc le CHANGEMENT DE REPERES).
J'éspère que vous comprenez mon problème. Si jamais vous avez une alternative cela m'aiderait beaucoup !
Merci !
Partager