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?
transformations
es1024
fonte
fonte
Respostas:
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:
fonte
DP3
instruções da Intel Haswell GPU ARBfp aparecem implementadas como 3 multiplicações e 2 adições, consulte aINTEL_DEBUG=fs
saí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.(Muitas informações foram emprestadas descaradamente das respostas de joojaa e de catraca, com algumas anotações minhas.)
Vantagens da matriz
Vantagens do Quaternion
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 .
fonte
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.
fonte
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.
fonte