Respostas:
Você pode decompor a matriz em transformações básicas: conversão, dimensionamento e rotação. Dada esta matriz:
Você pode decompor a tradução por inspeção usando a última coluna .
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:
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 R
Assim ( ):
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 S