1 Punkte von GN⁺ 2024-06-16 | 1 Kommentare | Auf WhatsApp teilen
  • 3D-Rotationen haben je nach Darstellung unterschiedliche Stärken; für Punkttransformationen sind Rotationsmatrizen praktisch, aber für Interpolation, Komposition und Mittelwertbildung braucht man separate Werkzeuge
  • Euler-Winkel sind für Menschen leicht handhabbar, können aber zu Gimbal Lock, nicht konstanter Winkelgeschwindigkeit und Problemen bei linearer Interpolation führen, bei denen der kürzeste Pfad verfehlt wird
  • Einheitsquaternionen bieten mit Slerp eine Interpolation entlang des kürzesten Pfads mit konstanter Geschwindigkeit, sind aber kein Vektorraum, sodass direktes Authoring, Skalarmultiplikation und Mittelwertbildung nicht intuitiv sind
  • Exponential-/Logarithmus-Abbildungen verbinden Achse/Winkel-Vektoren mit Rotationsmatrizen und konstruieren eine 2D-/3D-Interpolation entlang des kürzesten Pfads in der Form R(t) = exp(t log(R1 R0^-1)) R0
  • Beim Mittelwert mehrerer Rotationen kann ein einfacher Achse/Winkel-Durchschnitt zu catastrophic cancellation führen; das Karcher-Mittel findet iterativ die Rotation, die die Summe der quadrierten Winkelabstände minimiert, und liefert konsistentere Ergebnisse

Vor- und Nachteile der einzelnen Rotationsdarstellungen

  • Für 3D-Rotationen gibt es mehrere Darstellungen, und je nachdem, ob man transformieren, authoren, interpolieren oder mitteln will, eignet sich eine andere Wahl besser
  • Rotationsmatrizen

    • Die direkteste lineare Algebra-Darstellung ist eine orthonormale 3x3-Matrix mit positiver Determinante
    • Die drei Spalten einer Rotationsmatrix geben an, wohin die x-, y- und z-Achse nach der Rotation verschoben werden
    • Punkttransformationen lassen sich per Matrixmultiplikation ausführen, und auch mit anderen linearen Transformationen kann per Matrixmultiplikation komponiert werden
    • Der Grund, beim Rendern Rotationsmatrizen zu verwenden, ist, dass nur eine einzige Matrixmultiplikation nötig ist, um Punkte vom World Space auf den Bildschirm zu bringen
    • Rotationsmatrizen bilden keinen Vektorraum; selbst wenn man zwei Rotationsmatrizen addiert, erhält man nicht wieder zwingend eine Rotationsmatrix
    • Interpoliert man zwei Rotationsmatrizen linear, kann sich neben Rotation auch Scaling beimischen
  • Euler-Winkel

    • Euler-Winkel spezifizieren drei Rotationen um die x-, y- und z-Achse und werden auch als Pitch, Yaw und Roll bezeichnet
    • Die Anwendungsreihenfolge der drei Teilrotationen hängt von der Konvention ab; im Beispiel wird die Reihenfolge x, y, z verwendet
    • Sie sind für Menschen leicht verständlich und werden häufig zum Authoring von Rotationen verwendet, aber einfache Interpolation kann unerwünschte Ergebnisse erzeugen
    • Gimbal Lock, bei dem durch eine Teilrotation die beiden übrigen Rotationsachsen parallel werden, entspricht einer Singularität
    • An einer Singularität erzeugt eine Änderung eines der beiden blockierten Winkel dieselbe resultierende Rotation wie eine Änderung des anderen
    • Erreicht der Interpolationspfad eine Singularität, steigt die Freiheit bei der Darstellung der aktuellen Lage, und wenn man willkürlich eine Darstellung auswählt und fortsetzt, kann die Ausgabeinterpolation unstetig werden
    • Da die einzelnen Winkel zyklisch sind, wählt lineare Interpolation nicht immer den kürzesten Pfad zwischen zwei Rotationen
    • Wenn der Pfad nicht durch eine Singularität läuft, ist die Interpolation glatt, und wenn man nicht „straight up“ und „straight down“ ausdrücken muss, lassen sich die Grenzen umgehen
  • Quaternionen

    • Einheitsquaternionen werden als Standardwerkzeug für Rotationskomposition und Interpolation verwendet
    • Spherical linear interpolation, also Slerp, wählt den kürzesten Pfad mit konstanter Geschwindigkeit zwischen zwei Quaternionen
    • Auch Einheitsquaternionen bilden keinen Vektorraum; sie sind schwer direkt von Menschen zu authoren, und die Interpolation kann Rechenkosten verursachen
    • Es fehlt außerdem an einem intuitiven Begriff von Skalarmultiplikation oder Mittelwertbildung
    • Quaternionen sind ein Double Cover des Rotationsraums, daher kann Q(1) je nach Fall zu -Q1 gehen
  • Achse/Winkel

    • Eine Achse/Winkel-Rotation wird durch einen reellen 3D-Vektor dargestellt
    • Die Richtung des Vektors gibt die Rotationsachse an, seine Länge den Rotationswinkel um diese Achse
    • Sie wird als θu geschrieben, wobei u ein Einheitsvektor und θ der Rotationswinkel ist
    • Als 3D-Vektor bildet sie einen Vektorraum, sodass Addition, Skalierung und Interpolation möglich sind
    • Interpoliert man zwei Achse/Winkel-Rotationen linear, kann man eine glatte Bewegung mit konstanter Winkelgeschwindigkeit erhalten
    • Allerdings kann lineare Interpolation den kürzesten Pfad verfehlen, je nachdem, in welcher Achse/Winkel-Darstellung die Zielrotation angegeben ist
    • Wie Quaternionen sind auch Achse/Winkel-Vektoren ein Double Cover des Rotationsraums

Exponential- und Logarithmus-Abbildungen

  • Wenn man je nach Zweck zwischen verschiedenen Rotationsdarstellungen wechseln kann, lassen sich die Vorteile der einzelnen Formen kombinieren
  • Für die endgültige Transformation wird eine Rotationsmatrix benötigt, daher wird die Matrix als canonical form verwendet
  • Die Exponentialabbildung ist eine Funktion, die ein Rotationsobjekt entgegennimmt und die äquivalente Rotationsmatrix zurückgibt
  • Die Logarithmusabbildung ist die korrespondierende Funktion, die eine Rotationsmatrix entgegennimmt und wieder in ein Rotationsobjekt zurückführt
  • Hier geht es um die exp- und log-Abbildungen zwischen Rotationsmatrizen und Achse/Winkel-Vektoren

Intuition ausgehend von 2D-Achse/Winkel

  • In 2D gibt es nur eine Rotationsachse, die aus der Ebene heraus zeigt; deshalb lässt sich eine Achse/Winkel-Rotation allein durch den Winkel θ darstellen
  • Ein 2D-Punkt p, der um θ zu rotiert wird, lässt sich wie folgt schreiben
    • pθ = p cosθ + Jp sinθ
    • J ist die Matrix, die einen 2D-Vektor um 90 Grad dreht
  • J ist [[0, -1], [1, 0]], und weil J² = -I gilt, entspricht zweimaliges Anwenden einer Rotation um 180 Grad
  • Entwickelt man diese Gleichung aus, erhält man die Standard-2D-Rotationsmatrix [[cosθ, -sinθ], [sinθ, cosθ]]

2D-Exponentialabbildung und Logarithmusabbildung

  • Wie in Eulers Formel für komplexe Zahlen e^(iθ) = cosθ + i sinθ das i die Rolle einer Vierteldrehung spielt, übernimmt in der 2D-Matrixformel J dieselbe Rolle
  • Setzt man die Matrix A = θJ in die Taylor-Reihe der Exponentialfunktion ein, kann dieselbe Rechnung mit Matrixaddition, -multiplikation und Skalierung durchgeführt werden
  • In der Entwicklung erscheinen die Taylor-Reihen von sinθ und cosθ, und man erhält die folgende Formel
    • e^(θJ) = [[cosθ, -sinθ], [sinθ, cosθ]]
  • Damit wandelt die 2D-Exponentialabbildung einen Winkel θ in die zugehörige Rotationsmatrix um
  • Die Logarithmusabbildung ist als Inverse der Exponentialabbildung definiert
    • Wenn R = exp(θJ) ist, dann ist log(R) = θJ
    • θ lässt sich mit atan2(R21, R11) rekonstruieren
  • Die Exponentialabbildung ist nicht injektiv
    • Da exp(θJ) = exp((θ + 2π)J) gilt, ergibt eine zusätzliche volle Umdrehung dieselbe Rotationsmatrix
    • Die Logarithmusabbildung ist so definiert, dass sie den kleinsten Winkel zurückgibt, der zu dieser Rotationsmatrix gehört
    • atan2 implementiert genau diese Definition

Interpolation auf Basis von exp/log

  • Man kann die beiden 2D-Rotationswinkel θ0 und θ1 einfach linear interpolieren und daraus anschließend eine Rotationsmatrix bilden
  • Wenn θ0 und θ1 aber weiter als π auseinanderliegen, berücksichtigt das die zyklische Natur der Winkel nicht und wählt den langen Pfad
  • Die exp/log-basierte Interpolation berechnet die Bewegungsrotation direkt aus den beiden Rotationsmatrizen R0 und R1
    • R1 R0^-1 ist die Rotation, die zuerst R0 zurücknimmt und dann R1 anwendet
    • log(R1 R0^-1) liefert den kleinsten Winkel vom Zustand R0 nach R1
    • Diese Achse/Winkel-Rotation wird mit t skaliert und anschließend mit exp wieder in eine Matrix umgewandelt
  • Die endgültige Interpolationsformel lautet
    • R(t) = exp(t log(R1 R0^-1)) R0
    • R(0) = R0, R(1) = R1
  • In 2D kann man die Winkeldifferenz zwar direkt prüfen, aber dieses Verfahren verallgemeinert sich ohne Änderungen auf 3D und beliebige Dimensionen

3D-Achse/Winkel und schiefsymmetrische Matrizen

  • Auch in 3D kann man eine Achse/Winkel-Rotation θu exponentieren, um eine Rotationsmatrix zu erhalten
  • Der Kern besteht darin, die Vierteldrehungs-Transformation um die Achse des Einheitsvektors u zu finden
  • Das Kreuzprodukt u × p ist als Vektor definiert, der senkrecht auf der von u und p aufgespannten Ebene steht, kann aber auch als Vierteldrehung der Projektion p⊥ von p auf die zu u senkrechte Ebene interpretiert werden
  • Man kann eine Matrix û konstruieren, die dasselbe Ergebnis wie u × p liefert
    • û = [[0, -uz, uy], [uz, 0, -ux], [-uy, ux, 0]]
    • ûp = u × p
  • Da ûᵀ = -û gilt, ist û eine schiefsymmetrische Matrix
  • Auch J in 2D ist schiefsymmetrisch und repräsentiert das 2D-Kreuzprodukt; dieselbe Struktur setzt sich also fort
  • Summen und Skalarmultiplikationen schiefsymmetrischer Matrizen sind ebenfalls schiefsymmetrisch, sodass die Vektorraum-Eigenschaft der Achse/Winkel-Darstellung auch in dieser Matrixform erhalten bleibt
  • Die Identität û^(k+2) = -û^k ergibt sich aus der geometrischen Interpretation, dass dreimaliges Anwenden des Kreuzprodukts p⊥ dreimal um eine Vierteldrehung rotiert und damit einer negativen Vierteldrehung entspricht

3D-Exponentialabbildung: Rodrigues-Formel

  • Aus einer Achse/Winkel-Rotation θu bildet man θû und exponentiert es, um eine 3D-Rotationsmatrix zu erhalten
  • Mit der Taylor-Reihe und û^(k+2) = -û^k erhält man die folgende Formel
    • e^(θû) = I + sin(θ)û + (1 - cos(θ))û²
  • Diese Gleichung ist als Rodrigues-Formel bekannt
  • Für θ = 0 gilt e^(0û)p = p, der Punkt bleibt also unverändert
  • Für θ = π/2 wird daraus u × p + p∥, also eine Vierteldrehung
  • Für θ = π wird daraus -p⊥ + p∥, also eine Halbdrehung
  • Diese Matrix ist orthonormal
    • Die Bedingung AᵀA = I lässt sich mit ûᵀ = -û und û^(k+2) = -û^k nachweisen
  • Die Determinante ist bei θ = 0 gleich 1, es gibt keinen Fall mit Determinante 0, und da exp bezüglich θ und û stetig ist, kann sie nicht negativ werden
  • Daher ist exp(θû) eine 3D-Rotationsmatrix

3D-Logarithmusabbildung

  • Auch die 3D-Exponentialabbildung ist nicht injektiv, daher ist die 3D-Logarithmusabbildung so definiert, dass sie die Achse/Winkel-Rotation mit dem kleinsten Betrag zurückgibt, die der gegebenen Matrix entspricht
  • Nimmt man bei R = exp(θû) = I + sin(θ)û + (1 - cos(θ))û² die Spur, kann man den Rotationswinkel bestimmen
    • Die Spur ist die Summe der Diagonaleinträge
    • tr(I) = 3
    • Da û schiefsymmetrisch ist, ist seine Diagonalsumme 0
    • tr(û²) = -2
    • Daher gilt tr(R) = 1 + 2cosθ
    • θ = arccos((tr(R) - 1) / 2)
  • Die Rotationsachse wird durch Antisymmetrisierung von R rekonstruiert
    • R - Rᵀ = 2 sin(θ)û
    • û = (R - Rᵀ) / (2 sinθ)
    • u = 1/(2 sinθ) [R32 - R23, R13 - R31, R21 - R12]ᵀ
  • Damit ist die vollständige Logarithmusabbildung zurück von der 3D-Rotationsmatrix zur Achse/Winkel-Darstellung definiert

Ergebnisse der 3D-Interpolation

  • In 3D gilt dieselbe Interpolationsformel wie in 2D unverändert weiter
    • R(t) = exp(t log(R1 R0^-1)) R0
  • Diese Interpolation behält die Vorteile der Achse/Winkel-Rotation bei und wählt immer den kürzesten Pfad
  • Mit Euler-Winkeln kann dasselbe Beispiel unter Umständen nicht glatt aussehen

Mittelwert mehrerer Rotationen

  • Mit Quaternionen kann man bereits gute Interpolation erhalten, sodass sich das Interpolationsproblem auch ohne exp/log-Matrixmathematik lösen lässt
  • Eine Aufgabe, die sich mit Achse/Winkel-Rotationen einfacher erledigen lässt, ist der Mittelwert mehrerer Rotationsmatrizen
  • Der einfachste Ansatz besteht darin, jede Matrix in Achse/Winkel umzuwandeln, die Vektoren zu mitteln und dann zurückzuwandeln
  • Dieser Ansatz funktioniert, kann aber unintuitives Verhalten erzeugen
  • Insbesondere kann beim Addieren von Achse/Winkel-Vektoren catastrophic cancellation auftreten
    • Ein Beispiel ist der Mittelwert von [π, 0, 0] und [-π, 0, 0], der zu 0 wird
    • Die beiden Werte stehen jedoch für dieselbe Rotation, und das Mittel 0 repräsentiert keine der beiden sinnvoll

Karcher-Mittel

  • Den Mittelwert von Punkten in der Ebene kann man als den Punkt auffassen, der die Summe der quadrierten Abstände zu allen Punkten minimiert
  • Das Verfahren, diesen Punkt iterativ per Optimierung zu finden, sieht wie folgt aus
    • Wähle eine Anfangsschätzung x̄ ∈ R²
    • Berechne für jeden Punkt die Translation von der Schätzung zu diesem Punkt als ui = xi - x̄
    • Bilde den Vektormittelwert u = (1/n) Σ ui
    • Bewege x̄ = x̄ + τu in Richtung des Mittelwerts
    • Wiederhole, solange |u| > ε gilt
  • Dieselbe Idee lässt sich auf Rotationen R0, ..., Rn anwenden
    • Wähle eine anfängliche Schätzung R̄ ∈ R^(3×3)
    • Berechne für jede Matrix die Achse/Winkel-Differenz von der Schätzung zu dieser Rotation als ui = log(Ri R̄^-1)
    • Bilde den Vektormittelwert u = (1/n) Σ ui
    • Bewege R̄ = exp(τu) R̄ in Richtung der mittleren Rotation
    • Wiederhole, solange |u| > ε gilt
  • Das Ergebnis dieses Algorithmus ist das Karcher-Mittel
  • Das Karcher-Mittel ist die Rotation, die die Summe der quadrierten Winkelabstände zu allen anderen Rotationen minimiert
  • Es leidet nicht unter catastrophic cancellation und konvergiert daher immer zu einer mittleren Rotation ungleich 0
  • Die Ergebnisse eines einfachen Achse/Winkel-Mittels und des Karcher-Mittels sind oft ähnlich, aber das Karcher-Mittel verhält sich konsistenter

Zusammenhang zwischen Quaternionen und exp/log

  • Dieser Abschnitt setzt Kenntnisse über Quaternionen voraus
  • So wie die Exponentiation komplexer Zahlen der Exponentiation schiefsymmetrischer 2D-Matrizen entspricht, entspricht die Quaternion-Exponentiation der Exponentiation schiefsymmetrischer 3D-Matrizen
  • In 2D erzeugt man aus einer Achse/Winkel-Rotation θ die rein imaginäre komplexe Zahl und exponentiert sie
    • e^(iθ) = cosθ + i sinθ
    • Das Ergebnis ist eine komplexe Zahl, die beim Multiplizieren mit Punkten um θ rotiert
    • Ihre Norm ist immer 1, daher lassen sich 2D-Rotationen als komplexe Zahlen mit Einheitsnorm darstellen
  • In 3D kann man aus dem Achse/Winkel-Rotationsvektor u das rein imaginäre Quaternion q = ux i + uy j + uz k bilden
  • Mithilfe der Quaternion-Multiplikationsregeln erhält man q² = -||q||² = -θ²; das ähnelt der Identität, die bei schiefsymmetrischen Matrizen verwendet wurde
  • Das Ergebnis der Exponentiation lautet
    • e^q = cosθ + (q/θ) sinθ
    • Das ist nahezu dieselbe Formel wie in 2D, nur mit drei imaginären Achsen statt einer
  • Eine 3D-Achse/Winkel-Rotation wird in ein Quaternion mit Einheitsnorm umgewandelt
  • Wenn keine Rotationsmatrix benötigt wird, ist die Quaternion-Exponentialabbildung eine rechnerisch einfache Wahl
  • Auch die Quaternion-Logarithmusabbildung ist einfach
    • θ = arccos(Re(q))
    • u = Im(q) / sinθ
  • Um einen Punkt p mit einem Quaternion q zu rotieren, berechnet man die Konjugation q p q^-1
    • Der Punkt wird als rein imaginäres Quaternion p = px i + py j + pz k dargestellt
    • Technisch rotiert diese Konjugation um um die Achse u; daher setzt man anfangs |u| = θ/2

Weiterführende Lektüre

1 Kommentare

 
GN⁺ 2024-06-16
Hacker-News-Kommentare
  • Die Korrespondenz zwischen Lie-Gruppen und Lie-Algebren ist eines der coolsten Konzepte, von denen ich mir gewünscht hätte, sie in der Schule gelernt zu haben. Es sind die im Artikel erwähnten Exponential- und Logarithmusabbildungen, nur in einer viel besser wiederverwendbaren Form.
    Wenn man ein abstraktes Objekt, das man wie 3D-Rotation behandeln möchte, erfasst, ohne sich in Koordinatendetails zu verstricken, ist das eine Lie-Gruppe; leitet man daraus eine gut funktionierende Koordinatendarstellung ab, erhält man die zugehörige Lie-Algebra.
    Dann bekommt man Methoden, um zwischen Koordinaten und dem abstrakten Objekt hin- und herzuwechseln, sie zu komponieren usw., fast geschenkt; und in Fällen, die in der Praxis häufig vorkommen, lassen sich auch Interpolation und Mittelwerte recht vernünftig behandeln.
    Wenn man ein Problem als Kombination von Lie-Gruppen ausdrücken kann, spart man sich viel Arbeit, die sonst lange dauern würde, indem man herausfindet, was die jeweiligen Algebren sind.
    Die Objekte müssen dabei ein Konzept glatter Veränderung und etwas zusätzliche Struktur haben, und beim Hin und Her können Probleme mit Zusammenhangskomponenten auftreten; aber gerade deshalb kann man gut auf bereits bekannte Resultate zurückgreifen.

  • Eine lange Woche ist fast vorbei, und eine Kuh per Slider zu drehen war genau die Pause, die ich brauchte.

    • Sobald ich lauter Zahlen sah, wurden meine Augen glasig, aber die Kuh war wirklich süß.
    • Fühlt sich an, als wäre das perfekt für ein Low-Effort-iOS-Cashcow-Spiel.
  • Es ist schon lange ein Ärgernis von mir, dass viele 3D-Programme kein Arcball-Interface für Rotation verwenden.
    Autodesk-Produkte wie 3DSmax und Maya tun es, Blender und OpenSCAD aber nicht; und als ich bei Roblox arbeitete, konnte ich die PMs nicht überzeugen, weil die Nutzer auch mit der bestehenden Methode zurechtkamen.
    Arcball basiert auf Quaternionen, verwendet Exponentialfunktionen für die Interpolation, erlaubt jede beliebige Rotation mit einem einzigen Drag, hat kein Gimbal Lock und hat die Eigenschaft, dass man zur Startposition zurückkehrt, wenn man in einer geschlossenen Schleife zieht.
    Das lässt sich mathematisch daraus beweisen, dass Einheitsquaternionen eine doppelte Überlagerung von SO(3) bilden, ähnlich wie Einheitskomplexzahlen Rotationen auf dem Kreis exakt darstellen.
    Eine direkt ausprobierbare Quaternion-/Arcball-Referenzimplementierung: https://romankogan.net/math/arcball_js/index.html
    Der Code ist stark kommentiertes Java und nutzt die Processing-Bibliothek über ProcessingJS in JavaScript.
    Hände und Körper können Quaternionen früher verstehen als das Gehirn; wenn ihr also 3D-Software baut, wäre es schön, wenn ihr diesen Ansatz verwendet.
    Arcball: http://courses.cms.caltech.edu/cs171/assignments/hw3/hw3-not...
    Quaternionen für Rotation: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotati...
    Arcball in Processing: https://romankogan.net/math/arcball_js/index.html

    • Ich frage mich, warum es sich so viel schlechter anfühlt, wenn man nicht in der Mitte, sondern etwa rechts zieht. Es fühlt sich irgendwie hakelig an und springt manchmal; wenn sich der Bezugspunkt für die Rotationsberechnung ändert, sollte diese Bedeutung auf dem Bildschirm visuell sichtbar sein.
    • Ich frage mich, ob man das auch auf Mobilgeräten zum Laufen bringen könnte.
      Ich sehe mir das gerade auf dem Handy an, und https://asliceofrendering.com/camera/2019/11/30/ArcballCamer... hat mir geholfen, Arcball zu verstehen.
  • In diesem Kontext verstehe ich nicht so recht, warum Quaternionen so beliebt sind. Es ist schwer zu behaupten, dass Matrizen weniger intuitiv seien als Quaternionen.
    Matrizen wirken auf Vektoren, und Rotationen wirken ebenfalls auf Vektoren; was könnte also natürlicher sein, als Rotationen als Matrizen zu betrachten?
    Auch die Matrixexponentialfunktion ist intuitiv, wenn man sie mit gewöhnlichen Differentialgleichungen verbindet. Die Lösung von dx/dt = Ax ist exp(t A), und wenn A schiefsymmetrisch ist, steht die Änderung von x immer orthogonal zu x und wird damit zu einer längenerhaltenden Rotation.
    Lie-Gruppen und Lie-Algebren verallgemeinern das stark, aber der Kern ist, dass man kontinuierlich orthogonale Änderungen erzeugt, die Rotationen generieren, und dass die Exponentialabbildung diesen Prozess beschreibt. Dieses Bild wirkt auf mich viel geometrischer und intuitiver.

    • Quaternionen selbst werden oft als Matrizen dargestellt, etwa wie Pauli-Matrizen, und das wird weithin zur Modellierung von Quantenspins genutzt.
      Der Vorteil von Quaternionen liegt meiner Ansicht nach darin, dass sie sich mit Papier und Stift leichter handhaben lassen, als dieselbe Matrixmultiplikation von Hand auszurechnen.
      Persönlich finde ich sie in einem ähnlichen Sinn intuitiv wie komplexe Zahlen. Anfangs waren sie seltsam, aber inzwischen wirken sie einfacher zu verwenden und zu durchdenken als die Alternativen, die ich kenne.
    • Der Artikel hat auch den großen Vorteil von Quaternionen gegenüber Matrizen erklärt. Quaternionen lassen sich gut interpolieren, Matrizen nicht.
      Diese Eigenschaft ist bei Grafikarbeiten wie Animationen oder dem Berechnen von Frames entlang von 3D-Spline-Kurven sehr wichtig.
    • Aus rechnerischer Sicht besteht der Vorteil von Quaternionen darin, dass man statt der 9 Zahlen einer 3x3-Matrix nur 4 Zahlen verwendet und auch beim Anwenden der Rotation ähnlich viele Operationen spart.
    • Der zentrale Vorteil von Quaternionen ist die Komposition von Rotationen.
      Ähnlich wie bei 2D-Rotationen mit komplexen Zahlen: Multipliziert man zwei komplexe Zahlen, werden die Rotationen zusammengesetzt, und in 2D addieren sich dabei die Argumente. Ebenso kann man durch Multiplikation zweier Quaternionen 3D-Rotationen zusammensetzen, und das ist deutlich effizienter als eine 3x3-Matrixmultiplikation.
      Intuitiv gesprochen stehen Quaternionen in enger Beziehung zur Achse-Winkel-Darstellung, die der Lie-Algebra so(3) entspricht.
      Aus der Perspektive der Wirkung auf Vektoren kann man verschiedene Parametrisierungen von Rotationen als Implementierungen derselben abstrakten Rotation-Eigenschaft ansehen. Ob die interne Implementierung nun Matrix, Quaternion, Euler-Vektor, Euler-Winkel oder Gibbs-Vektor ist: Rotationen wirken auf Vektoren und werden auf dieselbe Weise komponiert.
  • Einheitsquaternionen bilden eine Lie-Gruppe; wenn man etwas haben will, das sich beliebig addieren lässt, sollte man sich die Lie-Algebra der vollständigen Quaternionen ansehen, die die Rotationsgeschwindigkeit beschreibt. Das entspricht der Darstellung der Rotationsgeschwindigkeit als Achse-Winkel
    Einheitsquaternionen mit Achse-Winkel zu vergleichen, ist kategorisch leicht schief; passender ist es, Einheitsquaternionen mit Rotationsmatrizen und vollständige Quaternionen mit Achse-Winkel zu vergleichen
    Der Einsatz von Quaternionen hat den Vorteil, dass sich die Exponentialabbildung leicht berechnen lässt; wenn man Quaternionen verwendet, braucht man Rotationsmatrizen aber kaum. Wie im Artikel kann man die Rotation mit pqp^-1 berechnen
    Meiner Ansicht nach ist der einfachste Weg, Quaternionen zu verstehen, sich in geometrische Algebra einzulesen. Es hat Hunderte Jahre gedauert, Quaternionen zu erfinden, aber wenn man die erstaunlich einfache geometrische Algebra versteht, kann man sie in wenigen Minuten neu erfinden
    Ein Artikel, den ich vor ein paar Jahren als gute Einführung gelesen habe: https://crypto.stanford.edu/~blynn/haskell/ga.html

    • Wenn man über Rotationen nachdenkt, halte ich die Exponentialabbildung weiterhin für den robustesten Ansatz. Denn sie ermöglicht es, die Lie-Gruppe SO(3) am direktesten zu behandeln, einschließlich Koordinatenwechseln, Ableitungen und Tangentialräumen
      Auch nach verschiedenen Formalisierungen der geometrischen Algebra landet man letztlich bei Rotoren und Motoren, um SO(3)-/SE(3)-Räume darzustellen; diese sind jeweils isomorph zu Quaternionen und dualen Quaternionen
      Für diesen Zweck halte ich jedoch 3x3-Rotationsmatrizen und 4x4-Transformationsmatrizen zusammen mit der Exponentialabbildung weiterhin für deutlich nützlicher. Quaternionen brauchen weniger Speicher und lassen sich auch schneller miteinander multiplizieren, aber beim Transformieren von Punkten sind Matrizen schneller, und die Gesamteffizienz hängt von der Situation ab
    • Ich frage mich, ob mit „vollständigen Quaternionen“ hier rein imaginäre Quaternionen gemeint waren
  • Eines der coolen Dinge, die ich an der Uni gelernt habe, war, dass man eine Rotationsmatrix einfach in den Zustand eines Kalman-Filters aufnehmen kann, wenn man den Operator + passend für Matrizen und Änderungen in einem Vektorraum und den Operator - passend für zwei Matrizen neu definiert
    So kann man Rotationen schätzen, ohne sich um Gimbal Lock sorgen zu müssen
    https://openslam-org.github.io/MTK

    • Ich frage mich, ob damit gemeint ist, den Tangentialraum von SO(2) als Zustand zu verwenden
    • Den Operator + im Tangentialraum zu implementieren, ist nicht nur bei Kalman-Filtern, sondern auch in der nichtlinearen Optimierung allgemein ziemlich üblich. Die Ceres-Bibliothek unterstützt dafür ebenfalls LocalParameterization
  • Das war wirklich gut, und nicht nur der Teil mit den Kühen
    Besonders gefiel mir, dass diese Methoden am Ende standardmäßige Rotationsmatrizen berechnen. Wenn man eine Million Vektoren rotieren muss, macht man die interessante Berechnung nur einmal und lässt danach eine hochoptimierte Matrixmultiplikations-Pipeline laufen

  • Es war ein toller Blog, aber als ich auf das Profil des Autors klickte und andere Beiträge ansah, las ich den Satz: „Ich bin um 2010 herum, als ich 9 Jahre alt war, erstmals mit Programmieren in Berührung gekommen“
    Ich war 2010 13 und versuchte, mir Mathematik und Naturwissenschaften der Sekundarstufe in den Kopf zu bekommen
    Jedes Mal, wenn ich einen tollen Artikel zu Computergrafik sehe, habe ich das Gefühl, er sei von jemandem geschrieben, der jünger und viel talentierter ist als ich, und bekomme starke Minderwertigkeitsgefühle

    • Es ist noch nicht zu spät. In den letzten Jahren habe ich mir im Selbststudium eine Nischentechnologie angeeignet, und ein großes Unternehmen scheint bereit zu sein, dafür zu bezahlen. Ich bin etwa 35
      Allerdings kann ich nicht gut sagen, wie man das anstellen soll. Ich habe einfach weitergemacht, weil ich es wirklich mochte. Trotzdem scheint auch so etwas wie strukturiertes Üben funktionieren zu können
  • Auf der Suche nach einer Methode, den Durchschnitt mehrerer Rotationen zu berechnen, bin ich auf https://mathweb.ucsd.edu/~sbuss/ResearchWeb/spheremean/paper... gestoßen
    Die Methode in diesem Artikel wirkt zumindest für mein mathematisches Niveau deutlich einfacher als jene in dem Paper

    • Mich interessiert der Kontext, in dem man den Durchschnitt mehrerer Rotationen berechnen möchte
      Ein Durchschnitt ist etwas, das man über Summen machen kann, und bei Summen spielt die Reihenfolge der Zusammensetzung keine Rolle. Rotationen sind jedoch nicht kommutativ, daher lässt sich unser übliches Verständnis von Durchschnitt nicht direkt anwenden
      Wenn man ein Smartphone hält, den Bildschirm um 180° dreht, sodass er von einem wegzeigt, und es dann relativ zum Boden um 90° im Uhrzeigersinn dreht, zeigt die Kamera nach links. Führt man dieselben beiden Rotationen umgekehrt aus, zeigt die Kamera nach rechts
      Es gibt keine eindeutige Antwort darauf, wohin die Kamera beim „Durchschnitt“ dieser beiden Rotationen zeigen sollte; das hängt davon ab, welche Eigenschaften man vom Durchschnitt erwartet
    • Vor ein paar Tagen habe ich einen etwas tangentialen Kommentar zu ebenen Rotationen geschrieben. In der Ebene wird das viel einfacher, besonders wenn die Programmierumgebung Operationen mit komplexen Zahlen als First-Class-Funktion unterstützt
      https://news.ycombinator.com/item?id=40333541
      Die zentrale Intuition ist: Addition ist Translation, Multiplikation ist Rotation. Daher kann man für die durchschnittliche Translation das arithmetische Mittel verwenden und für die durchschnittliche Rotation das geometrische Mittel
  • Es hat lange gedauert, bis mir klar wurde, dass man in der Mathematik Abstraktionen schafft, ähnlich wie man in der Softwareentwicklung über Abstraktion nachdenkt
    Als Kind war ich verwirrt, warum man imaginäre Zahlen einführt und was Matrizen überhaupt bedeuten sollen
    Erst später verstand ich, dass solche Darstellungen entworfen wurden. Wenn man etwas wie imaginäre Zahlen einführt, werden bestimmte Berechnungen einfacher; schreibt man lineare Gleichungen als Matrizen, lässt sich über das Ganze viel leichter nachdenken, als wenn man alles ausschreibt
    Es klingt offensichtlich, aber niemand hat es mir so erklärt

    • Auch beim Studium abstrakterer Mathematik bleibt diese Sichtweise gültig. Eine Gruppe ist zum Beispiel ein Interface, und „eine bestimmte Gruppe“ kann man als Typ betrachten, der eine Operation implementiert, die die drei benötigten Eigenschaften/Methoden erfüllt
      Dasselbe gilt für Vektorräume, Ringe, metrische Räume und Kategorien; die Mathematik ist voll von Interfaces als Entwurfsmustern
      Allerdings ähneln mathematische Interfaces eher Typeclasses als Vererbung in der Programmierung. Denn dieselbe Menge/derselbe Typ kann auf verschiedene Arten eine Gruppe sein