(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 Z
und 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.