Salut à tous
J'essaie d'utiliser les quaternions pour gérer la caméra dans mon programme OpenGL. Pour ce faire, j'ai une classe Camera qui contient les valeur x,y,z, angleXY (pour regarder à gauche/droite), angleZ (haut/bas) et angleRotate (pour le 'roll').
Voici le bout de code que j'utilise au départ pour insérer la matrice de vue :
Je fais varier anglerXY et angleZ avec la souris. En mode normal (gluLookAt), tout se passe bien. Par contre avec le quaternion, suivant l'angle que j'utilise c'est le roll qui change...
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 //variable pour les variante Quaternion* old = new Quaternion(); double oldAngleZ = 90; double oldAngleXY = -90; double oldAngleRotate = 0; void Camera::place() const { //calcul des différences entre les angles de la frame pré double zc = angleZ - oldAngleZ; double xyc = angleXY - oldAngleXY; double rc = angleRotate - oldAngleRotate; //Quaternion t1(zc, xyc, rc); Quaternion t1(zc, rc, xyc); //création du quaternion avec yaw / pitch / roll Quaternion t2(t1 * *(old)); Quaternion* q = new Quaternion(t2.normalize()); //enregistrement du quaternion pour la prochaine frame (ainsi que les angles) delete old; old = q; oldAngleRotate = angleRotate; oldAngleXY = angleXY; oldAngleZ = angleZ; if (useQuaternion) //utilisation du quaternion pour la matrice de projection { double* qv = q->to4x4RotationMatrix(); glMultMatrixd(qv); delete qv; glTranslated(-x, -y, -z); } else { //gestion standarde avec glulookat } }
J'imagine que ce doit être un bête truc de calcul qui me manque quelque part, mais impossible de trouver quoi
Merci d'avance !
@++
Partager