Quando os quaternions devem ser usados ​​para representar rotação e dimensionamento em 3D?


13

Os quaternions (uma extensão quadridimensional de números complexos) podem ser usados ​​para representar a rotação e o dimensionamento de um vetor 3D, e a aplicação de um quaternion em um vetor 3D envolve duas multiplicações de quaternion, exigindo menos operações do que multiplicação pela matriz de transformação correspondente. No entanto, matrizes de transformação linear e afim são frequentemente usadas, especialmente no código de sombreador.

Quando é apropriado e preferível (devido à velocidade, estabilidade etc.) usar um quaternion para representar escala e rotação em três dimensões, em vez da matriz de transformação correspondente?


Respostas:


8

Eu quero começar com conceitos errados:

As GPUs modernas (NVIDIA por um bom tempo e AMD desde as Ilhas do Sul) não oferecem suporte significativo às operações de vetores / matrizes nativamente no hardware. São arquiteturas de vetores em uma direção diferente: cada componente de um vetor (x, y, z) geralmente possui valores de 32 ou 64, contendo valores para cada elemento em uma faixa. Portanto, um produto de ponto 3D geralmente não é uma instrução, é uma multiplicação e duas multiplicações.

Além disso, contar operações primitivas como adição múltipla, transformar um vetor por um quaternion é mais caro do que transformar um vetor por uma matriz. Transformar um vetor por uma matriz 3x3 é 3 multiplicações e 6 multiplicações, e transformar um vetor por um quaternion é duas quaternion multiplies, cada uma das quais consiste em 4 multiplicações e 12 multiplicações. (Você pode ser menos ingênuo que isso - aqui está um artigo de maneira mais rápida -, mas ainda não é tão barato quanto multiplicar um vetor por uma matriz.)

No entanto, o desempenho nem sempre é determinado simplesmente contando o número de operações da ALU que ele executa. Quaternions requerem menos espaço que a matriz equivalente (supondo que você esteja fazendo apenas rotação / escala pura), e isso significa menos espaço de armazenamento e menos tráfego de memória. Isso geralmente é importante na animação (que também é conveniente também onde as boas propriedades de interpolação dos quaterniões aparecem).

Fora isso:

  • Matrizes usam mais espaço porque suportam mais operações. Uma matriz 3x3 pode conter escala não uniforme, inclinação, reflexão e projeção ortogonal.
  • Matrizes podem ser naturalmente consideradas como vetores de base e facilmente construídas a partir desses vetores.
  • Multiplicar um quaternion por outro (compondo duas rotações) é menos operações do que multiplicar uma matriz por outra.

Engraçado, e nas DP3instruções da Intel Haswell GPU ARBfp aparecem implementadas como 3 multiplicações e 2 adições, consulte a INTEL_DEBUG=fssaída do driver Intel Linux: paste.ubuntu.com/23150494 . Não tenho certeza se é apenas um driver ruim ou o HW realmente não tem instruções especiais de vetores mul.
Ruslan

@Ruslan Muito provavelmente o hardware simplesmente não possui instruções especiais de vetores mul. Mais precisamente, no entanto, eles fazem , mas eles são vetorizadas em toda a largura SIMD da arquitetura (pistas), não vetorizado em todo o vec3 / vec4 dimensão.
John Calsbeek

4

(Muitas informações foram emprestadas descaradamente das respostas de joojaa e de catraca, com algumas anotações minhas.)

Vantagens da matriz

  • Escala e rotação não uniformes, inclinação, projeção
  • Tradução (a menos que use quaternions duplos)
  • Suporte de hardware nativo
  • Os quaterniões geralmente requerem funções transcendentais para construir
  • Mais fácil de entender

Vantagens do Quaternion

  • Transformar um vetor requer menos operações (ou não - veja a resposta de John)
  • Transformar por outro quat requer muito menos operações
  • Quaternions ocupam 4 carros alegóricos, (8 se for um duplo), mas Matrizes ocupam 9-16 carros alegóricos

Se você sabe que apenas fará transformações uniformes de corpo rígido, um par vetor / quat geralmente é uma vitória sólida em uma matriz 3x4 em termos de espaço de armazenamento (vetor / quat: 7 ou 8 flutuadores vs mat3x4: 12 flutuadores) e velocidade de processamento. Se os Quaternions ainda são um vodu místico para você, tente esta série da web sobre eles .


3

As matrizes oferecem mais transformações possíveis do que os quaternions, é possível inclinar, espelhar e dimensionar de maneira não uniforme a matriz. Não há nada que indique que você não pode fazer com que seu mecanismo faça apenas transformações baseadas em quaternion, se você não precisar dos recursos adicionais de transformação.

Matrizes são muito convenientes quando você precisa criar espaços onde conhece os vetores básicos. Como ao fazer projeções ortográficas. Também é fácil fazer transformações de perspectiva em um espaço de matriz. Matrizes são superiores quando se trata de projetar coisas.

De certa forma, as matrizes geralmente são usadas porque representam a denominação mais comum e não são muito complicadas para dominar e entender. Os benefícios da padronização superam em muito os benefícios obtidos em um fluxo de trabalho personalizado. É conhecido como fazer as operações da matriz. Considerando que os quats não são algo para os quais a introdução imediata seja imediata. Basta perguntar ao redor quantos sabem como inverter um quaternion, enquanto você não encontra muitos estudantes no ensino superior que não sabem como inverter uma matriz.

Observe que as placas gráficas também possuem tubos dedicados para operações de matriz.


Eu realmente estive pensando sobre isso. Também me perguntei que outras abordagens modelam tubos, além das hierarquias de matriz e quat, que se poderia usar.
Joojaa

3

Um quaternion pode representar apenas escala e rotação uniformes, portanto, se você precisar de mais alguma coisa, precisará adicionar algo para representar isso.

A tradução pode ser feita com um único vec3 adicional (ou usando quaternions duplos ). No entanto, a escala e o corte não uniformes são melhor representados por uma esteira4. As transformações de projeção (escala e troca essencialmente não uniformes z e w) não podem ser representadas por um quaternion.

Quaternions têm uma grande vantagem ao interpolar. O slerp é mais facilmente calculado usando quaternions.

A aplicação de um quaternion (ou quaternion duplo) não está embutida na GPU; portanto, você precisará implementá-lo usando as operações de vetor. A maioria das bibliotecas de quatérnions supõe que você não usará o quatérnion para representar escala, então é algo a se observar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.