2009-08-20 6 views
6

Je rencontre de graves difficultés à comprendre la matrice de vue dans XNA. Je suis venu assez loin avec toutes les autres parties et depuis que je viens d'apprendre moi-même les maths requises, je ne veux pas utiliser les fonctions Matrix intégrées sans comprendre ce qu'elles font en premier.XNA View Matrix - Recherche d'explication

Maintenant, je comprends les bases de la rotation, de la projection et de la traduction, mais je ne peux pas, pour la vie de moi, comprendre comment la matrice de vue fonctionne dans XNA. D'après ce que j'ai compris, la matrice de vue devrait transformer le «monde» en son propre espace. Cela semble raisonnable, mais la méthode Matrix.CreateLookAt dans la bibliothèque est assez déroutante.

J'ai établi (en examinant ce que les sorties de la fonction de la bibliothèque) que ces deux morceaux de rendement de code les mêmes résultats:

Matrix view = Matrix.CreateReflection(new Plane(Vector3.UnitX, 0)) * Matrix.CreateReflection(new Plane(Vector3.UnitZ, 0)) * Matrix.CreateTranslation(Position); 
// ..equals this if (Position = (0 0 -5), since LookAt "looks at" but the above just looks straight down Z).. 
Matrix blah = Matrix.CreateLookAt(Position, Vector3.Zero, Vector3.UnitY); 

Pourquoi inverser les axes X et Z? Je pensais que vous devriez faire tourner le monde en fonction de la rotation des caméras, mais dans la direction opposée, puis traduire le monde par le même montant dans la direction opposée.

Ou la matrice de vue n'est-elle pas du tout utilisée comme une transformation mais seulement pour encoder la position et la rotation de la caméra dans le monde?

Répondre

5

La matrice de vue transforme la scène en espace de vue. Dans l'espace de vue, la caméra virtuelle est à l'origine et regarde dans la direction z positive. Il existe différentes façons d'y parvenir, mais le plus souvent la matrice de vue consiste en une translation et trois rotations autour de chaque axe.

transform = * Traduisez RotationZ * RotationY * RotationX

+0

Merci, il semble que mon idée originale était correcte. Mais j'avais tous ces différents systèmes de coordonnées un peu confus. – Skurmedel

1

composer deux réflexions donne une rotation, si je me souviens bien de ma géométrie.

+0

Intéressant. Les réflexions mentionnées ci-dessus devraient alors correspondre à une rotation de 180 degrés autour de Y. – Skurmedel

21

Il existe trois types de transformations que vous devez comprendre: monde, vue et projection.

La transformation du monde transforme les coordonnées de vos modèles de l'espace objet en espace monde. Lorsque vous définissez les sommets d'un modèle, vous les définissez par rapport à l'origine de ce modèle. La transformation du monde transforme ces sommets de sorte qu'ils soient relatifs à une origine partagée par tous les objets de la scène, c'est-à-dire l'espace du monde.

La transformation de vue transforme ensuite ces sommets en espace de vue. La visionneuse/caméra a une position et une orientation dans l'espace de vue, et ceci est utilisé pour créer la matrice de vue que vous appliquez à tous les objets de la scène. Dans l'espace de vue, la visionneuse/caméra est à l'origine, ainsi la matrice de vue traduit et fait pivoter tous les objets pour les placer dans l'espace de vue.

Enfin, la transformation de projection détermine le type d'objectif utilisé par la caméra. Jusqu'à présent, nous n'avons fait que traduire et faire pivoter des objets, il n'y a aucun sens de l'échelle ou de la perspective. La transformation de projection crée un tronc de visionnage et transforme les sommets dans cette fenêtre.

Maintenant pour votre question. Vous réfléchissez sur le système de coordonnées autour de l'axe des x, puis sur l'axe des z et enfin vous le traduisez. Cela arrive à donner le même résultat que la matrice de recherche parce que la position est sur les plans xz et yz, mais remarquez ce qui se passe si vous déplacez la position d'une unité sur l'axe des ordonnées. Alors les deux matrices ne seront pas égales

+1

Merci pour votre réponse. J'ai choisi la réponse avec le rang le plus bas. Vous avez tous les deux aidé. – Skurmedel

+2

Pas de soucis. Content que tu l'aies compris :) – Tchami

4

Le lien suivant m'a beaucoup aidé à comprendre et à utiliser plus efficacement les matrices.Vous pouvez les trouver intéressants:

http://stevehazen.wordpress.com/2010/02/15/matrix-basics-how-to-step-away-from-storing-an-orientation-as-3-angles/

que je fais à peu près la même chose que vous en ce moment :)

+0

Merci, cela semble assez complet. – Skurmedel

+0

Si vous faites quelque chose d'autre 3D basé sur XNA et que vous voulez être pompé avec des liens d'information, il suffit de demander. J'ai fait beaucoup de recherches avant de commencer et j'ai compilé une assez bonne liste d'informations pour les choses les plus avancées. – Remm

+0

Hiya, Remm, je fais des trucs XNA 3D, et j'aimerais être pompé avec des liens d'information! Vous avez des suggestions pour moi? –