2010-03-07 6 views
4

Hé les gars, celui-ci a mangé toute ma nuit, et finalement je lève les mains pour de l'aide. En fait, il est assez facile de calculer le tangage et le lacet de la vue Matrice juste après que vous faites une mise à jour de la caméra:Direct3D - Comment puis-je calculer Roll à partir de View Matrix?

D3DXMatrixLookAtLH(&m_View, &sCam.pos, &vLookAt, &sCam.up); 
pDev->SetTransform(D3DTS_VIEW, &m_View); 

// Set the camera axes from the view matrix 
sCam.right.x = m_View._11; 
sCam.right.y = m_View._21; 
sCam.right.z = m_View._31; 
sCam.up.x = m_View._12; 
sCam.up.y = m_View._22; 
sCam.up.z = m_View._32; 
sCam.look.x = m_View._13; 
sCam.look.y = m_View._23; 
sCam.look.z = m_View._33; 

// Calculate yaw and pitch and roll 
float lookLengthOnXZ = sqrtf(sCam.look.z^2 + sCam.look.x^2); 
fPitch = atan2f(sCam.look.y, lookLengthOnXZ); 
fYaw = atan2f(sCam.look.x, sCam.look.z); 

Donc mon problème est le suivant: il doit y avoir un moyen d'obtenir le rouleau en radians similaire à la façon dont la Le tangage et le lacet sont obtenus à la fin du code. J'ai essayé plusieurs dizaines d'algorithmes qui semblaient avoir du sens pour moi, mais aucun d'entre eux n'a donné le résultat escompté. Je réalise que de nombreux développeurs ne suivent pas ces valeurs, cependant j'écris des routines de recentrage et de réglage de l'écrêtage basé sur les valeurs, et le suivi manuel se décompose lorsque vous appliquez des rotations mixtes à la matrice de vue. Donc, est-ce que quelqu'un a la formule pour obtenir le Roll in radians (ou degrés, je m'en fous) de la matrice de vue? Merci!

Répondre

0

Il semble que l'article de Wikipedia sur Euler angles contient la formule que vous recherchez à la fin.

+0

Heh en rétrospective mon explication était complète merde car j'ai complètement oublié que vous auriez besoin d'incliner le vecteur haut par défaut en fonction du vecteur direct. – Goz

3

Woohoo, c'est compris! Merci empileur pour le lien vers l'entrée Euler Angles sur Wikipedia, la formule gamma à la fin était en effet la bonne solution! Ainsi, pour calculer Rouleau en radians d'un « plan vertical » J'utilise la ligne suivante de code C++:

fRoll = atan2f(sCam.up.y, sCam.right.y) - D3DX_PI/2; 

Comme Euler a fait remarquer, vous cherchez la tangente d'arc de Y (jusqu'à) la valeur Z de la matrice par rapport à la valeur Z de la matrice X (droite) - bien que dans ce cas j'ai essayé les valeurs Z et ils n'ont pas donné le résultat désiré, j'ai donc essayé les valeurs Y sur un coup de tête/2 radians (angle droit à la valeur désirée), ce qui est facilement compensé. Enfin, j'ai une plate-forme de caméra 3D à la précision et à la stabilité du point de vue mécanique, avec une balance auto-correctrice. =)