Wann sollten Quaternionen verwendet werden, um Rotation und Skalierung in 3D darzustellen?


13

Quaternionen (eine vierdimensionale Erweiterung komplexer Zahlen) können zur Darstellung der Rotation und Skalierung eines 3D-Vektors verwendet werden. Die Anwendung einer Quaternion auf einen 3D-Vektor erfordert zwei Quaternionenmultiplikationen und erfordert somit weniger Operationen als die Multiplikation mit der entsprechenden Transformationsmatrix. Allerdings werden stattdessen häufig lineare und affine Transformationsmatrizen verwendet, insbesondere in Shader-Code.

Wann ist es angemessen und aus Gründen der Geschwindigkeit, Stabilität usw. vorzuziehen, anstelle der entsprechenden Transformationsmatrix ein Quaternion zu verwenden, um Skalierung und Drehung in drei Dimensionen darzustellen?


Antworten:


8

Ich möchte mit falschen Vorstellungen beginnen:

Moderne GPUs (NVIDIA seit geraumer Zeit und AMD seit Southern Islands) unterstützen Vektor- / Matrixoperationen in Hardware nicht sinnvoll. Sie sind Vektorarchitekturen in einer anderen Richtung: Jede Komponente eines Vektors (x, y, z) hat im Allgemeinen 32- oder 64-Werte und enthält Werte für jedes Element in einer Spur. Ein 3D-Punktprodukt ist also normalerweise keine Anweisung, sondern eine Multiplikation und zwei Multiplikationsadditionen.

Darüber hinaus ist das Zählen primitiver Operationen wie Multiplizieren-Addieren und Transformieren eines Vektors mit einer Quaternion teurer als das Transformieren eines Vektors mit einer Matrix. Die Transformation eines Vektors mit einer 3 × 3-Matrix besteht aus 3 Multiplikationen und 6 Multiplikationsadditionen, und die Transformation eines Vektors mit einer Quaternion besteht aus zwei Quaternionsmultiplikationen, von denen jede aus 4 Multiplikationen und 12 Multiplikationsadditionen besteht. (Sie können weniger naiv sein - hier ist eine schnellere Beschreibung - , aber es ist immer noch nicht so billig wie das Multiplizieren eines Vektors mit einer Matrix.)

Die Leistung wird jedoch nicht immer einfach durch Zählen der Anzahl der durchgeführten ALU-Operationen bestimmt. Quaternionen benötigen weniger Speicherplatz als die entsprechende Matrix (vorausgesetzt, Sie machen nur reine Rotation / Skalierung), und das bedeutet weniger Speicherplatz und weniger Speicherverkehr. Dies ist in der Animation oft wichtig (was auch häufig der Fall ist, wenn sich die guten Interpolationseigenschaften von Quaternionen zeigen).

Ansonsten:

  • Matrizen benötigen mehr Platz, weil sie mehr Operationen unterstützen. Eine 3x3-Matrix kann eine ungleichmäßige Skalierung, eine ungleichmäßige Neigung, eine ungleichmäßige Reflexion und eine ungleichmäßige orthogonale Projektion enthalten.
  • Matrizen können natürlich als Basisvektoren angesehen und leicht aus diesen Vektoren konstruiert werden.
  • Das Multiplizieren einer Quaternion mit einer anderen (Zusammensetzen von zwei Umdrehungen) ist weniger als das Multiplizieren einer Matrix mit einer anderen.

Witzig und auf Intel Haswell GPU erscheint die DP3Anweisung von ARBfp als 3 Multiplikationen und 2 Additionen implementiert, siehe INTEL_DEBUG=fsAusgabe des Intel Linux-Treibers: paste.ubuntu.com/23150494 . Ich bin mir nicht sicher, ob es sich nur um einen schlechten Fahrer handelt oder ob der HW wirklich keine speziellen Vektor-Mul-Anweisungen hat.
Ruslan

@ Ruslan Sehr wahrscheinlich hat die Hardware keine speziellen Vektor-Mul-Befehle. Genauer gesagt, aber sie tun , aber sie über die SIMD Breite der Architektur (die Bahnen) vektorisiert werden, nicht über die vec3 / vec4 Dimension vektorisiert.
John Calsbeek

4

(Viele Informationen hier, die ich schamlos von Joojaas und Ratschenfreaks Antworten geborgt habe, mit einigen eigenen Notizen.)

Matrix Vorteile

  • Uneinheitliche Skalierung und Drehung, Schrägstellung, Projektion
  • Übersetzung (sofern keine dualen Quaternionen verwendet werden)
  • Native Hardware-Unterstützung
  • Für die Konstruktion von Quaternionen sind häufig transzendentale Funktionen erforderlich
  • Leichter zu verstehen

Quaternion Vorteile

  • Das Transformieren eines Vektors erfordert weniger Operationen (oder nicht - siehe Johns Antwort)
  • Die Transformation durch ein anderes Quat erfordert viel weniger Operationen
  • Quaternionen belegen 4 Floats (8, wenn es ein Dual ist), aber Matrizen belegen 9-16 Floats

Wenn Sie wissen, dass Sie nur einheitliche Starrkörper-Transformationen durchführen, ist ein Vektor / Quat-Paar normalerweise ein solider Gewinn für eine 3x4-Matrix in Bezug auf den Speicherplatz (Vektor / Quat: 7 oder 8 Floats vs. Mat3x4: 12 Floats). und Verarbeitungsgeschwindigkeit. Wenn Quaternions für Sie immer noch mystisches Voodoo sind, probieren Sie diese Web-Serie aus .


3

Matrizen bieten mehr mögliche Transformationen als Quaternionen. Sie können die Matrix verzerren, spiegeln und ungleichmäßig skalieren. Es gibt nichts, was besagt, dass Sie Ihre Engine nicht dazu bringen können, nur quaternionsbasierte Transformationen durchzuführen, wenn Sie keine zusätzlichen Transformationsfunktionen benötigen.

Matrizen sind sehr praktisch, wenn Sie Räume erstellen müssen, in denen Sie die Basisvektoren kennen. Zum Beispiel bei Projektionen in die Orthographie. Auch die Perspektiventransformation in einem Matrixraum ist einfach. Matrizen sind überlegen, wenn es darum geht, Dinge zu projizieren.

In gewisser Weise werden Matrizen normalerweise verwendet, weil sie die häufigste Bezeichnung darstellen und nicht zu kompliziert zu beherrschen und zu verstehen sind. Die Vorteile der Standardisierung überwiegen bei weitem die Vorteile eines benutzerdefinierten Workflows. Es ist bekannt, wie man die Matrixoperationen ausführt. Während Quats sind nicht etwas, was die meisten sofort in uni bekommen. Fragen Sie einfach, wie viele wissen, wie man eine Quaternion invertiert, während Sie nicht viele Studenten im Hochschulbereich finden, die nicht wissen, wie man eine Matrix invertiert.

Beachten Sie, dass Grafikkarten auch dedizierte Pipes für Matrixoperationen haben.


Ich habe tatsächlich darüber nachgedacht. Ich habe auch darüber nachgedacht, welche anderen Ansätze zur Modellierung von Pipes als Matrix- und Quat-Hierarchien verwendet werden könnten.
Joojaa

3

Eine Quaternion kann nur eine einheitliche Skalierung und Rotation darstellen. Wenn Sie also etwas anderes benötigen, müssen Sie etwas hinzufügen, um dies darzustellen.

Die Übersetzung kann mit einem einzigen zusätzlichen vec3 (oder mit zwei Quaternionen ) erfolgen. Eine ungleichmäßige Skalierung und Scherung wird jedoch besser durch eine Matte dargestellt4. Projektionstransformationen (im Wesentlichen ungleichmäßiges Skalieren und Vertauschen von z und w) können nicht durch eine Quaternion dargestellt werden.

Quaternionen haben beim Interpolieren einen großen Vorteil. Der Slerp wird am einfachsten mit Quaternionen berechnet.

Das Anwenden einer Quaternion (oder einer doppelten Quaternion) ist nicht in die GPU integriert, sodass Sie diese mithilfe der Vektoroperationen implementieren müssen. Die meisten Quaternion-Bibliotheken gehen davon aus, dass Sie das Quaternion nicht zur Darstellung des Maßstabs verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.