142 Stimmen

Warum werden Quaternionen für Rotationen verwendet?

Ich bin Physiker und habe etwas Programmieren gelernt. Dabei bin ich auf viele Leute gestoßen, die Quaternionen für Rotationen verwenden, anstatt Dinge in Matrix-/Vektorform zu schreiben.

In der Physik gibt es sehr gute Gründe, warum wir keine Quaternionen verwenden (trotz der bizarren Geschichte, die gelegentlich über Hamilton/Gibbs/etc erzählt wird). Die Physik verlangt, dass unsere Beschreibungen ein gutes analytisches Verhalten haben (das hat eine genau definierte Bedeutung, aber auf eine ziemlich technische Art und Weise, die weit über das hinausgeht, was in normalen Einführungskursen gelehrt wird, also werde ich nicht ins Detail gehen). Es hat sich herausgestellt, dass Quaternionen dieses nette Verhalten nicht haben und daher nicht nützlich sind, während Vektoren/Matrizen es haben und wir sie daher verwenden.

Beschränkt man sich jedoch auf starre Rotationen und Beschreibungen, die keine analytischen Strukturen verwenden, können 3D-Rotationen auf beide Arten gleichwertig beschrieben werden (oder auf einige andere Arten).

Im Allgemeinen wollen wir nur eine Abbildung eines Punktes X = (x, y, z) auf einen neuen Punkt X' = (x', y', z') unter der Bedingung, dass X 2 \= X' 2 . Und es gibt viele Dinge, die das tun.

Der naive Weg besteht darin, die so definierten Dreiecke zu zeichnen und Trigonometrie zu verwenden, oder die Isomorphie zwischen einem Punkt (x, y, z) und einem Vektor (x, y, z) und die Funktion f(X) = X' und eine Matrix MX = X' zu verwenden, oder Quaternionen zu verwenden, oder die Komponenten des alten Vektors entlang des neuen Vektors mit einer anderen Methode zu projizieren (x, y, z) T .(a,b,c) (x',y',z'), usw.

Aus mathematischer Sicht sind alle diese Beschreibungen in diesem Rahmen äquivalent (als Theorem). Sie haben alle die gleiche Anzahl von Freiheitsgraden, die gleiche Anzahl von Beschränkungen usw.

Warum also werden Quaternionen gegenüber Vektoren bevorzugt?

Die üblichen Gründe, die ich sehe, sind keine kardanische Verriegelung oder numerische Probleme.

Das Argument der fehlenden Kardanverriegelung erscheint merkwürdig, da dies nur ein Problem der Eulerwinkel ist. Es handelt sich auch nur um ein Koordinatenproblem (genau wie die Singularität bei r=0 in Polarkoordinaten (die Jacobikurve verliert ihren Rang)), was bedeutet, dass es sich nur um ein lokales Problem handelt, das durch einen Koordinatenwechsel, eine Drehung aus der Entartung heraus oder die Verwendung von zwei sich überlappenden Koordinatensystemen gelöst werden kann.

Bei den Zahlen bin ich mir nicht so sicher, da ich nicht im Detail weiß, wie diese beiden (und etwaige Alternativen) umgesetzt werden würden. Ich habe gelesen, dass es einfacher ist, eine Quaternion zu re-normalisieren als eine Rotationsmatrix, aber das gilt nur für eine allgemeine Matrix; eine Rotation hat zusätzliche Einschränkungen, die dies trivialisieren (die in die Definition von Quaternionen eingebaut sind) (Tatsächlich muss dies wahr sein, da sie die gleiche Anzahl von Freiheitsgraden haben).

Was ist also der Grund für die Verwendung von Quaternionen im Vergleich zu Vektoren oder anderen Alternativen?

84voto

Peter Alexander Punkte 51742

Kardanische Verriegelung ist ein Grund dafür, obwohl es, wie Sie sagen, nur ein Problem mit Euler-Winkeln ist und leicht zu lösen ist. Euler-Winkel werden immer noch verwendet, wenn es um den Speicherplatz geht, da man nur 3 Zahlen speichern muss.

Bei Quaternionen gegenüber einer 3x3-Rotationsmatrix hat die Quaternion den Vorteil der Größe (4 Skalare gegenüber 9) und der Geschwindigkeit (die Quaternion-Multiplikation ist viel schneller als die 3x3-Matrix-Multiplikation).

なお alle dieser Darstellungen von Drehungen werden in der Praxis verwendet. Euler-Winkel benötigen am wenigsten Speicherplatz; Matrizen benötigen mehr Speicherplatz, leiden aber nicht unter Gimbal Lock und haben schöne analytische Eigenschaften; und Quaternionen bieten eine gute Balance zwischen beidem, da sie leichtgewichtig, aber frei von Gimbal Lock sind.

49voto

datenwolf Punkte 154484

In der Physik gibt es sehr gute Gründe, warum wir keine Quaternionen verwenden (trotz der bizarren Geschichte, die gelegentlich über Hamilton/Gibbs/etc erzählt wird). Die Physik verlangt, dass unsere Beschreibungen ein gutes analytisches Verhalten haben (das hat eine genau definierte Bedeutung, aber auf eine ziemlich technische Art und Weise, die weit über das hinausgeht, was in normalen Einführungskursen gelehrt wird, also werde ich nicht ins Detail gehen). Es hat sich herausgestellt, dass Quaternionen dieses nette Verhalten nicht haben und daher nicht nützlich sind, während Vektoren/Matrizen es haben und wir sie daher verwenden.

Nun, ich bin auch Physikerin. Und es gibt einige Situationen, in denen Quaternionen einfach toll sind! Sphärische Harmonik zum Beispiel. Zwei Atome streuen und tauschen ein Elektron aus: Was ist der orbitale Spin-Transfer? Mit Quaternionen ist es einfach eine Multiplikation, d. h. eine Summierung der Exponenten der SH-Basisfunktionen, ausgedrückt als Quaternionen. (Die Legendre-Polynome in die Quaternionen-Notation zu übertragen, ist allerdings etwas mühsam).

Aber ich stimme zu, dass sie kein universelles Werkzeug sind, und besonders in der Starrkörpermechanik wären sie sehr umständlich zu verwenden. Doch um Bertrand Russells Antwort auf die Frage eines Studenten zu zitieren, wie viel Mathematik ein Physiker beherrschen muss: "So viel wie möglich!"

Wie auch immer: Warum lieben wir Quaternionen in der Computergrafik? Weil sie eine Reihe ansprechender Eigenschaften haben. Erstens kann man sie gut interpolieren, was wichtig ist, wenn man rotierende Dinge animiert, wie die Gliedmaßen um ein Gelenk herum. Bei einem Quaternion handelt es sich lediglich um eine skalare Multiplikation und Normalisierung. Wenn man dies mit einer Matrix ausdrücken will, muss man sin und cos auswerten und dann eine Rotationsmatrix erstellen. Die Multiplikation eines Vektors mit einer Quaternion ist immer noch billiger als eine vollständige Vektor-Matrix-Multiplikation, und sie ist auch noch billiger, wenn man anschließend eine Translation hinzufügt. Wenn man ein Skelett-Animationssystem für einen menschlichen Charakter betrachtet, bei dem man viele Translationen/Rotationen für eine große Anzahl von Scheitelpunkten auswerten muss, hat dies einen großen Einfluss.

Ein weiterer angenehmer Nebeneffekt der Verwendung von Quaternionen ist, dass jede Transformation von Natur aus orthonormal ist. Bei Translationsmatrizen muss man aufgrund von numerischen Rundungsfehlern alle paar Animationsschritte neu orthonormalisieren.

42voto

Nicol Bolas Punkte 409659

Das Argument der fehlenden Kardanverriegelung erscheint merkwürdig, da dies nur ein Problem der Eulerwinkel ist. Es handelt sich auch nur um ein Koordinatenproblem (genau wie die Singularität bei r=0 in Polarkoordinaten (die Jacobikurve verliert ihren Rang)), was bedeutet, dass es sich nur um ein lokales Problem handelt, das durch einen Koordinatenwechsel, eine Drehung aus der Entartung heraus oder die Verwendung von zwei sich überlappenden Koordinatensystemen gelöst werden kann.

Viele 3D-Anwendungen verwenden gerne Euler-Winkel, um die Ausrichtung eines Objekts zu definieren. Insbesondere für Flugsimulationen stellen sie eine theoretisch nützliche Möglichkeit dar, die Ausrichtung auf eine leicht zu ändernde Weise zu speichern.

Sie sollten sich auch darüber im Klaren sein, dass Dinge wie der Wechsel von Koordinaten, das Drehen aus der Entartung heraus oder die Verwendung von zwei sich überschneidenden Koordinatensystemen" alle einen gewissen Aufwand erfordern. Aufwand bedeutet Code. Und Code bedeutet Leistung. Leistung geht verloren, wenn Sie nicht haben ist für viele 3D-Anwendungen keine gute Sache. Denn was nützen all diese Tricks, wenn man mit Quaternionen alles bekommt, was man braucht.

Bei den Zahlen bin ich mir nicht so sicher, da ich nicht im Detail weiß, wie diese beiden (und etwaige Alternativen) umgesetzt werden würden. Ich habe gelesen, dass es einfacher ist, eine Quaternion zu re-normalisieren als eine Rotationsmatrix, aber das gilt nur für eine allgemeine Matrix; eine Rotation hat zusätzliche Einschränkungen, die dies trivialisieren (die in die Definition von Quaternionen eingebaut sind) (Tatsächlich muss dies wahr sein, da sie die gleiche Anzahl von Freiheitsgraden haben).

Die numerischen Probleme treten auf, wenn es um mehrere aufeinanderfolgende Drehungen einer Orientierung geht. Stellen Sie sich vor, Sie haben ein Objekt im Raum. In jedem Zeitintervall führen Sie eine kleine Gieränderung durch. Nach jeder Änderung müssen Sie die Ausrichtung neu normieren, da sich sonst Präzisionsprobleme einschleichen und die Sache vermasseln.

Wenn Sie Matrizen verwenden, müssen Sie bei jeder Matrixmultiplikation die Matrix neu orthonormalisieren. Die Matrix, die Sie orthonormalisieren, ist nicht dennoch eine Rotationsmatrix, daher wäre ich mir bei dieser einfachen Orthonormierung nicht so sicher. In diesem Punkt kann ich mir jedoch sicher sein:

Sie wird nicht so schnell sein wie eine 4D-Vektornormalisierung. Das ist, was Quaternionen verwenden, um nach aufeinanderfolgenden Drehungen zu normalisieren.

Die Normalisierung von Quaternionen ist billig. Auch spezialisierte Rotationsmatrix-Normalisierung wird nicht als billig. Auch hier zählt die Leistung.

Es gibt noch ein weiteres Problem, das sich mit Matrizen nicht so leicht lösen lässt: die Interpolation zwischen zwei verschiedenen Ausrichtungen.

Wenn Sie mit einer 3D-Figur arbeiten, haben Sie oft eine Reihe von Transformationen, die die Position der einzelnen Knochen der Figur definieren. Diese Hierarchie von Bones stellt die Figur in einer bestimmten Pose dar.

In den meisten Animationssystemen wird zur Berechnung der Pose einer Figur zu einem bestimmten Zeitpunkt zwischen den Transformationen interpoliert. Dazu müssen die entsprechenden Transformationen interpoliert werden.

Die Interpolation zweier Matrizen ist... nicht trivial. Zumindest dann, wenn man etwas will, das am Ende einer Rotationsmatrix ähnelt. Schließlich ist der Zweck der Interpolation, etwas zu erzeugen, das auf halbem Weg zwischen den beiden Transformationen liegt.

Für Quaternionen benötigen Sie lediglich einen 4D-Lerp, gefolgt von einer Normalisierung. Das ist alles: Nehmen Sie zwei Quaternionen und interpolieren Sie die Komponenten linear. Normalisieren Sie das Ergebnis.

Wenn Sie eine bessere Qualität der Interpolation wünschen (was manchmal der Fall ist), können Sie die sphärischer Lerp . Dadurch wird das Verhalten der Interpolation bei unterschiedlichen Ausrichtungen verbessert. Diese Berechnungen sind viel schwieriger und erfordert mehr Operationen für Matrizen als für Quaternionen.

14voto

Kevin Kostlan Punkte 3019

Stellungnahme: Quaternionen sind schön.

Rotationsmatrix: Geringfügiger Nachteil : Die Multiplikation von Matrizen ist ~2 mal langsamer als Quaternionen. Kleiner Vorteil : Die Matrix-Vektor-Multiplikation ist ~2 mal schneller, und groß. Riesig Nachteil : Normalisierung! Ghram-Shmit ist asymmetrisch, was bei Differentialgleichungen höherer Ordnung keine genaue Antwort liefert. Anspruchsvollere Methoden sind sehr komplex und teuer.

Achse (Winkel = Länge der Achse) Geringer Vorteil : Klein. Mäßiger Nachteil : Die Multiplikation und Anwendung auf einen Vektor ist mit Trigonometrie langsam. Mäßiger Nachteil : Singularität des Nordpols bei Länge = 2*pi, da alle Achsenrichtungen nichts bewirken. Mehr Code (und Fehlersuche), um ihn automatisch zu skalieren, wenn er sich 2pi nähert.

10voto

Sage Gerard Punkte 1281

Die üblichen Gründe, die ich sehe, sind keine Kardansperre oder numerische Probleme.

Und es sind gute Gründe.

Wie Sie bereits zu verstehen scheinen, kodieren Quaternionen eine einzige Drehung um eine beliebige Achse im Gegensatz zu drei aufeinanderfolgenden Drehungen im Euler-3-Raum. Dies macht Quaternionen immun gegen kardanische Verriegelung .

Außerdem lassen sich einige Formen der Interpolation sehr gut und einfach durchführen, wie z. B. SLERP .

...oder mit zwei sich überschneidenden Koordinatensystemen.

Warum ist Ihre Lösung aus Sicht der Leistung besser?

Ich könnte noch weiter fortfahren, aber Quaternionen sind nur ein mögliches Werkzeug, das man verwenden kann. Wenn sie für Ihre Bedürfnisse nicht geeignet sind, sollten Sie sie nicht verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X