2010-08-22 3 views
3

Je pensais que je compris les mathématiques de matrice assez bien, mais apparemment je suis désemparésXNA: obtenir Vector3 de Matrix

Voici le setup:

J'ai un objet à [0,0,0] dans le monde espace. J'ai une classe d'appareil-photo commandée par des mouvements de souris pour tourner et faire un zoom autour de l'objet tel qu'il le regarde toujours. Voici comment je calcule mon viewMatrix de la caméra:

public Matrix viewMatrix { 
    get { 
     return 
      Matrix.CreateFromAxisAngle(Vector3.Up, rotAngle) 
       * Matrix.CreateFromAxisAngle(Vector3.Left, pitchAngle) 
       * Matrix.CreateTranslation(0, 0, distance) 
     ; 
    } 
} 

Je dois être en mesure d'obtenir la position de la caméra dans l'espace du monde pour que je puisse obtenir sa distance de la boîte - en particulier la distance de chaque face de la boîte. Comment puis-je obtenir la position xyz de l'appareil photo dans les coordonnées spatiales mondiales?

J'ai essayé:

// all of these only return [0, 0, distance]; 
Vector3 pos = Vector3.Transform(Vector3.Zero, viewMatrix); 
Vector3 pos = viewMatrix.Translation; 
Vector3 pos = new Vector3(viewMatrix.M41, viewMatrix.M42, viewMatrix.M43); 

Il semble que les informations de rotation se perd en quelque sorte. La chose étrange est que le code viewMatrix fonctionne parfaitement pour le positionnement de la caméra!

Répondre

7

ou légèrement pour simplifier:

Vector3 pos = Matrix.Invert (voir) .Translation;

2

Encore une fois, je me dis que le problème en quelques secondes de l'affichage de la question:

je avais besoin d'inverser la matrice de vue. L'information de rotation était étant perdue car elle ne joue aucun rôle dans le calcul de distance jusqu'à ce que la matrice de vue soit inversée. La rotation était à la mauvaise "fin" de la transformation.

Vector3 pos = Vector3.Transform(Vector3.Zero, Matrix.Invert(viewMatrix));