2016-06-29 6 views
2

Ich habe eine 4x4 Transformationsmatrix. Jedoch, nach dem Ausprobieren der Transformation bemerkte ich, dass die Bewegung und Drehung der Y-Achse den umgekehrten Weg geht. Der Rest ist korrekt.Wie wird nur eine Achse der Transformationsmatrix gewendet?

Ich habe diese Matrix von einer anderen API so wahrscheinlich ist es der Unterschied des Koordinatensystems. Also, wie kann ich eine Achse der Transformationsmatrix spiegeln?

Wenn nur Übersetzung Ich kann Minuszeichen auf der Y-Übersetzung hinzufügen, aber ich habe keine Ahnung über die entgegengesetzte Drehung von nur einer Achse, da die gesamte Rotation im gleichen 3x3-Bereich dargestellt wird. Ich dachte, es könnte einen Weg geben, der gleichzeitig sowohl die Übersetzung als auch die Rotation beeinflusst. (wirklich Spiegeln der Achse)

Antwort

4

Bearbeiten: Ich bin ziemlich sicher, dass die Operation, die Sie suchen, Koordinatensysteme ändert, während Z-up oder Y-up beibehalten. Versuchen Sie in diesem Fall, alle Elemente der zweiten Spalte (oder Zeile) Ihrer Matrix auf ihre Umkehrung zu setzen.


Diese Frage wäre besser für Math StackExchange. Erstens, a really helpful read on rotation matrices.

Das erste Problem ist die Frage der Reihenfolge der Rotation. Ich werde die XYZ-Rotationsreihenfolge annehmen. Wir kennen die Rotationsmatrizen für jede Achse ist wie folgt:

Rotation matrices for each XYZ axis component

Bei einer Matrix aus dem gleichen Rotationsreihenfolge abgeleitet wird, die sich ergebende Matrix sein würde, wie folgt, wobei alpha der X Winkel, beta ist der Y Winkel und Gamma ist der Z Winkel:

Completed rotation matrix for XYZ rotation order

Sie können die einzelnen Komponenten jeder Achswinkel von dieser Matrix abgeleitet werden. Zum Beispiel können Sie den Y-Winkel von -sin(beta) mit einigen inversen Triggern ableiten. Bei gegebener Beta können Sie Alpha von cos(beta)sin(alpha) ableiten. Sie können Gamma auch von cos(beta)sin(gamma) ableiten. Beachten Sie, dass die gleiche Zahl in der Matrix mehrere Werte darstellen kann (z. B. sin(0)=0 und sin(180)=0).

Nun, da Sie Alpha, Beta und Gamma kennen, können Sie Beta umkehren und die Rotationsmatrix neu erstellen.

Es gibt eine gute Chance, dass es eine bessere Möglichkeit gibt, dies mit Quaternionen zu tun, aber Sie sollten MathStackExchange diese Art von sprachunabhängigen Fragen stellen.

4

Viel kürzere Antwort: Wenn Sie nicht mit Ihrer Rahmenorientierung vorsichtig sind, haben viele Dinge in Ihrer Pipeline wahrscheinlich einen schlechten Haartag. Der Grund ist "Parität", alias "Rahmenorientierung", alias "right-handedness" (oder selten Linkshändigkeit). Die meisten 3D-Geometriewerkzeuge und -bibliotheken, die zusammenarbeiten, gehen implizit davon aus, dass alle Koordinatensysteme im Spiel rechtshändig (oder zumindest konsistent) sind. Das Umkehren der Orientierung von nur einer Achse in einem Koordinatensystem ändert ihre Ausrichtung von rechts nach links oder umgekehrt.

So Vorschlag für Dinge & Versuch in Ihrem Problem zu überprüfen:

  • Prüfen, ob der Rahmen, den Sie von Ihrem API bekommen, ist Rechtshänder. Sie tun dies , indem Sie die Determinante des 3x3-Rotationsteils Ihrer 4x4-Transformationsmatrix berechnen: Sie muss +1 oder sehr nahe beieinander liegen.

  • Wenn es -1 ist, dann flippen Sie eins, wenn seine Achse, d. H. Ändern Sie das Vorzeichen einer der Spalten der 3x3 Rotation.

  • Hinweis sorgfältig: Ich sage, „Spalten“, weil ich davon aus, dass Sie eine Q von bis zu einem Punkt x Transformation anwenden Multiplikation als Q * x, x ein 4x1 Spaltenvektor mit der letzten Komponente gleich eins zu sein. Wenn Sie Zeilenvektoren links-multipliziert mit Q verwenden, müssen Sie eine Zeile umkehren.

  • Wenn diese Determinante +1 ist, haben Sie einen Fehler an einem anderen Ort.