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?
transformations
es1024
la source
la source
Réponses:
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:
la source
DP3
instruction Intel Haswell GPU ARBfp apparaît implémenté comme 3 multiplications et 2 ajouts, voir laINTEL_DEBUG=fs
sortie 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.(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
Avantages du Quaternion
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 .
la source
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.
la source
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.
la source