Quando utilizzare i quaternioni per rappresentare la rotazione e il ridimensionamento in 3D?


13

I quaternioni (un'estensione quadridimensionale di numeri complessi) possono essere utilizzati per rappresentare la rotazione e il ridimensionamento di un vettore 3D e l'applicazione di un quaternione su un vettore 3D comporta due moltiplicazioni di quaternioni, richiedendo quindi meno operazioni rispetto alla moltiplicazione della matrice di trasformazione corrispondente. Tuttavia, vengono spesso utilizzate matrici di trasformazione lineare e affine, specialmente nel codice shader.

Quando è appropriato e preferibile (a causa della velocità, stabilità, ecc.) Utilizzare un quaternione per rappresentare il ridimensionamento e la rotazione in tre dimensioni, anziché la matrice di trasformazione corrispondente?


Risposte:


8

Voglio iniziare con idee sbagliate:

Le GPU moderne (NVIDIA da un po 'di tempo e AMD dalle Isole del Sud) non supportano significativamente le operazioni vettoriali / matrice in modo nativo nell'hardware. Sono architetture vettoriali in una direzione diversa: ogni componente di un vettore (x, y, z) ha generalmente un valore di 32 o 64, contenente valori per ciascun elemento in una corsia. Quindi un prodotto a punti 3D di solito non è un'istruzione, è un moltiplicare e due moltiplicare-aggiungere.

Inoltre, il conteggio delle operazioni primitive come la moltiplicazione e l'aggiunta, la trasformazione di un vettore da un quaternione è più costoso della trasformazione di un vettore da una matrice. Trasformare un vettore con una matrice 3x3 equivale a 3 moltiplicazioni e 6 a moltiplicazioni addizionali, e la trasformazione di un vettore da un quaternione è due moltiplicazioni a quaternione, ciascuna delle quali consiste in 4 moltiplicazioni e 12 aggiunte a moltiplicazioni. (Puoi essere meno ingenuo di questo - ecco un writeup in un modo più veloce - ma non è ancora così economico come moltiplicare un vettore per una matrice.)

Tuttavia, le prestazioni non sono sempre determinate semplicemente contando il numero di operazioni ALU che esegue. I quaternioni richiedono meno spazio della matrice equivalente (supponendo che si stia eseguendo solo rotazione / scala pura) e ciò significa meno spazio di archiviazione e meno traffico di memoria. Questo è spesso importante nell'animazione (che è anche convenientemente dove vengono mostrate le belle proprietà di interpolazione dei quaternioni).

Oltre a quello:

  • Le matrici utilizzano più spazio perché supportano più operazioni. Una matrice 3x3 può contenere scala, inclinazione, riflessione e proiezione ortogonale non uniformi.
  • Le matrici possono essere naturalmente pensate come vettori di base e facilmente costruibili da quei vettori.
  • Moltiplicare un quaternione per un altro (comporre due rotazioni) è meno operazioni che moltiplicare una matrice per un'altra.

Divertente, e sulla GPU Intel Haswell l' DP3istruzione ARBfp appare implementata come 3 moltiplicazioni e 2 aggiunte, vedi l' INTEL_DEBUG=fsoutput dal driver Intel Linux: paste.ubuntu.com/23150494 . Non sono sicuro che sia solo un driver scadente o che l'HW non abbia davvero speciali istruzioni mul vettoriali.
Ruslan,

@Ruslan Molto probabilmente quell'hardware non ha istruzioni speciali per il mul vettoriale. In modo più accurato, però, lo fanno , ma sono vettorizzati attraverso la larghezza SIMD dell'architettura (le corsie), non vettorializzati attraverso la dimensione vec3 / vec4.
John Calsbeek,

4

(Molte informazioni qui ho preso spudoratamente in prestito dalle risposte di joojaa e di maniaco del cricchetto, con alcune mie note.)

Vantaggi della matrice

  • Ridimensionamento e rotazione non uniformi, inclinazione, proiezione
  • Traduzione (a meno che non si usi il doppio quaternione)
  • Supporto hardware nativo
  • I quaternioni richiedono spesso funzioni trascendentali da costruire
  • Più facile da capire

Vantaggi di Quaternion

  • La trasformazione di un vettore richiede meno operazioni (oppure no - Vedi la risposta di John)
  • La trasformazione di un altro quat richiede molte meno operazioni
  • I quaternioni occupano 4 carri, (8 se è un doppio), ma le matrici occupano 9-16 carri

Se sai che eseguirai solo trasformazioni del corpo rigide uniformi, una coppia vettore / quat è in genere una solida vittoria su una matrice 3x4 in termini di spazio di archiviazione (vettore / quat: 7 o 8 float vs mat3x4: 12 float) e velocità di elaborazione. Se i quaternioni sono ancora voodoo mistici per te, prova questa serie web su di loro .


3

Le matrici offrono più possibili trasformazioni rispetto ai quaternioni, è possibile inclinare, specchiare e ridimensionare in modo non uniforme la matrice. Non vi è nulla che affermi che non è possibile fare in modo che il proprio motore esegua solo trasformazioni basate su quaternione, se non si necessita delle funzionalità di trasformazione aggiuntive.

Le matrici sono molto utili quando devi costruire spazi in cui conosci i vettori di base. Come quando si fanno proiezioni in ortografia. Anche fare la trasformazione prospettica in uno spazio matrice è facile. Le matrici sono superiori quando si tratta di proiettare cose.

In un certo senso le matrici vengono generalmente utilizzate perché rappresentano la denominazione più comune e non sono troppo complicate per essere padroneggiate e comprese. I vantaggi della standardizzazione superano di gran lunga i vantaggi che si ottengono da un flusso di lavoro personalizzato. È noto come eseguire le operazioni con le matrici. Considerando che i quat non sono qualcosa a cui la maggior parte ottiene un'introduzione immediata in uni. Chiedi semplicemente a quanti sanno come invertire un quaternione, mentre non trovi molti studenti dell'istruzione superiore che non sanno come invertire una matrice.

Si noti che le schede grafiche hanno anche pipe dedicate per le operazioni a matrice.


In realtà ci ho pensato. Ho anche giocato chiedendo quali altri approcci modellano le pipe se non le gerarchie di matrici e quat che si potrebbero usare.
joojaa,

3

Un quaternione può rappresentare solo ridimensionamento e rotazione uniformi, quindi se hai bisogno di qualcos'altro dovresti aggiungere qualcosa per rappresentarlo.

La traduzione può essere fatta con un singolo vec3 aggiuntivo (o usando due quaternioni ). Tuttavia il ridimensionamento e il ridimensionamento non uniformi sono rappresentati meglio da un mat4. Le trasformazioni di proiezione (essenzialmente ridimensionamento non uniforme e scambio di z e w) non possono essere rappresentate da un quaternione.

I quaternioni hanno un grande vantaggio durante l'interpolazione. Lo slerp viene calcolato più facilmente usando i quaternioni.

L'applicazione di un quaternione (o doppio quaternione) non è integrata nella GPU, quindi è necessario implementarlo utilizzando le operazioni vettoriali. La maggior parte delle librerie di quaternioni presume che non utilizzerai il quaternione per rappresentare la scala, quindi è qualcosa da cercare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.