2009-08-01 13 views
2

Je suis en train de faire un jeu XNA et j'ai rencontré un petit problème en calculant un peu de maths vectorielles.Comment trouver des coordonnées 2D transformées en rotation dans XNA?

J'ai une classe représentant un objet 2D avec des coordonnées entières X et Y et un flottant de rotation. Ce dont j'ai besoin, c'est d'avoir une propriété Vector2 pour la position qui obtient et définit X et Y comme un vecteur2 qui a été transformé en utilisant le flotteur de rotation. De cette façon, je peux juste faire quelque chose comme;

Position += new Vector2((thumbstick.X * scrollSpeed), -(thumbstick.Y * scrollSpeed)); 

et l'objet se déplace dans sa propre direction ascendante plutôt que vers le haut de la vue.

Jusqu'à présent, c'est ce que j'ai ... Je pense que l'ensemble est bon, mais pour + = changements, il faut un get et la réponse ne vient tout simplement pas à moi maintenant ...>.>

public Vector2 Position 
{ 
    get 
    { 
     // What goes here? :S 
    } 
    set 
    { 
     X = value.X * (int)Math.Cos(this.Rotation); 
     Y = value.Y * (int)Math.Cos(this.Rotation); 
    } 
} 

Répondre

7

Non, les deux sont incorrects.

Un vecteur 2D transforme comme ceci:

x' = x*cos(angle) - y*sin(angle) 
y' = x*sin(angle) + y*cos(angle) 

où l'angle est mesuré en radians, angle nul est le long de l'axe x positif, et augmente dans le sens anti-horaire en tournant autour de l'axe z hors d'avion. Le centre de rotation est à la fin du vecteur en cours de transformation, donc imaginez le vecteur d'origine à (0,0), terminez à (x, y) par un angle jusqu'à ce qu'il devienne un vecteur d'origine à (0,0) et se terminent par (x ', y').

+1

Peu importe dans quel angle des unités est mesurée en temps il est la même unité dans les deux équations :-) – greenoldman

+2

Chaque mise en œuvre des fonctions trigonométriques que je connais des usages radians, donc dans ce sens cela a certainement de l'importance. Pensez radians si vous utilisez un ordinateur pour résoudre ce problème. – duffymo

1

Je pense que c'est une mauvaise idée. Conservez toutes les coordonnées X et Y de vos objets dans les mêmes plans plutôt que d'avoir leurs propres axes. Par tous les moyens ont des propriétés Position et Heading et considèrent avoir une méthode Move qui prend votre vecteur d'entrée et fait les maths pour mettre à jour la position et l'en-tête.

+0

C'est pourquoi je veux en faire une propriété. Vous pouvez directement référencer les coordonnées X et Y, ou vous pouvez utiliser la propriété pour les obtenir ou les définir comme si elles étaient dans un plan pivoté. Il est beaucoup plus facile de calculer les contrôles de mouvement d'un objet qui change de direction en fonction de l'endroit où sa rotation le dirige. –

+0

Je ne suis pas sûr d'être d'accord - je pense que cela va prêter à confusion. –

+0

Je ne vois pas pourquoi cela serait déroutant; c'est entièrement facultatif. C'est juste une petite aide pour déplacer un objet où "forward" devrait toujours correspondre à un certain bord de l'image-objet, plutôt qu'au sommet de la fenêtre. –

3

Vous pouvez également utiliser les méthodes auxiliaires Matrix pour créer une matrice de rotation Z, puis multiplier votre vecteur par ceci pour le faire pivoter. Quelque chose comme ceci:

Vector v1; 
Matrix rot = Matrix.CreateRotationZ(angle); 
Vector v2 = v1 * rot;