Caméra, rotation et quaternions
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
Code:
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 |
Si au lieu de faire D3DXVec3TransformCoord (..) sur le LookAtPt, j'effectue un
Code:
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'obtiens encore du gimbal lock
j'ai essayé aussi en fabriquant un quaternion à partir de la vue , et en faisant le produit avec le quaternion de rotation
Code:
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 |
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.
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 :?