Quand faut-il utiliser des quaternions pour représenter la rotation et la mise à l'échelle en 3D?


13

Les quaternions (une extension à quatre dimensions de nombres complexes) peuvent être utilisés pour représenter la rotation et l'échelle d'un vecteur 3D, et l'application d'un quaternion sur un vecteur 3D implique deux multiplications de quaternion, nécessitant ainsi moins d'opérations que la multiplication par la matrice de transformation correspondante. Cependant, des matrices de transformation linéaire et affine sont souvent utilisées à la place, en particulier dans le code de shader.

Quand est-il approprié et préférable (en raison de la vitesse, de la stabilité, etc.) d'utiliser un quaternion pour représenter la mise à l'échelle et la rotation en trois dimensions, au lieu de la matrice de transformation correspondante?


Réponses:


8

Je veux commencer par des idées fausses:

Les GPU modernes (NVIDIA pendant un certain temps et AMD depuis les îles du Sud) ne prennent pas en charge de manière significative les opérations vectorielles / matricielles en mode natif. Ce sont des architectures vectorielles dans une direction différente: chaque composante d'un vecteur (x, y, z) a généralement une valeur de 32 ou 64, contenant des valeurs pour chaque élément d'une voie. Donc, un produit scalaire 3D n'est généralement pas une instruction, c'est une multiplication et deux multiplications.

De plus, le comptage d'opérations primitives comme la multiplication-addition, la transformation d'un vecteur par un quaternion est plus cher que la transformation d'un vecteur par une matrice. La transformation d'un vecteur par une matrice 3x3 est de 3 multiplications et 6 multiplications-ajouts, et la transformation d'un vecteur par un quaternion est de deux multiplications de quaternions, chacune consistant en 4 multiplications et 12 multiplications-ajouts. (Vous pouvez devenir moins naïf que cela - voici un résumé plus rapide - mais ce n'est toujours pas aussi bon marché que de multiplier un vecteur par une matrice.)

Cependant, les performances ne sont pas toujours déterminées simplement en comptant le nombre d'opérations ALU qu'elle effectue. Les quaternions nécessitent moins d'espace que la matrice équivalente (en supposant que vous ne faites que de la rotation / échelle pure), ce qui signifie moins d'espace de stockage et moins de trafic mémoire. Ceci est souvent important dans l'animation (ce qui est également pratique lorsque les belles propriétés d'interpolation des quaternions apparaissent).

Autre que ça:

  • Les matrices utilisent plus d'espace car elles prennent en charge plus d'opérations. Une matrice 3x3 peut contenir une échelle non uniforme, une asymétrie, une réflexion et une projection orthogonale.
  • Les matrices peuvent naturellement être considérées comme des vecteurs de base et facilement construites à partir de ces vecteurs.
  • Multiplier un quaternion par un autre (composer deux rotations) est moins d'opérations que multiplier une matrice par une autre.

Drôle, et sur l' DP3instruction Intel Haswell GPU ARBfp apparaît implémenté comme 3 multiplications et 2 ajouts, voir la INTEL_DEBUG=fssortie du pilote Intel Linux: paste.ubuntu.com/23150494 . Je ne sais pas si c'est juste un mauvais pilote ou si le HW n'a vraiment pas d'instructions spéciales de mulage vectoriel.
Ruslan

@Ruslan Très probablement, le matériel n'a tout simplement pas d'instructions spéciales pour le vecteur vectoriel. Plus précisément, cependant, ils le font , mais ils sont vectorisés sur la largeur SIMD de l'architecture (les voies), pas vectorisés sur la dimension vec3 / vec4.
John Calsbeek

4

(Beaucoup d'informations ici, j'ai emprunté sans vergogne aux réponses de joojaa et de ratchet freak, avec quelques notes personnelles.)

Avantages de la matrice

  • Echelle et rotation non uniformes, biais, projection
  • Traduction (à moins d'utiliser des quaternions doubles)
  • Prise en charge matérielle native
  • Les quaternions nécessitent souvent des fonctions transcendantales pour se construire
  • Plus facile à comprendre

Avantages du Quaternion

  • La transformation d'un vecteur nécessite moins d'opérations (ou pas - voir la réponse de John)
  • La transformation par un autre quatuor nécessite beaucoup moins d'opérations
  • Les quaternions occupent 4 flotteurs (8 s'il s'agit d'un double) mais les matrices occupent 9-16 flotteurs

Si vous savez que vous ne ferez que des transformations de corps rigides uniformes, une paire vecteur / quat est généralement une solide victoire sur une matrice 3x4 en termes d'espace de stockage (vecteur / quat: 7 ou 8 flotteurs vs mat3x4: 12 flotteurs) et la vitesse de traitement. Si les Quaternions sont encore du vaudou mystique pour vous, essayez cette web série sur eux .


3

Les matrices offrent plus de transformations possibles que les quaternions, il est possible de biaiser, de mettre en miroir et de mettre à l'échelle de manière non uniforme la matrice. Il n'y a rien qui stipule que vous ne pouvez pas faire que votre moteur ne fasse que des transformations à base de quaternion, si vous n'avez pas besoin des fonctionnalités de transformation supplémentaires.

Les matrices sont tout simplement très pratiques lorsque vous devez créer des espaces où vous connaissez les vecteurs de base. Comme lors de projections orthographiques. Il est également facile de transformer la perspective dans un espace matriciel. Les matrices sont supérieures quand il s'agit de projeter des trucs.

D'une certaine manière, les matrices sont généralement utilisées car elles représentent la dénomination la plus courante et ne sont pas trop compliquées à maîtriser et à comprendre. Les avantages de la normalisation l'emportent largement sur les avantages que vous obtenez d'un flux de travail personnalisé. Il est bien connu de faire les opérations matricielles. Alors que les quats ne sont pas quelque chose que la plupart obtiennent immédiatement une introduction à uni. Demandez-vous simplement combien savent inverser un quaternion, alors que vous ne trouvez pas beaucoup d'étudiants dans l'enseignement supérieur qui ne savent pas comment inverser une matrice.

Notez que les cartes graphiques ont également des canaux dédiés pour les opérations matricielles.


J'ai réfléchi à ça. Ive a également tenté de demander quelles autres approches de modélisation des tuyaux que les hiérarchies matricielles et quaternaires pouvaient être utilisées.
joojaa

3

Un quaternion ne peut représenter qu'une mise à l'échelle et une rotation uniformes, donc si vous avez besoin d'autre chose, vous devrez ajouter quelque chose pour représenter cela.

La traduction peut être effectuée avec un seul vec3 supplémentaire (ou en utilisant des quaternions doubles ). Cependant, le détartrage et la voilure non uniformes sont mieux représentés par un mat4. Les transformées de projection (mise à l'échelle et échange z et w essentiellement non uniformes) ne peuvent pas être représentées par un quaternion.

Les quaternions ont un avantage majeur lors de l'interpolation. Le slerp est plus facilement calculé en utilisant des quaternions.

L'application d'un quaternion (ou double quaternion) n'est pas intégrée au GPU, vous devez donc l'implémenter à l'aide des opérations vectorielles. La plupart des bibliothèques quaternion supposent que vous n'utiliserez pas le quaternion pour représenter l'échelle, c'est donc quelque chose à surveiller.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.