Est-il possible de transformer une matrice de rotation 3D (4x4) en ses composants (rotation, échelle, etc.)?

11

Pour être plus concret, je travaille sur une application iOS et j'ai une CATransform3Dstructure (essentiellement un tableau de transformation 4x4).

Est-il possible de déduire toutes les différentes "opérations" que cette matrice implique? Des choses comme la rotation, l'échelle, etc. que cela implique?

elsurudo
la source

Réponses:

10

Vous pouvez décomposer la matrice M=TRS en transformations de base: translation, mise à l'échelle et rotation. Compte tenu de cette matrice:

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

t=(a03,a13,a23)

s=(s0,s1,s2)

s0=(a00,a10,a20)s1=(a01,a11,a21)s2=(a02,a12,a22)

Maintenant que vous avez l'échelle, vous pouvez vous en débarrasser en utilisant la sous-matrice qui correspond à en multipliant la matrice par l'inverse de l'échelle à get3×3RSS1R

(RS)S1=[a00a01a02a10a11a12a20a21a22][s0000s1000s2]1=[a00a01a02a10a11a12a20a21a22][1/s00001/s10001/s2]

Ainsi ( ):(RS)S1=RI=R

R=[a00/s0a01/s1a02/s2a10/s0a11/s1a12/s2a20/s0a21/s1a22/s2]

Il s'agit de la matrice de rotation finale. Vous pouvez le décomposer davantage de plusieurs façons. Elle est longue mais vous pouvez rechercher la décomposition d'une matrice de rotation .


Cette méthode ne donne que des valeurs équivalentes sous forme de translation, de mise à l'échelle et de rotation (la matrice d'origine peut être le résultat d'autres types de transformations). Il peut y avoir des problèmes de précision en virgule flottante avec les angles de rotation si vous utilisez en outre les angles décomposés, des erreurs d'arrondi peuvent s'accumuler dans les calculs. Vous ne devez pas l'utiliser sauf si vous n'avez pas construit la matrice vous-même.

Si vous êtes celui qui a construit la matrice et que vous vouliez la décomposition afin de pouvoir éditer et afficher la traduction, l'échelle et la rotation individuellement et indépendamment , probablement la plus claire pourquoi est de stocker les composants de , et dans une classe de transformation individuellement comme vecteurs (peut-être quaternion pour la rotation). Seulement lorsque vous avez besoin de la matrice de transformation, construisez une matrice partir de ces composants (vous pouvez mettre en cache la matrice jusqu'à ce que certains composants soient modifiés).s r T R StsrTRS

user5488
la source
2
Pouvez-vous clarifier les problèmes de précision en virgule flottante? Je ne vois rien dans cette méthode qui pourrait causer des problèmes de précision, sauf si l'échelle est vraiment extrême. Il convient également de noter que cette méthode peut échouer si la matrice était composée d'une séquence de matrices qui comprend à la fois des échelles non uniformes et des rotations. La matrice s'avérera ne pas être une rotation dans ce cas, mais inclura du cisaillement. R
Nathan Reed
2
Tous les nombres à virgule flottante ont une erreur intrinsèque (limitée). Chaque fois que vous effectuez des opérations, et en particulier l'addition ou la soustraction, vous aggravez l'erreur, augmentant l'amplitude des limites. De nombreuses opérations d'addition (à la fois dans la multiplication matricielle et dans le calcul de l'amplitude de l'échelle) et une racine carrée (dans l'échelle) cachent dans l'algorithme de décomposition. Une décomposition plus poussée entraînera de nouvelles erreurs.
Timbo
1
@Timbo Il n'y a pas ici de multiplication de matrice complète, juste en multipliant les colonnes de la matrice par les échelles inverses. Et une amplitude vectorielle implique l'addition de toutes les quantités positives, il n'y a donc pas d'annulation catastrophique là-bas; cela ne produit pas beaucoup d'erreur relative, AFAICT. Quoi qu'il en soit, l'auteur a précisé qu'ils parlaient de décomposer davantage la matrice de rotation en angles d'Euler ou similaires, ce qui est plus logique.
Nathan Reed
Merci - excellente réponse. Suivi: pour récupérer la matrice d'origine, je suppose que nous devons suivre un certain ordre d'opérations, à partir de la matrice d'identité. Cette commande serait-elle TRS?
elsurudo