Quaternions et rotation autour de l'axe mondial

11

Avertissement: Je suis un programmeur de jeux professionnel et j'utilise des quaternions la plupart du temps, mais ils sont proches de la magie noire pour moi. Je suis relativement à l'aise avec les mathématiques mais les nombres imaginaires m'ont toujours dérouté. J'ai tendance à considérer les quats comme utiles et à inverser les multiplications plus d'une fois. J'essaie de les raisonner comme je le ferais avec des matrices avec un succès limité.

De toute façon....

Ce qui me déconcerte, c'est ce qui suit. Lorsque je veux faire pivoter un objet autour de son axe local, je multiplie sa rotation par le quaternion qui représente la rotation que je veux appliquer. Il s'agit donc d'une rotation dans l'espace local.

Maintenant, si je veux le faire pivoter autour d'un axe dans l'espace mondial, mon raisonnement serait: Prenez la rotation dans l'espace mondial comme un quaternion. Multipliez l'inverse de la rotation de mon objet avec ce quaternion. Cela apportera ma rotation mondiale dans l'espace local. Multipliez ma rotation avec ce nouveau quaternion. ie: newRot = oldRot * (inverse oldRot * worldRot)

Cependant, ce que je dois faire est newRot = oldRot * (inverse oldRot * worldRot) * oldRot.

Pourquoi dois-je, après avoir multiplié avec le quat inverse, multiplier avec mon propre quat avant de l'appliquer? Je sais qu'il doit y avoir une raison parfaitement valable, mais je ne peux pas raisonner pour m'en sortir et c'est frustrant pour moi. J'ai essayé les diverses faqs et ainsi de suite, mais la plupart vont au plus profond des mathématiques, ce qui est moins clair pour moi.

Quelqu'un qui peut m'expliquer cela comme si j'avais 5 ans?

Kaj
la source
N'est-ce pas un peu comme des traductions matricielles et des roatations (c'est-à-dire que vous devez déplacer votre objet vers le centre, faire pivoter puis reculer lorsque vous voulez faire pivoter un élément autour de lui-même: Minv_transl * Mrot * Mtransl)
Valmond
I try to reason about them like I would with matrices- alors vous êtes sur la bonne voie. Si vous avez compris comment faire pivoter autour des axes des objets et des axes du monde en utilisant des matrices, vous pouvez faire de même en utilisant des quaternions. L'ordre de multiplication est le même pour les matrices et les quaternions.
Maik Semder

Réponses:

11

Les quaternions sont associatifs:

vous mentionnez que votre solution est:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

ce qui équivaut à:

newRot = oldRot * inverse oldRot * worldRot * oldRot

ce qui équivaut à:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

ce qui vous ramène à ce qui se passe réellement:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

L'ordre d'application change, c'est tout. Pour en revenir aux matrices, lorsque vous appliquez une matrice d'objet à une matrice de transformation et que vous la stockez en tant que nouvelle matrice d'objet, c'est votre transformation d'espace local. Lorsque vous appliquez la matrice de transformation à la matrice d'objet et que vous la stockez, c'est votre transformation du monde. Tout dépend de l'ordre d'application et rien de plus.

Richard Fabian
la source
1
+1 pour la première partie, la deuxième partie est un peu trompeuse. Si vous n'utilisez que «rot» dans le dernier exemple de code, plutôt que «localRot» et «worldRot», l'exemple devient plus clair. Sinon, cela implique que les pourritures elles-mêmes sont de toute façon différentes . Mais la différence ne réside que dans l'ordre de multiplication, comme vous l'avez montré, plutôt que dans différents quaternions ('localRot' et 'worldRot'). «localTransformed» et «worldTransformed» seraient mieux comme: «rotatedAroundLocalAxis» et «rotatedAroundWorldAxis». Cela expliquerait lui-même les équations et rendrait le dernier paragraphe obsolète, ce qui présente quelques défauts.
Maik Semder
Défauts dans le dernier paragraphe: la distinction entre matrice et transformation (les deux sont les mêmes ici et interchangeables, donc il vaut mieux utiliser juste la matrice pour éviter toute confusion) et les termes "transformation de l'espace local" et "transformation du monde": ce serait plus il est juste de dire que la première équation vous donne la `` matrice du local au monde '' après avoir pivoté autour de l'axe local de l'objet, la seconde vous donne la `` matrice du local au monde '' après avoir pivoté autour de l'axe du monde. Dans les deux cas, ce que vous obtenez est simplement la «matrice du local au monde». Cependant, la première partie a quand même mon +1 pour l'analyse.
Maik Semder
+1 @Maik peut-être pourriez-vous écrire une réponse séparée pour rendre encore plus claire l'indifférence entre les rotations et la question de l'ordre de multiplication? Merci pour le commentaire de toute façon!
Max Dohme
Ah, maintenant ça a du sens. Je ne savais pas (aïe, ça aurait été dans la FAQ) que la multiplication du quaternion était associative, donc en effet la rotation et son inverse s'annulent mutuellement, me donnant la perspicacité dont j'avais besoin, l'une a la rotation locale à droite et l'autre à droite à gauche qui disent essentiellement «appliquer la rotation dans l'espace parent» ou «appliquer la rotation dans l'espace local» .... pas différent des matrices. Assez élémentaire une fois que vous le voyez! Merci!
Kaj