Frage

Deshalb habe ich eine Quaternion-basierte 3D-Kamera geschrieben, die sich an neue Programmierer richtet, damit sie sie extrem einfach integrieren und verwenden können.

Während ich es entwickelte, nahm ich zunächst Benutzereingaben als Euler-Winkel und generierte dann ein Quaternion basierend auf der Eingabe für diesen Frame.Ich würde dann das Quaternion der Kamera nehmen und es mit dem Quaternion multiplizieren, das wir für die Eingabe generiert haben. Theoretisch sollte dies einfach die Eingaberotation zum aktuellen Status der Kamerarotation addieren, und alles wäre großartig und glücklich.Nennen wir es:Akkumulieren von Quaternionen, da wir nur Quaternionen speichern und hinzufügen.

Mir ist jedoch aufgefallen, dass es bei dieser Methode ein Problem gibt.Je öfter ich es benutzte, selbst wenn ich mich nur um einen Euler-Winkel drehte, sagen wir Yaw, würde es im Laufe einiger Iterationen beginnen, in einen anderen überzugehen, sagen wir Pitch.Es war geringfügig, aber ziemlich inakzeptabel.

Also habe ich noch etwas recherchiert und einen Artikel gefunden, in dem es hieß, es sei besser, Euler-Winkel zu akkumulieren, sodass die Kamera ihre aktuelle Drehung als Euler-Winkel speichert und die Eingabe einfach bei jedem Bild hinzugefügt wird.Dann generiere ich daraus in jedem Frame ein Quaternion, das wiederum zur Generierung meiner Rotationsmatrix verwendet wird.Dadurch wurde das Problem des Rotationsblutens in falsche Achsen behoben.

Haben Stackoverflow-Mitglieder Einblick in dieses Problem?Ist das eine richtige Vorgehensweise?

War es hilfreich?

Lösung

Bei der Multiplikation von Quaternionen kommt es zu einer Anhäufung von Gleitkomma-Rundungsproblemen (selbst einfache Winkel wie 45 Grad sind nicht exakt).Es ist eine großartige Möglichkeit, Rotationen zusammenzusetzen, aber die Präzision jeder Ihrer Quaternion-Komponenten wird mit der Zeit abnehmen.Das Durchbluten ist ein Nebeneffekt, ein optisch noch schlimmerer ist jedoch, dass Ihre Quaternion möglicherweise einen Skalierungsfaktor einbezieht. Um dies wiederherzustellen, müssten Sie auf jeden Fall wieder auf Euler-Winkel zurücknormieren.Ein Festkomma-Euler-Winkel wird keine Rundung akkumulieren.

Die Neuberechnung der Quaternion pro Frame ist minimal.Ich würde mir nicht die Mühe machen, es zu optimieren.Sie könnten wahrscheinlich einige Quaternionen akkumulieren lassen, bevor Sie eine Renormierung durchführen, um die Genauigkeit wiederherzustellen, aber der Aufwand lohnt sich wirklich nicht.

Andere Tipps

Die Akkumulation ist ein ungenauer Prozess. Akkumulieren viele Inkrementrotationen werden Rundungsfehler akkumulieren, ob Sie es mit Quaternionen oder Matrizen.

Ich stelle mir so etwas wie dies: Sie haben Ihren Code und läuft, aber festgestellt, dass nach einem gewissen Navigation Kamera annoyingly Krängung wurde - Verstoß gegen ein invariant Sie nicht von vorher gedacht hatten. Effektiv haben Sie erkannt Sie nicht wollen Rotationen zu akkumulieren; stattdessen wollen Sie etwas anderes tun.

Sie können eher als Interface-Design Problem dies betrachten als eine numerische Genauigkeit Problem. Grundsätzlich erwarten die Menschen eine Kamera nach Tonhöhe zu navigieren, Gieren und Rollen, so dass die Wahl zu steuern und die Winkel stellen direkt eine Menge Probleme vermeiden.

Die Bummer hier ist, dass die quaterions scheinen überflüssig geworden zu sein (für diese besondere Verwendung, zumindest). Sie wollen immer noch die Quaternionen, obwohl - mit dem Rohpechs / Gier / Rollwinkel interpolieren hässlich sein kann. Wieder ist es eine Interface-Design Frage: Sie brauchen, um herauszufinden, wo Sie die Quaternionen brauchen werden, und wie sie in und raus ...

Ich habe beide argumentiert für gesehen. Ich denke, die wirkliche Frage, die Sie mit Flexibilität ist auf der ganzen Linie in der Kamera-System zu tun haben würden; IMO Gieren ist in der Regel interessanter in der dritten Person-Ansicht (weil Sie über den Charakter der vertikalen Achse drehen, fahren). Sie können zwar wohl „Gier“ um die vertikale in Egoperspektive als auch, ich bin nicht sicher, ob es wirklich das gleiche.

Aber ich denke, es ist so eine Art Abfall Ihre quaternions pro Frame neu zu berechnen. Vielleicht wäre es besser, die neuesten quaternions zu speichern und sie verschmutzt markieren, wenn Ihr Rahmen Eingang empfängt?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top