So kombinieren Sie die Drehung in zwei Achsen zu einer Matrix

8

Ich kenne bereits die Matrizen, die ich verwenden muss, um Rotationen durchzuführen. Wenn ich mich in der Z-Achse und dann in der X-Achse drehen müsste, würde ich dies in 2 Schritten tun. Meine Frage ist, ist es möglich, beide Rotationen in einer einzigen Matrix zu kombinieren? Ich werde mich über Ihr Feedback freuen.

JORGE
quelle

Antworten:

8

(Diese Antwort ist im Wesentlichen dieselbe wie die von Stefan, aber ich wollte einige Details zu Zeilen- und Spaltenvektoren hinzufügen und erläutern, welche Sie verwenden.)

Ja, dies ist möglich, aber die Details hängen davon ab, ob Sie Ihre Vektoren als Zeilen oder Spalten darstellen.

Spaltenvektoren

Wenn Sie Spaltenvektoren verwenden, transformieren Sie diese normalerweise, indem Sie Ihre Matrizen nach links multiplizieren:

vector = mRotateZ * vector;
vector = mRotateX * vector;

Natürlich können Sie dies auch in einem Schritt tun:

vector = mRotateX * mRotateZ * vector;

Die Matrixmultiplikation ist jedoch assoziativ, was bedeutet, dass es keine Rolle spielt, welche Multiplikation zuerst durchgeführt wird:

A * B * C = (A * B) * C = A * (B * C)

Also können wir schreiben

Matrix mRotate = mRotateX * mRotateZ;
vector = mRotate * vector;

Wir haben jetzt eine einzige Matrix erstellt, die äquivalent ist erste Drehung um Zund zweiten über X. Dies verallgemeinert sich trivial für eine beliebige Anzahl von Transformationen. Beachten Sie, dass Transformationen von rechts nach links angewendet werden.

Zeilenvektoren

Wenn auf der anderen Seite sind Sie mit Zeilenvektoren, werden Sie in der Regel rechts -multiply Ihre Matrizen:

vector = vector * mRotateZ;
vector = vector * mRotateX;

Wieder schreiben wir es in einem Schritt

vector = vector * mRotateZ * mRotateX;

welches umgeschrieben werden kann als

Matrix mRotate = mRotateZ * mRotateX;
vector = vector * mRotate;

Beachten Sie, dass in diesem Fall die Transformationen von links nach rechts angewendet werden.

Martin Ender
quelle
1
Ich wäre sehr vorsichtig mit diesem Assoziativitätskommentar, der leicht zu missverstehen ist
joojaa
@joojaa Ich weiß nicht genau, was du meinst, aber ich habe versucht, das zu klären.
Martin Ender
Für einen Laien ist es schwierig, zwischen der Reihenfolge, in der Sie die Dinge multiplizieren, und der Reihenfolge, in der sich die Elemente multiplizieren, zu trennen.
Joojaa
Sie verstehen also den Unterschied zwischen assiokativ und kommutativ nicht. Wenn Sie also von der Reihenfolge der Multiplikation sprechen, denken viele vielleicht an Kommutativität
joojaa
6

Ja, multiplizieren Sie sie einfach in umgekehrter Reihenfolge:

Matrix myrotation = Matrix.CreateRotationX(xrot) * Matrix.CreateRotationZ(zrot);

BEARBEITEN. Meine Antwort gilt nur, wenn Sie Spaltenvektoren verwenden. Bitte lesen Sie die ausführliche Antwort von Martin Büttner.

Stefan Agartsson
quelle
Es tut mir leid, aber ich verstehe die Idee nicht. Was genau meinst du mit "umgekehrter Reihenfolge"?
JORGE
1
Multipliziere x mit z anstelle von z mit x;
Stefan Agartsson
1
Tatsächlich ist die Reihenfolge willkürlich. Man kann mit Zeilenvektoren modellieren und man kann Spaltenvektoren modellieren. Die Berechnung führt zu demselben Ergebnis, aber die Multiplikationsreihenfolge ändert sich. Aber ja, das ist irgendwie die richtige Antwort.
Jojaja
Joojaa, danke, dass du das klargestellt hast! Zeilenmatrix bedeutet umgekehrte Multiplikationsreihenfolge. Ist das richtig?
Stefan Agartsson
3

Aus der Mathematik:

Es gibt einen 2: 1 Homomorphismus von der Einheit Quaternionen zu SO (3) (die Rotationsgruppe).

Was dies (im Wesentlichen) bedeutet, ist Folgendes:

  1. Jede Orientierung kann als Quaternion dargestellt werden
  2. Quaternionen repräsentieren eine einzelne Rotation
  3. Die Multiplikation von Quaternionen erzeugt eine weitere Quaternion (Schließung) und entspricht dem Zusammensetzen der Rotationen.
  4. Daher kann eine beliebige Anzahl von Umdrehungen als einzelne Umdrehung dargestellt werden!

Denk darüber nach. Ausgehend vom Objektraum können Sie Ihr Objekt mit nur einer einzigen Drehung in eine beliebige Ausrichtung drehen .


Ich möchte darauf hinweisen, dass das Einbringen von Quaternionen nicht nur eine zufällige Mathematik war. Im Gegensatz zu den anderen Antworten besteht der bevorzugte Ansatz in Grafiken darin, Rotationen als Quaternionen darzustellen, da sie weniger Platz beanspruchen und schneller zu kombinieren sind.

Es gibt leicht zu googelnde Möglichkeiten, zwischen Rotationsmatrizen und Quaternionen zu konvertieren, je nachdem, welche Sie bevorzugen. Der Punkt ist , dass Drehungen sind die Quaternionen im mathematischen Sinne, also Kombinationen davon sind auch einzelne Umdrehungen.

imallett
quelle