2010-08-20 8 views
6

Ich beginne gerade in XNA und habe eine Frage über die Rotation. Wenn Sie einen Vektor in XNA mit einer Rotationsmatrix multiplizieren, wird er gegen den Uhrzeigersinn gedreht. Das verstehe ich.Was ist dieses Rotationsverhalten in XNA?

Lassen Sie mich Ihnen jedoch ein Beispiel geben, was ich nicht bekomme. Nehmen wir an, ich lade ein zufälliges Kunstobjekt in die Pipeline. Ich erstelle dann eine Variable, um jedes Bild um 2 Radianten zu erhöhen, wenn die Update-Methode ausgeführt wird (testRot + = 0.034906585f). Die Hauptsache meiner Verwirrung ist, dass das Asset im Uhrzeigersinn in diesem Bildschirmbereich rotiert. Das verwirrt mich, wenn eine Rotationsmatrix einen Vektor gegen den Uhrzeigersinn dreht.

Eine andere Sache, wenn ich angeben, wo mein Positionsvektor ist, sowie meine Herkunft, verstehe ich, dass ich über den Ursprung rotiere. Soll ich annehmen, dass es auch eine senkrechte Achse gibt, die durch den Ursprung dieses Assets verläuft? Wenn ja, wo beginnt die Rotation? Mit anderen Worten: Beginne ich mit der Drehung von der Oberseite der Y-Achse oder der X-Achse?

+0

@llya - Sie sollten wahrscheinlich die Antworten auf Ihre anderen Fragen akzeptieren, damit andere Ihre Frage beantworten können. – TheCloudlessSky

+0

Fertig, alle akzeptiert. Sorry Leute, vergaß. – Ilya

Antwort

11

Der XNA SpriteBatch funktioniert in Client Space. Wobei "oben" Y- ist, nicht Y + (wie im kartesischen Raum, Projektionsraum und was die meisten Menschen normalerweise für ihren Weltbereich auswählen). Dadurch erscheint die Drehung im Uhrzeigersinn (nicht entgegen dem Uhrzeigersinn wie im kartesischen Raum). Die tatsächlichen Koordinaten, die die Rotation erzeugt, sind gleich.

Drehungen sind relativ, also beginnen sie nicht wirklich von einer bestimmten Position aus.

Wenn Sie Mathematikfunktionen wie sin oder cos oder atan2, dann absolute Winkel verwenden immer von der X + Achse als Null Radian starten, und die positive Drehrichtung dreht in Richtung Y +.


Die Reihenfolge der Operationen von SpriteBatch sieht ungefähr so ​​aus:

  1. Sprite als Quad beginnen mit der linken oberen Ecke auf (0,0), deren Größe die gleichen wie seine Textur zu sein Größe (oder SourceRectangle).
  2. Übersetzen Sie das Sprite zurück nach seinem Ursprung (so seinen Ursprung bei (0,0)).
  3. Maßstab der Sprite
  4. Drehen Sie das Sprite
  5. das Sprite Übersetzen durch seine Position
  6. aus der Matrix Nehmen SpriteBatch.Begin

Dies das Sprite in Client-Raum platziert.

Schließlich wird eine Matrix auf jeden Stapel angewendet, um diesen Client Space in den von der GPU verwendeten Projektionsraum zu transformieren. (Projektionsraum ist von (-1, -1) unten links im Ansichtsfenster, bis (1,1) oben rechts.)

+1

Wow, danke Mann. Sehr gut erklärt. Ich suchte Tutorials/Bücher und alles, was sie taten, war über diese zu reden, ohne zu vertiefen. – Ilya

+0

@llya: Gern geschehen. (PS: Vergiss nicht upvote und akzeptiere :) –

2

Da Sie XNA neu sind, erlauben Sie mir, eine Bibliothek einzuführen, die wird Ihnen sehr helfen, während Sie lernen. Es heißt XNA Debug Terminal und ist ein Open-Source-Projekt, mit dem Sie während der Laufzeit beliebigen Code ausführen können. So können Sie sehen, ob Ihre Variablen den erwarteten Wert haben. All dies geschieht in einem Terminal-Display über Ihrem Spiel und ohne Ihr Spiel zu pausieren. Es kann unter http://www.protohacks.net/xna_debug_terminal heruntergeladen werden. Es ist kostenlos und sehr einfach einzurichten, so dass Sie wirklich nichts zu verlieren haben.