2011-01-09 4 views
1

J'ai une matrice de rotation. Comment puis-je obtenir la rotation autour d'un axe spécifié contenu dans cette matrice?Décomposition d'une matrice de rotation

Edit:

Il est une matrice 3D (4x4), et je veux savoir à quelle distance prédéterminée autour d'un (non contenu) axe la matrice tourne. Je peux déjà décomposer la matrice mais D3DX donnera seulement la matrice entière comme une rotation autour d'un axe, alors que j'ai besoin de diviser la matrice en angle de rotation autour d'un axe déjà connu, et le reste.

Exemple de code et brève description du problème:

D3DXMATRIX CameraRotationMatrix; 
D3DXVECTOR3 CameraPosition; 
//D3DXVECTOR3 CameraRotation; 

inline D3DXMATRIX GetRotationMatrix() { 
    return CameraRotationMatrix; 
} 
inline void TranslateCamera(float x, float y, float z) { 
    D3DXVECTOR3 rvec, vec(x, y, z); 
#pragma warning(disable : 4238) 
    D3DXVec3TransformNormal(&rvec, &vec, &GetRotationMatrix()); 
#pragma warning(default : 4238) 
    CameraPosition += rvec; 
    RecomputeVPMatrix(); 
} 
inline void RotateCamera(float x, float y, float z) { 
    D3DXVECTOR3 RotationRequested(x, y, z); 
    D3DXVECTOR3 XAxis, YAxis, ZAxis; 
    D3DXMATRIX rotationx, rotationy, rotationz; 
    XAxis = D3DXVECTOR3(1, 0, 0); 
    YAxis = D3DXVECTOR3(0, 1, 0); 
    ZAxis = D3DXVECTOR3(0, 0, 1); 

#pragma warning(disable : 4238) 
    D3DXVec3TransformNormal(&XAxis, &XAxis, &GetRotationMatrix()); 
    D3DXVec3TransformNormal(&YAxis, &YAxis, &GetRotationMatrix()); 
    D3DXVec3TransformNormal(&ZAxis, &ZAxis, &GetRotationMatrix()); 
#pragma warning(default : 4238) 
    D3DXMatrixIdentity(&rotationx); 
    D3DXMatrixIdentity(&rotationy); 
    D3DXMatrixIdentity(&rotationz); 
    D3DXMatrixRotationAxis(&rotationx, &XAxis, RotationRequested.x); 
    D3DXMatrixRotationAxis(&rotationy, &YAxis, RotationRequested.y); 
    D3DXMatrixRotationAxis(&rotationz, &ZAxis, RotationRequested.z); 
    CameraRotationMatrix *= rotationz; 
    CameraRotationMatrix *= rotationy; 
    CameraRotationMatrix *= rotationx; 
    RecomputeVPMatrix(); 
} 
inline void RecomputeVPMatrix() { 
    D3DXMATRIX ProjectionMatrix; 
    D3DXMatrixPerspectiveFovLH(
     &ProjectionMatrix, 
     FoV, 
     (float)D3DDeviceParameters.BackBufferWidth/(float)D3DDeviceParameters.BackBufferHeight, 
     FarPlane, 
     NearPlane 
    ); 

    D3DXVECTOR3 CamLookAt; 
    D3DXVECTOR3 CamUpVec; 

#pragma warning(disable : 4238) 
    D3DXVec3TransformNormal(&CamLookAt, &D3DXVECTOR3(1, 0, 0), &GetRotationMatrix()); 
    D3DXVec3TransformNormal(&CamUpVec, &D3DXVECTOR3(0, 1, 0), &GetRotationMatrix()); 
#pragma warning(default : 4238) 

    D3DXMATRIX ViewMatrix; 
#pragma warning(disable : 4238) 
    D3DXMatrixLookAtLH(&ViewMatrix, &CameraPosition, &(CamLookAt + CameraPosition), &CamUpVec); 
#pragma warning(default : 4238) 
    ViewProjectionMatrix = ViewMatrix * ProjectionMatrix; 
    D3DVIEWPORT9 vp = { 
     0, 
     0, 
     D3DDeviceParameters.BackBufferWidth, 
     D3DDeviceParameters.BackBufferHeight, 
     0, 
     1 
    }; 
    D3DDev->SetViewport(&vp); 
} 

En effet, après un certain temps, quand RotateCamera est appelée, elle commence à tourner dans la axis- par rapport X, même si nulle constante est transmise pour cette demande en répondant à l'entrée de la souris, je sais que lorsque vous déplacez la souris, la caméra ne devrait pas rouler du tout. J'ai essayé de spammer 0,0,0 demandes et je n'ai vu aucun changement (un par image à 1500 images par seconde), donc je suis assez sûr que je ne vois pas d'erreur de FP ou d'erreur d'accumulation de matrice. J'ai essayé d'écrire une fonction RotateCameraYZ et d'effacer tous les axes X de la fonction. J'ai passé plusieurs jours à essayer de découvrir pourquoi c'est le cas, et j'ai finalement décidé de le pirater. Donc je veux obtenir la rotation autour de l'axe relatif-x, transformer la matrice CameraRotation, puis la vérifier pour vérifier qu'elle est la même, et si ce n'est pas le cas, ajouter une matrice correctrice. Juste pour référence, j'ai vu quelques diagrammes sur Wikipedia, et j'ai en fait une disposition d'axe relativement étrange, qui est l'axe Y vers le haut, mais l'axe X vers l'avant et l'axe Z vers la droite, donc l'axe Y , Rouleau de l'axe X.

+0

Dans combien de dimensions? – SLaks

+1

Cela n'a pas beaucoup de sens pour moi. 2D ou 3D? Et comment une matrice contient-elle un axe? –

+0

C'est une matrice 3D (4x4), et la matrice ne contient pas l'axe, j'ai l'axe. Je veux savoir jusqu'où tourne cet axe autour de cet axe. – Puppy

Répondre

Questions connexes