bonjour
j'essaye de faire tourner le LookAtPt de ma caméra autour de son axe vertical, lorque j'appuie sur une touche.
Mais, dés que la rotation atteint PI/2, les axes X et X se confondent et j'obtiens du " gimbal Lock ".
J 'essaye donc d'utiliser des quaternions, mais j'obtiens quand même du gimbal lock.
Je ne dois donc pas m'y prendre correctement. voici mon code
Si au lieu de faire D3DXVec3TransformCoord (..) sur le LookAtPt, j'effectue un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 D3DXVec3Cross(&vUpView, &vCam , &g_vRight ); // calcule Up vecteur de la vue D3DXQuaternionIdentity( &m_qOrientation); D3DXQuaternionRotationAxis ( &m_qOrientation , &vUpView, thetaY ); // fabrique quaternion de rotation D3DXQuaternionNormalize( &m_qOrientation, &m_qOrientation ); D3DXMatrixRotationQuaternion ( &matOrientation , &m_qOrientation ) ; // fabrique matrice de rotation D3DXVec3TransformCoord ( &g_vLookatPt , &g_vLookatPt ,&matOrientation); // applique rotation au LookAtPt g_FPCamera->SetViewParams( &g_vEyePt , &g_vLookatPt ); // stocke les nouvelles valeurs g_matView = *g_FPCamera->GetViewMatrix(); // maj de la matrice de vue
j'obtiens encore du gimbal lock
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 g_matView *=matOrientation ; // applique la nouvelle orientation g_vLookatPt.x=g_matView._31; // extrait nouvelles valeurs g_vLookatPt g_vLookatPt.y=g_matView._32; g_vLookatPt.z=g_matView._33; g_vEyePt.x=g_matView._41; // extrait nouvelles valeurs g_vEyePt g_vEyePt.y=g_matView._42; g_vEyePt.z=g_matView._43;
j'ai essayé aussi en fabriquant un quaternion à partir de la vue , et en faisant le produit avec le quaternion de rotation
De plus lorsque j'effectue une rotation sur ma matrice de vue, je m'attends à ce que la base de vecteurs de la caméra soit modifiée à chaque demande de rotation, mais dans mon code je dois accroître les valeurs de mon angle de rotation ( thetaY ), pour faire tourner ma 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 D3DXVec3Cross(&vUpView, &vCam , &g_vRight ); // calcule Up vecteur de la vue ,identique à l'extraction de matrice de vue ( sauf signe Z ) D3DXQuaternionIdentity( &m_qOrientation); D3DXQuaternionRotationAxis ( &m_qOrientation , &vUpView, thetaY ) ; // fabrique quaternion de rotation D3DXQuaternionNormalize( &m_qOrientation, &m_qOrientation ); D3DXMatrixRotationQuaternion ( &matOrientation , &m_qOrientation ) ; // fabrique matrice de rotation D3DXQuaternionRotationMatrix( &m_qView , &g_matView ); D3DXQuaternionNormalize( &m_qView, &m_qView ); m_qView *= m_qOrientation; D3DXMatrixRotationQuaternion ( &g_matView , &m_qView ) ; // fabrique matrice de rotation g_matView *= matOrientation; g_vLookatPt.x=g_matView._31; // extrait nouvelles valeurs g_vLookatPt g_vLookatPt.y=g_matView._32; g_vLookatPt.z=g_matView._33; g_vEyePt.x=g_matView._41; // extrait nouvelles valeurs g_vEyePt g_vEyePt.y=g_matView._42; g_vEyePt.z=g_matView._43; g_FPCamera->SetViewParams( &g_vEyePt , &g_vLookatPt ); // stocke les nouvelles valeurs g_matView = *g_FPCamera->GetViewMatrix(); // maj de la matrice de vue
J'ai donc vraiment un problème, et je ne m'y prends certainement pas comme il faut.
un peu d'aide sera bienvenue
merci
Partager