Você pode decompor a matriz em transformações básicas: conversão, dimensionamento e rotação. Dada esta matriz:M=TRS
M=⎡⎣⎢⎢⎢a00a10a200a01a11a210a02a12a220a03a13a231⎤⎦⎥⎥⎥
Você pode decompor a tradução por inspeção usando a última coluna .t =( a03, um13, um23)
Para dimensionamento, sabemos que as três primeiras colunas da matriz correspondem às bases (eixos). Podemos obter a escala pelo comprimento / norma desses vetores, ou seja, quanto as bases foram dimensionadas. Portanto, a escala é que:s =( s0 0, s1, s2)
s0 0= ∥ ( a00, um10, um20) ∥s1= ∥ ( a01, um11, um21) ∥s2= ∥ ( a02, um12, um22) ∥
Agora você tem a escala, pode se livrar dela usando a sub-matriz que corresponde a multiplicando a matriz pelo inverso da escala para getR S S - 1 R3 × 3R SS- 1R
( R S ) S- 1= ⎡⎣⎢uma00uma10uma20uma01uma11uma21uma02uma12uma22⎤⎦⎥⎡⎣⎢s0 00 00 00 0s10 00 00 0s2⎤⎦⎥- 1= ⎡⎣⎢uma00uma10uma20uma01uma11uma21uma02uma12uma22⎤⎦⎥⎡⎣⎢1 / s0 00 00 00 01 / s10 00 00 01 / s2⎤⎦⎥
Assim ( ):( R S ) S- 1= R I = R
R = ⎡⎣⎢uma00/ s0 0uma10/ s0 0uma20/ s0 0uma01/ s1uma11/ s1uma21/ s1uma02/ s2uma12/ s2uma22/ s2⎤⎦⎥
Esta é a matriz de rotação final. Você pode decompor ainda mais usando várias maneiras. É muito demorado, mas você pode procurar decompor uma matriz de rotação .
Este método fornece apenas valores equivalentes na forma de translação, escala e rotação (a matriz original talvez seja o resultado de outros tipos de transformações). Pode haver problemas com a precisão do ponto flutuante nos ângulos de rotação, se você continuar usando os ângulos decompostos, erros de arredondamento podem se acumular nos cálculos. Você não deve usá-lo, a menos que não tenha construído a matriz.
Se você foi quem construiu a matriz e desejou a decomposição para poder editar e exibir a tradução, a escala e a rotação individualmente e independentemente , provavelmente o mais limpo é por que armazenar os componentes de , e em uma classe de transformação individualmente como vetores (talvez quaternion para a rotação). Somente quando você precisar da matriz de transformação, construa uma matriz partir desses componentes (você pode armazenar em cache a matriz até que algum componente seja alterado).s r T R StsrT R S