2010-09-11 27 views
4

J'ai une caméra 2D avec cette matrice de traduction:XNA - souris Obtenir les coordonnées d'un système de caméra 2D avec rotation/zoom/translation

 Transform = Matrix.CreateTranslation(new Vector3(-Position.X, -Position.Y, 0)) * 
        Matrix.CreateRotationZ(Rotation) * 
        Matrix.CreateScale(new Vector3(Scale, Scale, 0)) * 
        Matrix.CreateTranslation(new Vector3((GraphicsDevice.Viewport.Width * 0.5f), (GraphicsDevice.Viewport.Height * 0.5f), 0)); 

Ce qui fonctionne pour Rotation/Zoom où l'origine est le centre de la caméra.

Maintenant, j'essaie d'obtenir les coordonnées de la souris dans le monde.

J'ai essayé d'utiliser une transformation inverse, mais cela a juste entraîné des erreurs NaN. Je suppose que je dois mettre en place une autre matrice de traduction pour les coordonnées de la souris, un revers de l'actuel, mais je ne peux pas comprendre comment cela est mis en place

Je cela,

MousePosition = nouveau Vector2 ((Mouse.GetState(). X - DrawTransform.Translation.X) * (1/Gamecode.Camera1.Scale), (Mouse.GetState(). Y - DrawTransform.Translation.Y) * (1/Gamecode. Camera1.Scale));

Mais cela ne prend pas en rotation du compte

+0

Avez-vous travaillé sur comment obtenir la partie rotation? – Nidonocu

Répondre

5

En général, il est plus facile et plus robuste pour trouver l'inverse de votre matrice, que pour calculer le client à la position mondiale à la main.

Le problème avec votre matrice - la raison pour laquelle vous ne pouvez pas obtenir l'inverse, c'est que vous réduisez l'axe Z à zéro. Cela signifie que vous avez aplati tout votre espace sur un seul axe. Ainsi, lorsque vous essayez de prendre un seul point dans cet espace (espace client) et que vous le retournez dans l'espace d'origine (espace du monde), ce que vous obtenez est en réalité une ligne s'étendant le long de l'axe Z. C'est pourquoi vous récupérez NaNs. (Ou vous pourriez simplement dire - vous avez introduit une division par zéro.)

La fonction inverse matricielle ne sait pas que vous utilisez simplement un plan 2D plat. Les matrices de XNA sont 3D.

La solution est de changer votre matrice à ceci:

Matrix.CreateScale(Scale) 

Ensuite, essayez de trouver l'inverse.

+0

Réponse fantastique. Cela m'a aidé parfaitement. – Scott