Quaternionen und Rotation um die Weltachse


11

Haftungsausschluss: Ich bin ein professioneller Spieleprogrammierer und verwende an den meisten Tagen Quaternionen, aber sie sind für mich der schwarzen Magie nahe. Ich bin mit Mathe relativ zu Hause, aber imaginäre Zahlen haben mich immer verwirrt. Ich neige dazu, Quats als nützlich zu behandeln und Multiplikationen mehr als einmal umzukehren. Ich versuche, über sie zu argumentieren, wie ich es mit Matrizen mit begrenztem Erfolg tun würde.

Jedenfalls....

Was mich verblüfft, ist das Folgende. Wenn ich ein Objekt um seine lokale Achse drehen möchte, multipliziere ich seine Drehung mit dem Quaternion, das die Drehung darstellt, die ich anwenden möchte. Es ist daher eine Rotation im lokalen Raum.

Wenn ich es nun um eine Achse im Weltraum drehen möchte, wäre meine Argumentation: Nehmen Sie die Rotation im Weltraum als Quaternion. Multiplizieren Sie die Umkehrung meiner Objektrotation mit dieser Quaternion. Dies wird meine Weltrotation in den lokalen Raum bringen. Multipliziere meine Rotation mit dieser neuen Quaternion. dh: newRot = oldRot * (inverse oldRot * worldRot)

Was ich jedoch tun muss, ist newRot = oldRot * (inverse oldRot * worldRot) * oldRot.

Warum muss ich nach dem Multiplizieren mit dem inversen Quat immer noch mit meinem eigenen Quat multiplizieren, bevor ich es anwende? Ich weiß, dass es einen vollkommen gültigen Grund geben muss, aber ich kann meinen Ausweg nicht begründen und es ist zum Teufel frustrierend für mich. Ich habe die verschiedenen FAQs und so weiter ausprobiert, aber die meisten gehen zu tief in die Mathematik, was es mir weniger klar macht.

Wer kann mir das erklären, als wäre ich 5 Jahre alt?


Ist es nicht ein bisschen wie Matrixübersetzungen und -rotationen (dh Sie müssen Ihr Objekt in die Mitte bewegen, drehen und dann zurück bewegen, wenn Sie ein Objekt um sich selbst drehen möchten: Minv_transl * Mrot * Mtransl)
Valmond

I try to reason about them like I would with matrices- Dann sind Sie auf dem richtigen Weg. Wenn Sie verstanden haben, wie man mithilfe von Matrizen um die Achsen des Objekts und der Welt dreht, können Sie dies auch mithilfe von Quaternionen tun. Die Multiplikationsreihenfolge ist für Matrizen und Quaternionen gleich.
Maik Semder

Antworten:


11

Quaternionen sind assoziativ:

Sie erwähnen, dass Ihre Lösung ist:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

Das ist das gleiche wie:

newRot = oldRot * inverse oldRot * worldRot * oldRot

Das ist das gleiche wie:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

Das bringt Sie zurück zu dem, was wirklich passiert:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

Die Reihenfolge der Anwendung ändert sich, das ist alles. Zurück zu den Matrizen: Wenn Sie eine Objektmatrix auf eine Transformationsmatrix anwenden und diese als neue Objektmatrix speichern, ist dies Ihre lokale Raumtransformation. Wenn Sie die Transformationsmatrix auf die Objektmatrix anwenden und diese speichern, ist dies Ihre Welttransformation. Es geht nur um die Reihenfolge der Anwendung und nichts weiter.


1
+1 für den ersten Teil, der zweite Teil ist etwas irreführend. Wenn Sie im letzten Codebeispiel nur "rot" anstelle von "localRot" und "worldRot" verwenden, wird das Beispiel klarer. Andernfalls bedeutet dies, dass die Fäulnisse selbst ohnehin unterschiedlich sind . Der Unterschied liegt jedoch nur in der Multiplikationsreihenfolge, wie Sie gezeigt haben, und nicht in verschiedenen Quaternionen ('localRot' und 'worldRot'). 'localTransformed' und 'worldTransformed' wären besser als: 'rotatedAroundLocalAxis' und 'rotatedAroundWorldAxis'. Das selbst würde die Gleichungen erklären und den letzten Absatz überflüssig machen, was einige Mängel aufweist.
Maik Semder

Fehler im letzten Absatz: Die Unterscheidung zwischen Matrix und Transformation (beide sind hier gleich und austauschbar, daher ist es besser, nur Matrix zu verwenden, um Verwirrung zu vermeiden) und die Begriffe "lokale Raumtransformation" und "Welttransformation": Es wäre mehr Richtig zu sagen, die erste Gleichung gibt Ihnen die "Local-to-World-Matrix", nachdem Sie um die lokale Achse des Objekts gedreht wurden, die zweite gibt Ihnen die "Local-to-World-Matrix", nachdem Sie um die World-Achse gedreht wurden. In beiden Fällen erhalten Sie einfach die "Local-to-World-Matrix". Der erste Teil hat jedoch trotzdem meine +1 für die Analyse.
Maik Semder

+1 @Maik Vielleicht könnten Sie eine separate Antwort schreiben, um die Gleichgültigkeit zwischen Rotationen und der Frage der Multiplikationsreihenfolge noch deutlicher zu machen? Danke für den Kommentar so oder so!
Max Dohme

Ah, jetzt macht es Sinn. Ich wusste nicht (autsch, das wäre in den FAQs gewesen), dass die Quaternionsmultiplikation assoziativ ist, also heben sich die Rotation und die Umkehrung gegenseitig auf und geben mir den Einblick, den ich brauchte. Man hat die lokale Rotation rechts und eine rechts links, die im Grunde sagen "Rotation im übergeordneten Raum anwenden" oder "Rotation im lokalen Raum anwenden" sagen .... nicht anders als Matrizen. Ziemlich elementar, wenn Sie es sehen! Vielen Dank!
Kaj
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.