Bonjour tout le monde,
Je me bas depuis hier pour essayer de faire fonctionner correctement le déplacement de ma caméra sous OpenGL; J'ai volontairement choisi de ne pas suivre à la lettre les tutos trouvés sur le web, car je voulais que la solution vienne de moi.
Je pense m'en être sorti en ce qui concerne le déplacement droit devant la caméra (même si celà reste à prouver), mais je galère vraiment pour la partie orientation avec la souris.En effet, je me retrouve avec des valeurs assez incohérentes, bien qu'ayant repris les calculs du tuto. Voici le code que j'ai réalisé:
camera.h
camera.cpp
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
39
40
41
42 #ifndef CAMERA_H #define CAMERA_H #include <SDL/SDL.h> #include <gl/gl.h> #include <gl/glu.h> #include "math.h" class camera { private: int posX; //position X int posY; //position Y int posZ; //position Z double viseX; //Position où regarde la caméra X double viseY; //Position où regarde la caméra Y double viseZ; //Position où regarde la caméra Z float axeX; //Angle de la caméra X float axeY; //Angle de la caméra Y float axez; //Angle de la caméra Z SDL_Event *event; int preX; int preY; float teta; float phi; public: camera(int unePosX, int unePosY, int unePosZ, int uneViseX, int uneViseY, int uneViseZ, float unAxeX, float unAxeY, float unAxeZ, SDL_Event *unEvent); //***************************************************** //*********** vitesse doit être différent de 1 ******** //D'ailleurs je sais pas pourquoi, je sais juste que ça ne marche pas //***************************************************** void deplacementLongitudinal(int vitesse); void deplacementLateral(int vitesse); void tournerCam(SDL_Event *event); virtual ~camera(); }; #endif // CAMERA_H
le résultat de mes logs:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 #include "camera.h" camera::camera(int unePosX, int unePosY, int unePosZ, int uneViseX, int uneViseY, int uneViseZ, float unAxeX, float unAxeY, float unAxeZ, SDL_Event *unEvent) { //ctor posX = unePosX; posY = unePosY; posZ = unePosZ; viseX = uneViseX; viseY = uneViseY; viseZ = uneViseZ; axeX = unAxeX; axeY = unAxeY; axez = unAxeZ; event = unEvent; preX = event->motion.x; preY = event->motion.y; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(posX,posY,posZ,viseX,viseY,viseZ,0,0,1); } void camera::deplacementLongitudinal(int vitesse) { float angleX = 0; float angleY = 0; float angleZ = 0; angleX = atan((posZ-viseZ)/(posY-viseY)); angleY = atan((posZ-viseZ)/(posX-viseX)); angleZ = atan((posX-viseX)/(posY-viseY)); posX=(int)(posX+vitesse*(sin(angleX))); posY=(int)(posY+vitesse*(sin(angleY))); posZ=(int)(posZ+vitesse*(sin(angleZ))); viseX=(int)(viseX+vitesse/2*(sin(angleX))); viseY=(int)(viseY+vitesse/2*(sin(angleY))); viseZ=(int)(viseZ+vitesse/2*(sin(angleZ))); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(posX,posY,posZ,viseX,viseY,viseZ,0,0,1); } void camera::deplacementLateral(int vitesse) { //Pas vraiment d'idées mais pas encore vraiment cherché... } void camera::tournerCam(SDL_Event *Event) { teta -= Event->motion.xrel; phi -= Event->motion.yrel; if(phi >= 90) phi = 90; else if(phi<=-90) phi = -90; fprintf(stderr, "phi = %f\n", phi); fprintf(stderr, "teta = %f\n", teta); fprintf(stderr, "phi*3.14/180 = %f\n", phi*3.14/180); fprintf(stderr, "teta*3.14/180 = %f\n", teta*3.14/180); fprintf(stderr, "cos(phi*3.14/180) = %f\n", cos(phi*3.14/180)); fprintf(stderr, "cos(teta*3.14/180) = %f\n", cos(teta*3.14/180)); fprintf(stderr, "viseX = %d\n\n", viseX); viseX = ((cos(phi*3.14/180))*(cos(teta*3.14/180))); viseY = ((cos(phi*3.14/180))*(sin(teta*3.14/180))); viseZ = (sin(phi*3.14/180)); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(posX,posY,posZ,viseX,viseY,viseZ,0,0,1); } camera::~camera() { //dtor }
Le résultat est que l'orientation ne bouge quasiment pas (à peine visible) et si je met des coefficients multiplacateur à mes viseX, viseY et viseZ, je ne peux pas tourner à 360°...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ... phi = 60.000000 teta = -206.000000 phi*3.14/180 = 1.046667 teta*3.14/180 = -3.593556 cos(phi*3.14/180) = 0.500460 cos(teta*3.14/180) = -0.899592 viseX = -1696566979 ...
Si vous voulez d'avantages d'info. n'hésitez pas à demander, je ne sais pas exactement ce qui pourrait vous être utile...
En vous remerciant!![]()
Partager