web-dev-qa-db-fra.com

Pourquoi les quaternions sont-ils utilisés pour les rotations?

Je suis physicien, j'ai appris la programmation et j'ai rencontré beaucoup de gens utilisant des quaternions pour des rotations au lieu d'écrire des choses sous forme matricielle/vectorielle.

En physique, il y a de très bonnes raisons pour lesquelles nous n'utilisons pas de 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 d'une manière plutôt technique qui va 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 de Nice, 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 dans quelques autres façons).

Généralement, nous voulons juste une mise en correspondance d'un point X = (x, y, z) avec un nouveau point X '= (x', y ', z') soumis à la contrainte que X2 = X '2. Et il y a beaucoup de choses qui font ça.

La manière naïve consiste à simplement dessiner les triangles définis et à utiliser la trigonométrie, ou à 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 contexte (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 ne sont pas des verrous de cardan ou des problèmes numériques.

L'argument de verrouillage sans cardan semble étrange, car ce n'est qu'un problème d'angles euler. Ce n'est aussi 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 mis en œuvre. J'ai lu qu'il est plus facile de normaliser un quaternion que de le faire pour une matrice de rotation, mais cela 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 car elles 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?

97
JMP

Le verrouillage du cardan est une des raisons, même si, comme vous le dites, ce n'est qu'un problème avec les angles d'Euler et il est facilement résoluble. Les angles d'Euler sont toujours utilisés lorsque la mémoire est un problème car il vous suffit de stocker 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 par quaternion est beaucoup plus rapide que la multiplication par matrice 3x3).

Notez que toutes de ces représentations de 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 belles propriétés analytiques; et les quaternions atteignent un bel équilibre des deux, étant légers, mais sans verrouillage de cardan.

51
Peter Alexander

En physique, il y a de très bonnes raisons pour lesquelles nous n'utilisons pas de 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 d'une manière plutôt technique qui va 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 de Nice, et donc ils ne sont pas utiles, et les vecteurs/matrices en ont, donc nous les utilisons.

Eh bien, moi aussi je suis physicien. Et il y a des situations où les quaternions se balancent tout simplement! Harmoniques sphériques par exemple. Vous avez deux atomes diffusant, échangeant un électron: quel est le transfert de spin orbital? Avec les quaternions, il s'agit simplement de multiplication, c'est-à-dire de résumer les exposants des fonctions de base SH exprimées en quaternions. (Obtenir les polynômes de Legendre en notation quaternion est cependant un peu fastidieux).

Mais je suis d'accord, ils ne sont pas un outil universel, et surtout en mécanique de carrosserie rigide, ils seraient très lourds à utiliser. Pourtant, pour citer Bertrand Russell, répondez à la question d'un élève combien de mathématiques un physicien a besoin de savoir: "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. D'abord, on peut bien les interpoler, ce qui est important si l'on anime des objets en rotation, comme les membres autour d'une articulation. Avec un quaternion, c'est juste une multiplication et une normalisation scalaires. L'exprimer avec une matrice nécessite une évaluation de sin et cos, puis de construire une matrice de rotation. Ensuite, multiplier un vecteur par un quaternion est toujours moins cher que de passer par une multiplication matricielle complète, c'est aussi toujours moins cher si l'on ajoute une traduction par la suite. Si vous envisagez 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 agréable de l'utilisation des quaternions est que toute transformation est intrinsèquement orthonormée. Avec les matrices de traduction, il faut ré-orthonormaliser toutes les deux étapes d'animation, en raison d'erreurs d'arrondi numériques.

33
datenwolf

L'argument de verrouillage sans cardan semble étrange, car ce n'est qu'un problème d'angles euler. Ce n'est aussi 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.

De nombreuses applications 3D aiment utiliser les 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 savoir que des choses comme "la commutation des coordonnées, la rotation hors de la dégénérescence ou l'utilisation de deux systèmes de coordonnées qui se chevauchent" nécessitent toutes un effort. L'effort signifie le code. Et le code signifie la performance. Perdre des performances lorsque vous n'avez pas n'est pas une bonne chose pour de nombreuses applications 3D. Après tout, ce qui doit être gagné par toutes ces astuces, si seulement l'utilisation de quaternions vous obtiendrait tout ce dont vous aviez besoin.

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 mis en œuvre. J'ai lu qu'il est plus facile de normaliser un quaternion que de le faire pour une matrice de rotation, mais cela 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 car elles ont le même nombre de degrés de liberté).

Les problèmes numériques se posent lorsqu'il s'agit 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 modification, vous devez normaliser à nouveau l'orientation; sinon, des problèmes de précision s'introduiront et gâcheront les choses.

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 du quaternion est bon marché. Même la normalisation de matrice de rotation spécialisée 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.

Lorsque vous traitez avec un personnage 3D, vous avez souvent une série de transformations définissant l'emplacement de chaque os du personnage. Cette hiérarchie des 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.

L'interpolation de deux matrices est ... non triviale. 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 meilleure interpolation de qualité (et parfois vous le faites), vous pouvez faire ressortir le lerp sphérique . Cela fait que l'interpolation se comporte mieux pour des orientations plus disparates. Ce calcul est beaucoup plus difficile et nécessite plus d'opérations pour les matrices que les quaternions.

24
Nicol Bolas

Opinion: 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 : Normalisation! Ghram-Shmit est asymétrique, ce qui ne donne pas de réponse précise d'ordre supérieur lors de l'équation différentielle. Des méthodes plus sophistiquées sont très complexes et coûteuses.

Axe (angle = longueur de l'axe) Avantage mineur : Petit. Inconvénient modéré : La multiplication et l'application à un vecteur sont lentes avec trig. Inconvénient modéré : Singularité du pôle Nord en longueur = 2 * pi, car toutes les directions d'axe ne font rien. Plus de code (et de débogage) pour le redimensionner automatiquement quand il approche de 2pi.

6
Kevin Kostlan

Généralement, nous voulons juste un mappage 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 ça.

Nous ne voulons absolument pas juste ne voulons pas cela. Il y a une subtilité très importante qui beaucoup de gens manquent . 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 pouvoir représenter une telle rotation.

Il s'avère que vous pouvez faire cela avec juste un vecteur. (C'est la représentation axe-angle des rotations .) Mais la combinaison des rotations dans la représentation axe-angle est difficile. Les quaternions facilitent la tâche, 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.)

5
Mike

Les raisons habituelles que je vois ne sont pas des verrous de vrille ou des problèmes numériques.

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 blocage du cardan .

De plus, certaines formes d'interpolation deviennent agréables et faciles à faire, comme SLERP .

... ou en utilisant deux systèmes de coordonnées qui se chevauchent.

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 répondent pas à vos besoins, ne les utilisez pas.

3
Sage Gerard

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 de Paramétrisations d'Euler-Rodrigues , qui est le structure réelle à 4 éléments utilisée pour décrire une rotation 3D.

Leur relation avec les 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 était plutôt surpris de constater qu'il y avait:

En fait, les formules sont précisément celles données pour une telle transformation par M. Olinde Rodrigues Liouville, t. v., "Des lois géométriques qui régissent les déplacements d'un système solide [...]" (ou Comb. Math. Journal, t. iii. p. 224 [6]). Ce serait une question intéressante de rendre compte, a priori, de l'apparition de ces coefficients ici.

Cependant, il n'y a rien d'intrinsèque dans les Quaternions qui donne un quelconque avantage à la rotation. Les quaternions n'évitent pas le verrouillage du cardan; Les paramétrisations d'Euler-Rodrigues le font. Très peu de programmes informatiques qui effectuent la rotation sont susceptibles d'implémenter véritablement des types Quaternion qui sont des valeurs mathématiques complexes de première classe. Malheureusement, une incompréhension du rôle des Quaternions semble s'être répandue quelque part, ce qui a amené un grand nombre d'étudiants en graphisme déconcertés à apprendre les détails des mathématiques complexes avec plusieurs constantes imaginaires, puis à se demander pourquoi cela résout les problèmes de rotation.

3
Mark Green