2012-04-10 4 views
1

erste Frage zu SO obwohl ich schon viele Male hier durch Google gewesen bin. Ich habe ziemlich viel über das Thema der Verwendung von Quaternionen gelesen, um Rotation darzustellen, und um Menschen mit ähnlichen Problemen zu finden. Ich muss noch eine gute Lösung finden, oder eine, die ich verstehen könnte. Also gebe ich eine Chance, eine klare Frage zu stellen, um solide Antworten zu generieren.Quaternion Camera Representation in 6DOF - Abwehren von inhärenten Rollen

Ich verwende derzeit eine Quaternion (speziell eine Qt 4.7 Quaternion/C++), um die Ausrichtung meiner Kamera darzustellen. Bei jedem Schritt des Programms überprüfe ich auf Mausbewegung und mache ein fromAxisAndAngle (xaxis, x_mouse_movement) und fromAxisAndAngle (yaxis, y_mouse_movement). Ich nehme diese zwei Quaternionen und multipliziere sie (yaxis * xaxis). Für die Initialisierung habe ich eine Einheit Quaternion (w, x, y, z -> 1,0,0,0) mit zu multiplizieren. Ich akkumulieren die Rotation über diese vonAxisAndAngle Multiplikationen mit der aktuellen Ausrichtung. Dies erzeugt eine Rolle, bekannt als das Problem der Lie - Gruppe (glaube ich), dass, wenn Sie kontinuierlich Pitch und Gieren anwenden, Sie eine reine Rolle erzeugen können, und das ist das, was ich in meiner aktuellen Implementierung habe (was für meine Prozedur korrekt ist) Ich kann sagen).

Ich habe eine andere Methode implementiert, bei der Pitch, Gier, Roll inkrementiert werden und die Quaternion von AxisAndAngle jedesmal von diesen Werten aufgebaut wird. Dies erzeugt eine korrekte FPS-Stil-Kamera, aber es leidet unter einer kardanischen Verriegelung. Mein Ziel ist es, die reine Quaternion-Darstellung beizubehalten und gleichzeitig den Rolling-Effekt zu eliminieren (oder auszugleichen), der nur durch Tonhöhen und Gier erzeugt wird, so dass ich diese allgemeine 6DOF-Kamera als FPS-Kamera oder Raumschiff-Kamera verwenden kann. Ich suche nach Vorschlägen (bestimmten Routinen), um diese Rolle zu korrigieren, oder nach einer alternativen Darstellung, die meinen Bedürfnissen entspricht. Sorry für die Wand des Textes, aber ich wollte sehr klar sein. Vielen Dank für Ihre Zeit und für ein glückliches Hacken!

+0

Haben Sie eine Referenz für dieses "Lie Group Problem"? Ich hatte Schwierigkeiten, nach relevanten Referenzen zu suchen. Mein Verständnis war, dass eine Quaternion verwendet wurde, um den inkrementellen Ansatz zu ermöglichen, da Rundungsfehler vermieden werden, und dieses Problem ist neu für mich. –

Antwort

0

Es ist nicht ganz klar, was Sie erreichen möchten. Betrachten:

  1. in der kanonischen Ausrichtung Begin (+ x ist richtig, + y liegt, -Z ist vorwärts)
  2. Pitch um 90 ° nach unten. (-z ist oben, -y ist vorwärts)
  3. Giere um 90 °. (+ y ist richtig, + x ist vorwärts)
  4. Neigen um 90 °. (-x ist oben, -z ist vorwärts)
  5. Sie stehen nun wieder vor dem kanonischen Vorlauf, rollen aber um 90 ° nach links.

Was möchten Sie stattdessen tun? Dies ist ein normales Verhalten, wenn Sie Tonhöhe und Gier immer in Bezug auf den Referenzrahmen Kamera/Körper definieren. Wenn stattdessen "Gieren" immer um die Y-Achse der Welt und "Neigen" rotieren soll, um immer um die X-Achse der Kamera/des Körpers zu rotieren (so dass die X-Achse der Kamera immer parallel zur Grundebene ist), Wenn Sie dann um 90 ° nach unten geneigt wären, würde die Gierbewegung visuell als rollend erscheinen (Sie schauen nach unten und drehen sich im Kreis). Eine Quaternion, die diese Eigenschaft beibehält, wird immer eine 'z'-Komponente von Null haben. Sie können diese Beschränkung auf Ihre Quaternion einfach erzwingen (sicher sein, immer wieder zu normalisieren).

Allerdings sollte Ihre Methode, einfach die Tonhöhe und das Gieren getrennt zu verfolgen, für diesen Fall gut funktionieren. Gimbal Lock ist kein Problem, wenn Sie nur zwei Achsen an erster Stelle verwenden. Sie müssen nur sicher sein, dass Sie die Tonhöhe und dann das Gieren anwenden.

Verwandte Themen