Bonjour à tous !
Mon prblème est sans doute relativement simple, mais comme d'habitue quand on a le nez dedans et qu'on rame depuis trop longtemps ... on ne vois rien !
J'implémente une caméra pour mon prog openGL ( en 3D et en c++).
Un mode 3eme personne, fonctionne parfaitement.
Venons en au mode 1ere personne ( communément appeler FPS).
Les fonctions qui déplacent ma caméra en Y et selon sa droite et s gauche, son avant et son arrière, marchent très bien.
Les fonctions qui permettent de "tourner la tete" a droite et a gauche, en haut et en bas, marchent très bien aussi.
Seul problème : l'initialisation de mes variables de calculs lorsque la position n'est pas 0,0,0 .
En fait une seule variable me fait défaut.
Je possède au départ :
- la position de ma caméra en x,y,z
- la direction en Y est de 0
- le vecteur UP apres sera (0,1,0)
- la focalisation initiale en x,y,z ( utile pour les calcul en z,x apres)
Il me faut calculer :
- un vecteur direction ( ou regarde la camera )
- un vecteur UP, désignant le haut
- un angle en Y, représentant le fait que l'on puisse sans bouger la caméra regarder en haut et en bas.
- un angle X, ( enfin plutot : ZX ) qui sert a modéliser le fait que l'on puisse tourner la caméra a droite ou a gauche par rapport a sa direction actuelle .
- un veteur Right , qui est juste le produit vectoriel de UP et de DIRECTION ... c'est donc la droite de notre caméra .
La suele chose que je n'arrive pas à calculer c'est l'angle en X. Si je ne me trompe aps il va etre fonction de direction en Z et/ou en X, mais je ne vois pas le calcul exacte. ( en faisant des schea j'était arrivé à :
On ma suggérerde rajouter cela apres :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 m_AngleX = acos(m_Direction.z);
Mais ca ne marche pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if(m_Direction.x<0) m_AngleX += M_PI;
Voila tout le code de ma fonction d'initialisation si cela eput vous aider. J'espère avoir été assez clair !
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 // Float's as param for position Camera::Camera(float x, float y, float z ) : m_DefaultFocus(0.0, 0.0, 0.0 ), m_Orientation(0.0,1.0, 0.0), m_Focalisation(&m_DefaultFocus) , m_Position( x, y, z ), m_Alpha(0), m_Phi(0), m_Norm(0), m_FpsMode(true),m_MouseXOld(-1), m_MouseYOld(-1), m_AngleX(0), m_AngleY(0) { // 3D PERSON MODE m_Norm = m_Position.Length(); m_Alpha = atan(std::abs(m_Position.z)/std::abs(m_Position.x)); m_Phi = acos(std::abs(m_Position.y)/m_Norm); if( m_Position.y <0) m_Phi += (float)M_PI; if ( m_Position.z <0) m_Alpha += (float)M_PI ; if ( m_Position.x <0) m_Alpha += (float)M_PI ; while (m_Phi > M_PI) m_Phi -= (float)(2*M_PI); if ( m_Phi < 0 ) m_Orientation = Vector3D<float>(0.0,-1,0.0) ; // FPS MODE m_Up = m_Orientation ; m_Direction = *m_Focalisation - m_Position ; m_Direction.y = 0 ; m_Direction.Normalize(); m_Right = VectorCross(m_Up,m_Direction); m_Right.Normalize(); m_AngleX = acos(m_Direction.z); if(m_Direction.x<0) m_AngleX += M_PI; }
Partager