Ich bin Physiker, habe Programmieren gelernt und bin 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 erfordert, dass unsere Beschreibungen ein gutes analytisches Verhalten aufweisen (dies hat eine genau definierte Bedeutung, aber auf einige eher technische Arten, die weit über das hinausgehen, was in normalen Intro-Klassen gelehrt wird, sodass ich nicht auf Details eingehen werde). Es stellt sich heraus, dass Quaternionen dieses nette Verhalten nicht haben und daher nicht nützlich sind, und Vektoren / Matrizen, also verwenden wir sie.
3D-Rotationen sind jedoch auf starre Rotationen und Beschreibungen beschränkt, bei denen keine analytischen Strukturen verwendet werden. Sie können auf beide Arten (oder auf einige andere Arten) gleichwertig beschrieben werden.
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 dies tun.
Der naive Weg besteht darin, nur die Dreiecke zu zeichnen, die dies definiert, und Trigonometrie zu verwenden, oder den Isomorphismus zwischen einem Punkt (x, y, z) und einem Vektor (x, y, z) und der Funktion f (X) = X 'und zu verwenden eine Matrix MX = X 'oder unter Verwendung von Quaternionen oder Projizieren von Komponenten des alten Vektors entlang des neuen Vektors unter Verwendung einer anderen Methode (x, y, z) T. (a, b, c) (x', y ', z ') usw.
Aus mathematischer Sicht sind diese Beschreibungen in dieser Einstellung (als Theorem) alle gleichwertig. Sie haben alle die gleiche Anzahl von Freiheitsgraden, die gleiche Anzahl von Einschränkungen usw.
Warum scheinen Quaternionen Vektoren vorzuziehen?
Die üblichen Gründe, die ich sehe, sind keine Kardanverriegelung oder numerische Probleme.
Das Argument no gimbal lock erscheint seltsam, da dies nur ein Problem der Eulerwinkel ist. Es ist auch nur ein Koordinatenproblem (genau wie die Singularität bei r = 0 in Polarkoordinaten (der Jacobi verliert den Rang)), was bedeutet, dass es nur ein lokales Problem ist und durch Umschalten der Koordinaten, Rotieren aus der Entartung, gelöst werden kann. oder unter Verwendung von zwei überlappenden Koordinatensystemen.
Bei numerischen Problemen bin ich mir weniger sicher, da ich nicht im Detail weiß, wie diese beiden (und alle Alternativen) implementiert werden würden. Ich habe gelesen, dass es einfacher ist, eine Quaternion neu zu normalisieren, als dies für eine Rotationsmatrix zu tun, aber dies gilt nur für eine allgemeine Matrix. Eine Rotation hat zusätzliche Einschränkungen, die dies trivialisieren (die in die Definition von Quaternionen integriert sind) (Tatsächlich muss dies zutreffen, da sie die gleiche Anzahl von Freiheitsgraden haben).
Was ist der Grund für die Verwendung von Quaternionen über Vektoren oder anderen Alternativen?
Antworten:
Gimbal Lock ist ein Grund, obwohl es, wie Sie sagen, nur ein Problem mit Euler-Winkeln ist und leicht lösbar ist. Euler-Winkel werden immer noch verwendet, wenn der Speicher ein Problem darstellt, da Sie nur 3 Zahlen speichern müssen.
Bei Quaternionen gegenüber einer 3x3-Rotationsmatrix hat die Quaternion den Vorteil in Bezug auf Größe (4 Skalare gegenüber 9) und Geschwindigkeit (die Quaternionsmultiplikation ist viel schneller als die 3x3-Matrixmultiplikation).
Beachten Sie, dass alle diese Darstellungen von Rotationen in der Praxis verwendet werden. Eulerwinkel verwenden den geringsten Speicher; Matrizen verbrauchen mehr Speicher, leiden jedoch nicht unter Gimbal Lock und haben gute analytische Eigenschaften. und Quaternionen sorgen für eine gute Balance zwischen beidem, sind leicht, aber frei von Gimbal Lock.
quelle
Nun, ich bin auch Physiker. Und es gibt Situationen, in denen Quaternionen einfach rocken! Sphärische Harmonische zum Beispiel. Sie haben zwei Atome, die streuen und ein Elektron austauschen: Was ist der Orbitalspintransfer? Bei Quaternionen handelt es sich lediglich um eine Multiplikation, dh das Aufsummieren der Exponenten der SH-Basisfunktionen, ausgedrückt als Quaternionen. (Es ist allerdings etwas mühsam, die Legendre-Polynome in Quaternionsnotation zu bringen.)
Aber ich stimme zu, sie sind kein universelles Werkzeug, und besonders in der Starrkörpermechanik wäre ihre Verwendung sehr umständlich. Um Bertrand Russells Antwort auf die Frage eines Studenten zu zitieren, wie viel Mathematik ein Physiker wissen muss: "So viel wie möglich!"
Wie auch immer: Warum lieben wir Quaternionen in der Computergrafik? Weil sie eine Reihe ansprechender Eigenschaften haben. Zuerst kann man sie gut interpolieren, was wichtig ist, wenn man rotierende Dinge wie die Gliedmaßen um ein Gelenk animiert. Mit einer Quaternion ist es nur skalare Multiplikation und Normalisierung. Um dies mit einer Matrix auszudrücken, müssen sin und cos ausgewertet und anschließend eine Rotationsmatrix erstellt werden. Dann ist das Multiplizieren eines Vektors mit einer Quaternion immer noch billiger als das Durchlaufen einer vollständigen Vektor-Matrix-Multiplikation. Es ist auch immer noch billiger, wenn man danach eine Übersetzung hinzufügt. Wenn Sie ein Skelettanimationssystem für einen menschlichen Charakter in Betracht ziehen, bei dem viele Übersetzungen / Rotationen für eine große Anzahl von Scheitelpunkten ausgewertet werden müssen, hat dies enorme Auswirkungen.
Ein weiterer netter Nebeneffekt bei der Verwendung von Quaternionen ist, dass jede Transformation von Natur aus orthonormal ist. Bei Übersetzungsmatrizen muss man aufgrund numerischer Rundungsfehler alle paar Animationsschritte neu orthonormalisieren.
quelle
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 so zu speichern, dass sie leicht geändert werden kann.
Sie sollten sich auch darüber im Klaren sein, dass Dinge wie "Koordinaten wechseln, aus der Entartung herausdrehen oder zwei überlappende Koordinatensysteme verwenden" alle Aufwand erfordern. Anstrengung bedeutet Code. Und Code bedeutet Leistung. Leistungsverlust, wenn Sie nicht müssen , ist für viele 3D-Anwendungen keine gute Sache. Was können Sie mit all diesen Tricks erreichen, wenn Sie mit Quaternionen alles bekommen, was Sie brauchen?
Die numerischen Probleme treten auf, wenn mehrere aufeinanderfolgende Umdrehungen einer Ausrichtung behandelt werden. Stellen Sie sich vor, Sie haben ein Objekt im Raum. Und bei jeder Zeitscheibe wenden Sie eine kleine Gieränderung an. Nach jeder Änderung müssen Sie die Ausrichtung neu normalisieren. Andernfalls schleichen sich Präzisionsprobleme ein und vermasseln die Dinge.
Wenn Sie Matrizen verwenden, müssen Sie die Matrix jedes Mal, wenn Sie eine Matrixmultiplikation durchführen, neu orthonormalisieren. Die Matrix, die Sie orthonormalisieren, ist noch keine Rotationsmatrix, daher wäre ich mir bei dieser einfachen Orthonormalisierung nicht sicher. Da kann ich mir jedoch sicher sein:
Es ist nicht so schnell wie eine 4D-Vektornormalisierung. Das ist es, was Quaternionen verwenden, um sich nach aufeinanderfolgenden Rotationen zu normalisieren.
Quaternion Normalisierung ist billig. Selbst eine spezialisierte Rotationsmatrixnormalisierung wird nicht so billig sein. Auch hier ist die Leistung wichtig.
Es gibt noch ein weiteres Problem, das Matrizen nicht einfach lösen können: die Interpolation zwischen zwei verschiedenen Ausrichtungen.
Wenn Sie sich mit einem 3D-Charakter befassen, haben Sie häufig eine Reihe von Transformationen, die die Position jedes Knochens im Charakter definieren. Diese Hierarchie von Knochen repräsentiert den Charakter in einer bestimmten Pose.
In den meisten Animationssystemen interpoliert man zwischen Transformationen, um die Pose für einen Charakter zu einem bestimmten Zeitpunkt zu berechnen. Dies erfordert die Interpolation der entsprechenden Transformationen.
Das Interpolieren von zwei Matrizen ist ... nicht trivial. Zumindest, wenn Sie etwas wollen, das am Ende einer Rotationsmatrix ähnelt. Schließlich besteht der Zweck der Interpolation darin, etwas auf halbem Weg zwischen den beiden Transformationen zu erzeugen.
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 Interpolation mit besserer Qualität wünschen (und manchmal auch), können Sie den sphärischen Lerp hervorheben . Dadurch verhält sich die Interpolation bei unterschiedlicheren Orientierungen besser. Diese Mathematik ist viel schwieriger und erfordert mehr Operationen für Matrizen als Quaternionen.
quelle
Meinung: Quaternionen sind nett.
Rotationsmatrix: Kleiner Nachteil : Die Multiplikation von Matrizen ist ~ 2-mal langsamer als Quaternionen. Kleiner Vorteil : Die Matrix-Vektor-Multiplikation ist ~ 2-mal schneller und groß. Großer Nachteil : Normalisierung! Ghram-Shmit ist asymmetrisch, was bei Differentialgleichungen keine genaue Antwort höherer Ordnung liefert. Anspruchsvollere Methoden sind sehr komplex und teuer.
Achse (Winkel = Länge der Achse) Kleiner Vorteil : Klein. Moderater Nachteil : Die Multiplikation und Anwendung auf einen Vektor ist mit trig langsam. Moderater Nachteil : Nordpol-Singularität bei Länge = 2 * pi, da alle Achsenrichtungen nichts bewirken. Mehr Code (und Debugging), um ihn automatisch neu zu skalieren, wenn er sich 2pi nähert.
quelle
Das wollen wir absolut nicht nur . Es gibt eine sehr wichtige Subtilität, die viele Leute vermissen . Die Konstruktion, von der Sie sprechen (zeichnen Sie die Dreiecke und verwenden Sie Trig usw.), dreht einen Vektor korrekt in den anderen. Aber es gibt unendlich viele Umdrehungen, die dies tun. Insbesondere kann ich mitkommen, nachdem Sie Ihre Drehung durchgeführt haben, und dann das gesamte System um den X'-Vektor drehen. Das ändert nichts an der Position von X '. Die Kombination Ihrer und meiner Rotation entspricht einer weiteren einzelnen Rotation (da Rotationen eine Gruppe bilden ). Im Allgemeinen müssen Sie in der Lage sein, eine solche Drehung darzustellen.
Es stellt sich heraus, dass Sie dies nur mit einem Vektor tun können . (Das ist die Achsenwinkeldarstellung von Rotationen .) Das Kombinieren von Rotationen in der Achsenwinkeldarstellung ist jedoch schwierig. Quaternionen machen es einfach, zusammen mit vielen anderen Dingen. Grundsätzlich haben Quaternionen alle Vorteile anderer Darstellungen und keinen der Nachteile. (Obwohl ich zugeben werde, dass es bestimmte Anwendungen geben kann, für die eine andere Darstellung möglicherweise besser ist.)
quelle
Und das sind gute Gründe.
Wie Sie bereits zu verstehen scheinen, codieren Quaternionen eine einzelne Rotation um eine beliebige Achse im Gegensatz zu drei aufeinanderfolgenden Rotationen im Euler-3-Raum. Dies macht Quaternionen immun gegen Gimbal Lock .
Außerdem werden einige Interpolationsformen wie SLERP einfach und leicht zu handhaben .
Warum ist Ihre Lösung aus Sicht der Leistung besser?
Ich könnte weitermachen, aber Quaternionen sind nur ein mögliches Werkzeug. Wenn sie nicht Ihren Anforderungen entsprechen, verwenden Sie sie nicht.
quelle
Es ist zu beachten, dass alle mit der Rotation verbundenen Eigenschaften nicht wirklich Eigenschaften von Quaternionen sind: Sie sind Eigenschaften von Euler-Rodrigues-Parametrisierungen , der tatsächlichen 4-Element-Struktur, die zur Beschreibung einer 3D-Rotation verwendet wird.
Ihre Beziehung zu Quaternions beruht ausschließlich auf einem Artikel von Cayley "Über bestimmte Ergebnisse im Zusammenhang mit Quaternionen", in dem der Autor die Korrelation zwischen der Quaternion-Multiplikation und der Kombination von Euler-Rodrigues-Parametrisierungen beobachtet. Dies ermöglichte es, Aspekte der Quaternionstheorie auf die Darstellung von Rotationen und insbesondere auf die Interpolation zwischen ihnen anzuwenden.
Sie können das Papier hier lesen: https://archive.org/details/collmathpapers01caylrich . Zu dieser Zeit gab es jedoch keinen Zusammenhang zwischen Quaternions und Rotation, und Cayley war ziemlich überrascht, dass es Folgendes gab:
Quaternionen haben jedoch nichts Eigenes, was der Rotation Vorteile bringt. Quaternionen vermeiden nicht die kardanische Verriegelung; Euler-Rodrigues-Parametrisierungen tun dies. Nur sehr wenige Computerprogramme, die eine Rotation ausführen, implementieren wahrscheinlich Quaternionstypen, die erstklassige komplexe mathematische Werte sind. Leider scheint irgendwo ein Missverständnis der Rolle von Quaternions durchgesickert zu sein, was dazu geführt hat, dass einige verblüffte Grafikstudenten die Details komplexer Mathematik mit mehreren imaginären Konstanten gelernt haben und dann verblüfft sind, warum dies die Probleme mit der Rotation löst.
quelle
Eine Antwort, die jemand lesen könnte: Es gibt mühsame Probleme mit allen Darstellungen. Quaternionen sind kleiner als Matrizen, aber die Quaternionsmultiplikation ist kein bloßes Vektorpunktprodukt oder dergleichen und benötigt auf einem Computer tatsächlich mehr Zeit als das Punktprodukt zweier 3x3-Matrizen. (Computer können sehr gut mit normalen Matrizen arbeiten)
Matrizen haben jedoch andere nervige Eigenschaften. Zum Beispiel sind sie auf lange Sicht keine stabilen Kreaturen. Bei der Modellierung von Rotationen im 3D-Raum werden normalerweise Rotationen übereinander in einer Orientierungsmatrix akkumuliert, dh nur einer einzelnen Rotationsmatrix, in der die Orientierung eines Referenzrahmens gespeichert wird. Dieser Prozess wird im Verlauf von Millionen von Additionen dazu führen, dass die O-Matrix von einer strengen Rotationsmatrixform abweicht. Dies kann umgangen werden, indem die Matrix regelmäßig neu konfiguriert wird. Es gibt jedoch Bedingungen, unter denen dies nicht trivial ist. Nämlich der Fall der Identitätsmatrix ohne Rotation.
Sie möchten eine Achsenwinkeldarstellung (oder Quaternionsdarstellung) der Drehung finden und dann eine Matrix dafür reproduzieren. Die meisten Algorithmen erzeugen einen Nullvektor und stoßen dann in diesem Fall auf eine Nullteilung. In solchen Fällen ist es im Allgemeinen auch eine schlechte Idee, solche Fälle mit Lösungen vom Typ "wenn 0 dann ..." zu vermeiden, da a) Gabeln langsam sind und b) Sie immer noch Maschinen-Epsilon erhalten können Singularität und am Ende mit schrecklichen Fehlern.
quelle