Je suis physicien, j'ai appris la programmation et j'ai rencontré beaucoup de gens utilisant des quaternions pour les rotations au lieu d'écrire des choses sous forme de matrice / vecteur.
En physique, il y a de très bonnes raisons pour lesquelles nous n'utilisons pas les quaternions (malgré l'histoire bizarre qui est parfois racontée à propos de Hamilton / Gibbs / etc.). La physique exige que nos descriptions aient un bon comportement analytique (cela a une signification précisément définie, mais de certaines manières plutôt techniques qui vont bien au-delà de ce qui est enseigné dans les classes d'introduction normales, donc je n'entrerai pas dans les détails). Il s'avère que les quaternions n'ont pas ce comportement agréable, et donc ils ne sont pas utiles, et les vecteurs / matrices en ont, donc nous les utilisons.
Cependant, restreintes aux rotations rigides et aux descriptions qui n'utilisent aucune structure analytique, les rotations 3D peuvent être décrites de manière équivalente dans les deux sens (ou de quelques autres manières).
Généralement, nous voulons juste une application d'un point X = (x, y, z) à un nouveau point X '= (x', y ', z') soumis à la contrainte que X 2 = X ' 2 . Et il y a beaucoup de choses qui font cela.
La manière naïve est de simplement dessiner les triangles que cela définit et d'utiliser la trigonométrie, ou d'utiliser l'isomorphisme entre un point (x, y, z) et un vecteur (x, y, z) et la fonction f (X) = X 'et une matrice MX = X ', ou en utilisant des quaternions, ou en projetant des composants de l'ancien vecteur le long du nouveau en utilisant une autre méthode (x, y, z) T. (a, b, c) (x', y ', z '), etc.
D'un point de vue mathématique, ces descriptions sont toutes équivalentes dans ce cadre (en tant que théorème). Ils ont tous le même nombre de degrés de liberté, le même nombre de contraintes, etc.
Alors pourquoi les quaternions semblent-ils préférés aux vecteurs?
Les raisons habituelles que je vois sont l'absence de verrouillage de la nacelle ou des problèmes numériques.
L'argument sans gimbal lock semble étrange, car il ne s'agit que d'un problème d'angles d'euler. Ce n'est également qu'un problème de coordonnées (tout comme la singularité à r = 0 en coordonnées polaires (le jacobien perd son rang)), ce qui signifie que ce n'est qu'un problème local, et peut être résolu en changeant de coordonnées, en tournant hors de la dégénérescence, ou en utilisant deux systèmes de coordonnées qui se chevauchent.
Je suis moins sûr des problèmes numériques, car je ne sais pas en détail comment ces deux (et toutes les alternatives) seraient implémentés. J'ai lu que la normalisation d'un quaternion est plus facile que de le faire pour une matrice de rotation, mais ce n'est vrai que pour une matrice générale; une rotation a des contraintes supplémentaires qui banalisent cela (qui sont intégrées dans la définition des quaternions) (en fait, cela doit être vrai puisqu'ils ont le même nombre de degrés de liberté).
Alors, quelle est la raison de l'utilisation de quaternions sur des vecteurs ou d'autres alternatives?
Réponses:
Le verrouillage du cardan est une des raisons, bien que, comme vous le dites, ce n'est qu'un problème avec les angles d'Euler et qu'il soit facilement résolu. Les angles d'Euler sont toujours utilisés lorsque la mémoire est un problème car vous n'avez besoin de stocker que 3 nombres.
Pour les quaternions par rapport à une matrice de rotation 3x3, le quaternion a l'avantage en taille (4 scalaires contre 9) et en vitesse (la multiplication de quaternions est beaucoup plus rapide que la multiplication de matrice 3x3).
Notez que toutes ces représentations des rotations sont utilisées dans la pratique. Les angles d'Euler utilisent le moins de mémoire; les matrices utilisent plus de mémoire mais ne souffrent pas du verrouillage du cardan et ont de bonnes propriétés analytiques; et les quaternions offrent un bel équilibre entre les deux, étant légers, mais sans verrouillage de cardan.
la source
Eh bien, je suis aussi physicien. Et il y a des situations où les quaternions basculent tout simplement! Harmoniques sphériques par exemple. Vous avez deux atomes qui se diffusent, échangent un électron: qu'est-ce que le transfert de spin orbital? Avec les quaternions, il s'agit simplement d'une multiplication, c'est-à-dire de la somme des exposants des fonctions de base SH exprimées en quaternions. (Cependant, mettre les polynômes de Legendre en notation quaternion est un peu fastidieux).
Mais je suis d'accord, ils ne sont pas un outil universel, et surtout dans la mécanique des corps rigides, ils seraient très lourds à utiliser. Pourtant, pour citer Bertrand Russell, répondez à la question d'un élève combien un physicien doit savoir en mathématiques: "Autant que possible!"
Quoi qu'il en soit: pourquoi aimons-nous les quaternions en infographie? Parce qu'ils ont un certain nombre de propriétés attrayantes. Tout d'abord, on peut bien les interpoler, ce qui est important si l'on anime des choses en rotation, comme les membres autour d'une articulation. Avec un quaternion, ce n'est qu'une multiplication et une normalisation scalaires. L'exprimer avec une matrice nécessite l'évaluation de sin et cos, puis la construction d'une matrice de rotation. Alors multiplier un vecteur par un quaternion est encore moins cher que de passer par une multiplication vectorielle-matrice complète, c'est aussi encore moins cher si on ajoute une traduction par la suite. Si vous considérez un système d'animation squelettique pour un personnage humain, où l'on doit évaluer beaucoup de translation / rotation pour un grand nombre de sommets, cela a un impact énorme.
Un autre effet secondaire intéressant de l'utilisation de quaternions est que toute transformation est intrinsèquement orthonormée. Avec les matrices de traduction, il faut réorthonormaliser chaque couple d'étapes d'animation, en raison d'erreurs d'arrondi numérique.
la source
De nombreuses applications 3D comme l'utilisation des angles d'Euler pour définir l'orientation d'un objet. Pour les simulateurs de vol en particulier, ils représentent un moyen théoriquement utile de stocker l'orientation d'une manière facilement modifiable.
Vous devez également être conscient que des choses comme «changer de coordonnées, sortir de la dégénérescence ou utiliser deux systèmes de coordonnées qui se chevauchent» nécessitent tous des efforts. L'effort signifie le code. Et le code est synonyme de performance. Perdre des performances lorsque vous n'avez pas à le faire n'est pas une bonne chose pour de nombreuses applications 3D. Après tout, quels sont les avantages de toutes ces astuces, si le simple fait d'utiliser des quaternions vous procurait tout ce dont vous aviez besoin.
Les problèmes numériques surviennent lors du traitement de plusieurs rotations consécutives d'une orientation. Imaginez que vous avez un objet dans l'espace. Et à chaque tranche de temps, vous lui appliquez un petit changement de lacet. Après chaque changement, vous devez re-normaliser l'orientation; sinon, des problèmes de précision vont s'infiltrer et tout gâcher.
Si vous utilisez des matrices, chaque fois que vous effectuez une multiplication matricielle, vous devez réorthonormaliser la matrice. La matrice que vous orthonormalisez n'est pas encore une matrice de rotation, donc je ne serais pas trop sûr de cette orthonormalisation facile. Cependant, je peux en être sûr:
Ce ne sera pas aussi rapide qu'une normalisation vectorielle 4D. C'est ce que les quaternions utilisent pour normaliser après des rotations successives.
La normalisation quaternion est bon marché. Même la normalisation spécialisée de la matrice de rotation ne sera pas aussi bon marché. Encore une fois, la performance compte.
Il y a aussi un autre problème que les matrices ne font pas facilement: l'interpolation entre deux orientations différentes.
Lorsqu'il s'agit d'un personnage 3D, vous avez souvent une série de transformations définissant l'emplacement de chaque os dans le personnage. Cette hiérarchie d'os représente le personnage dans une pose particulière.
Dans la plupart des systèmes d'animation, pour calculer la pose d'un personnage à un moment donné, on interpole entre les transformations. Cela nécessite d'interpoler les transformations correspondantes.
Interpoler deux matrices est ... non trivial. Au moins, c'est si vous voulez quelque chose qui ressemble à une matrice de rotation à la fin. Après tout, le but de l'interpolation est de produire quelque chose à mi-chemin entre les deux transformations.
Pour les quaternions, tout ce dont vous avez besoin est un lerp 4D suivi d'une normalisation. C'est tout: prenez deux quaternions et interpolez linéairement les composants. Normalisez le résultat.
Si vous voulez une interpolation de meilleure qualité (et parfois vous le faites), vous pouvez faire ressortir la lerp sphérique . Cela permet à l'interpolation de mieux se comporter pour des orientations plus disparates. Ce calcul est beaucoup plus difficile et nécessite plus d'opérations pour les matrices que pour les quaternions.
la source
Avis: Les quaternions sont sympas.
Matrice de rotation: inconvénient mineur : la multiplication des matrices est ~ 2 fois plus lente que les quaternions. Avantage mineur : la multiplication matrice-vecteur est ~ 2 fois plus rapide et grande. Énorme inconvénient : la normalisation! Ghram-Shmit est asymétrique, ce qui ne donne pas de réponse précise d'ordre supérieur lors de la réalisation d'équations différentielles. Les méthodes plus sophistiquées sont très complexes et coûteuses.
Axe (angle = longueur de l'axe) Avantage mineur : petit. Désavantage modéré : la multiplication et l'application à un vecteur sont lentes avec trig. Inconvénient modéré : singularité du pôle Nord à longueur = 2 * pi, car toutes les directions des axes ne font rien. Plus de code (et de débogage) pour le redimensionner automatiquement lorsqu'il s'approche de 2pi.
la source
Nous ne absolument pas seulement voulons que. Il y a une subtilité très importante qui manque à beaucoup de gens . La construction dont vous parlez (dessinez les triangles et utilisez trig, etc.) fera correctement pivoter un vecteur dans l'autre. Mais il y a une infinité de rotations qui feront cela. En particulier, je peux venir après avoir fait votre rotation, puis faire pivoter tout le système autour du vecteur X '. Cela ne changera pas du tout la position de X '. La combinaison de votre rotation et de la mienne équivaut à une autre rotation unique (puisque les rotations forment un groupe ). En général, vous devez être en mesure de représenter une telle rotation.
Il s'avère que vous pouvez le faire avec juste un vecteur. (C'est la représentation axe-angle des rotations .) Mais combiner les rotations dans la représentation axe-angle est difficile. Les quaternions facilitent les choses, ainsi que beaucoup d'autres choses. Fondamentalement, les quaternions ont tous les avantages des autres représentations, et aucun des inconvénients. (Bien que j'admette qu'il peut y avoir des applications spécifiques pour lesquelles une autre représentation peut être meilleure.)
la source
Et ce sont de bonnes raisons.
Comme vous semblez déjà le comprendre, les quaternions codent une seule rotation autour d'un axe arbitraire par opposition à trois rotations séquentielles dans l'espace d'Euler 3. Cela rend les quaternions immunisés contre le verrouillage du cardan .
De plus, certaines formes d'interpolation deviennent agréables et faciles à faire, comme SLERP .
Du point de vue des performances, pourquoi votre solution est-elle meilleure?
Je pourrais continuer, mais les quaternions ne sont qu'un outil possible à utiliser. S'ils ne correspondent pas à vos besoins, ne les utilisez pas.
la source
Il convient de garder à l'esprit que toutes les propriétés liées à la rotation ne sont pas vraiment des propriétés des Quaternions: ce sont des propriétés des paramétrisations d' Euler-Rodrigues , qui est la structure à 4 éléments utilisée pour décrire une rotation 3D.
Leur relation aux Quaternions est purement due à un article de Cayley, «Sur certains résultats liés aux Quaternions», où l'auteur observe la corrélation entre la multiplication des Quaternions et la combinaison des paramétrisations d'Euler-Rodrigues. Cela a permis d'appliquer des aspects de la théorie du Quaternion à la représentation des rotations et surtout à l'interpolation entre elles.
Vous pouvez lire l'article ici: https://archive.org/details/collmathpapers01caylrich . Mais à l'époque, il n'y avait aucun lien entre les Quaternions et la rotation et Cayley fut plutôt surpris de constater qu'il y avait:
Cependant, il n'y a rien d'intrinsèque dans les Quaternions qui donne un avantage à la rotation. Les quaternions n'évitent pas le verrouillage de la nacelle; Les paramétrisations d'Euler-Rodrigues le font. Très peu de programmes informatiques qui effectuent une rotation sont susceptibles d'implémenter réellement des types Quaternion qui sont des valeurs mathématiques complexes de première classe. Malheureusement, un malentendu sur le rôle des Quaternions semble avoir fui quelque part, ce qui a amené de nombreux étudiants en graphisme déconcertés à apprendre les détails de mathématiques complexes avec plusieurs constantes imaginaires, puis à se demander pourquoi cela résout les problèmes de rotation.
la source
Une réponse que quelqu'un pourrait lire: Il y a des problèmes fastidieux avec toutes les représentations. Les quaternions sont plus petits que les matrices mais la multiplication des quaternions n'est pas un simple produit scalaire vectoriel ou autre, et prend en fait plus de temps sur un ordinateur que le produit scalaire de deux matrices 3x3. (Les ordinateurs fonctionnent très bien avec des matrices ordinaires)
Les matrices ont cependant d'autres fonctionnalités ennuyeuses. Par exemple, ce ne sont pas des créatures stables à long terme. Lors de la modélisation des rotations dans l'espace 3D, on accumule généralement les rotations les unes sur les autres dans une matrice d'orientation, c'est-à-dire juste une matrice de rotation unique stockant l'orientation d'un cadre de référence. Ce processus, au cours de millions d'ajouts, fera diverger la matrice O d'une forme de matrice de rotation stricte. Cela peut être contourné en reconfigurant périodiquement la matrice, mais il existe des conditions dans lesquelles ce n'est pas trivial. À savoir le cas sans rotation de la matrice d'identité.
Vous voudrez trouver une représentation axe-angle (ou représentation quaternion) de la rotation, puis reproduire une matrice pour cela. La plupart des algorithmes produisent un vecteur nul, puis rencontrent une division nulle dans ce cas. Dans ces types de cas, il est également généralement une mauvaise idée d'essayer d'éviter de tels cas avec des solutions de type "si 0 alors ...", car a) les fourches sont lentes et b) vous pouvez toujours finir par machine epsilon en dehors de singularité et se retrouvent avec des erreurs horribles.
la source