Vous pouvez décomposer la matrice M = T R S en transformations de base: translation, mise à l'échelle et rotation. Compte tenu de cette matrice:
M = ⎡⎣⎢⎢⎢une00unedixune200une01une11une210une02une12une220une03une13une231⎤⎦⎥⎥⎥
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×3RSS−1R
(RS)S−1=⎡⎣⎢a00a10a20a01a11a21a02a12a22⎤⎦⎥⎡⎣⎢s0000s1000s2⎤⎦⎥−1=⎡⎣⎢a00a10a20a01a11a21a02a12a22⎤⎦⎥⎡⎣⎢1/s00001/s10001/s2⎤⎦⎥
Ainsi ( ):(RS)S−1=RI=R
R=⎡⎣⎢a00/s0a10/s0a20/s0a01/s1a11/s1a21/s1a02/s2a12/s2a22/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