Comment combiner la rotation sur 2 axes en une seule matrice

8

Je connais déjà les matrices que je dois utiliser pour effectuer des rotations. Si je dois tourner sur l'axe z puis sur l'axe x, je le ferais en 2 étapes. Ma question est, est-il possible de combiner les deux rotations en une seule matrice? J'apprécierai vos commentaires.

JORGE
la source

Réponses:

8

(Cette réponse est essentiellement la même que celle de Stefan, mais je voulais ajouter quelques détails sur les vecteurs de ligne et de colonne, et comment déterminer ceux que vous utilisez.)

Oui, c'est possible, mais les détails varient selon que vous représentez vos vecteurs sous forme de lignes ou de colonnes.

Vecteurs de colonne

Si vous utilisez des vecteurs de colonnes , vous les transformerez normalement en multipliant à gauche vos matrices:

vector = mRotateZ * vector;
vector = mRotateX * vector;

Bien sûr, vous pouvez également le faire en une seule étape:

vector = mRotateX * mRotateZ * vector;

Mais la multiplication matricielle est associative, ce qui signifie que la multiplication effectuée en premier n'a pas d'importance:

A * B * C = (A * B) * C = A * (B * C)

Nous pouvons donc écrire

Matrix mRotate = mRotateX * mRotateZ;
vector = mRotate * vector;

Nous avons maintenant créé une matrice unique, ce qui équivaut à la première rotation autour Zet la seconde environ X. Cela se généralise trivialement pour un certain nombre de transformations. Notez que les transformations sont appliquées de droite à gauche.

Vecteurs de ligne

Si, d'autre part, vous utilisez des vecteurs de ligne , vous multipliez normalement à droite vos matrices:

vector = vector * mRotateZ;
vector = vector * mRotateX;

Encore une fois, en l'écrivant en une seule étape, nous obtenons

vector = vector * mRotateZ * mRotateX;

qui peut être réécrit comme

Matrix mRotate = mRotateZ * mRotateX;
vector = vector * mRotate;

Notez que dans ce cas, les transformations s'appliquent de gauche à droite.

Martin Ender
la source
1
Je serais très méfiant avec ce commentaire d'associativité, c'est facile à comprendre
joojaa
@joojaa Je ne sais pas exactement ce que tu veux dire, mais j'ai essayé de clarifier ce point.
Martin Ender
Il est difficile pour un profane de séparer l'ordre entre vous multipliez les choses et l'ordre dans lequel les éléments sont en multiplication.
joojaa
ils ne comprennent donc pas la différence entre assiocatif et commutatif. donc si vous parlez de l'ordre de multiplication, beaucoup peuvent penser à la commutativité
joojaa
6

Oui, multipliez-les simplement dans l'ordre inverse:

Matrix myrotation = Matrix.CreateRotationX(xrot) * Matrix.CreateRotationZ(zrot);

ÉDITER. Ma réponse ne s'applique que si vous utilisez des vecteurs de colonne. Veuillez consulter la réponse détaillée de Martin Büttner.

Stefan Agartsson
la source
Je suis désolé mais je ne comprends pas l'idée. Qu'entendez-vous exactement par «ordre inverse»?
JORGE
1
Multipliez x par z au lieu de z par x;
Stefan Agartsson
1
en fait, l'ordre est arbitraire, on peut modéliser en utilisant des vecteurs de ligne et on peut modéliser des vecteurs de colonne. Le calcul donne le même résultat dans les deux mais l'ordre de multiplication change. Mais oui, c'est en quelque sorte la bonne réponse.
joojaa
Joojaa, merci d'avoir précisé cela! La matrice de lignes signifie l'ordre de multiplication inversé, est-ce correct?
Stefan Agartsson
3

Des mathématiques:

Il y a un homomorphisme 2: 1 des quaternions unitaires vers SO (3) (le groupe de rotation).

Cela signifie (essentiellement) que:

  1. Chaque orientation peut être représentée comme un quaternion
  2. Les quaternions représentent une seule rotation
  3. La multiplication des quaternions produit un autre quaternion (fermeture) et équivaut à composer les rotations.
  4. Par conséquent, n'importe quel nombre de rotations peut être représenté comme une seule rotation!

Pensez-y. À partir de l'espace objet, vous pouvez faire pivoter votre objet dans n'importe quelle orientation en utilisant une seule rotation.


Je tiens à souligner que l'introduction de quaternions n'était pas seulement un calcul aléatoire. Contrairement aux autres réponses, l' approche privilégiée dans les graphiques est en fait de représenter les rotations comme des quaternions, car elles prennent moins de place et sont plus rapides à combiner.

Il existe des moyens facilement googliables pour convertir entre les matrices de rotation et les quaternions, selon ce que vous préférez. Le fait est que les rotations sont les quaternions dans un sens mathématique, donc leurs combinaisons sont également des rotations uniques.

imallett
la source