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?
transformations
es1024
quelle
quelle
Antworten:
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:
quelle
DP3
Anweisung von ARBfp als 3 Multiplikationen und 2 Additionen implementiert, sieheINTEL_DEBUG=fs
Ausgabe 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.(Viele Informationen hier, die ich schamlos von Joojaas und Ratschenfreaks Antworten geborgt habe, mit einigen eigenen Notizen.)
Matrix Vorteile
Quaternion Vorteile
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 .
quelle
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.
quelle
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.
quelle