Bonjour à tous,

Je suis malheureusement déjà de retour pour un nouveau problème...

J'ai besoin d'une caméra me permettant de me déplacer dans une scène. Je souhaite pouvoir soit la faire tourner (latéralement et de haut en bas) soit la faire avancer. Je souhaite ne pas me servir du pipeline fixe, je gère donc ma matrice modelview moi-même.

Pour faire cela j'ai une classe caméra qui dispose de deux points (eye et center qui sont modifiés suivant les déplacements de la souris) et d'un vecteur directeur (0, 1, 0). Pour le déplacement, tout se passe bien mais la rotation produit un effet gênant dans certains cas.

Si je n'ai effectué aucune rotation latérale, je peux "regarder" en haut et en bas (donc faire une rotation sur l'axe x) sans problème, mais dès que je me tourne sur le côté de 90° (donc rotation sur l'axe y) , je suis "coincé" et ne peux plus regarder vers le haut ou le bas. Je ne comprends pas pourquoi.

voici le code de ma fonction qui fait tourner la caméra :
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
void Camera::rotate(float dx, float dy)
{
    //annule les translations précédentes
    glm::mat4 annuleTranslate = glm::translate(glm::mat4(), -m_eye);
    glm::vec4 eye = annuleTranslate * glm::vec4(m_eye, 1.0);
    glm::vec4 center = annuleTranslate * glm::vec4(m_center, 1.0);
 
    //on applique les rotations
    glm::mat4 rotateX = glm::rotate(glm::mat4(1.0), dy, glm::vec3(1.0, 0.0, 0.0));
    glm::mat4 rotateY = glm::rotate(glm::mat4(1.0), dx, glm::vec3(0.0, 1.0, 0.0));
    glm::mat4 rotates = rotateX * rotateY;
 
    eye = rotates * eye;
    center = rotates * center;
 
    //on remet les translations
    glm::mat4 remetTranslate = glm::translate(glm::mat4(), m_eye);
 
    eye = remetTranslate * eye;
    center = remetTranslate * center;
 
    m_eye = eye.xyz;
    m_center = center.xyz;
 
    m_modelviewMatrix = glm::lookAt(m_eye, m_center, m_up);
}