É possível transformar uma matriz de rotação 3D (4x4) em seus componentes (rotação, escala, etc.)?

11

Para ser mais concreto, estou trabalhando em um aplicativo iOS e tenho uma CATransform3Destrutura (basicamente uma matriz de transformação 4x4).

É possível deduzir todas as diferentes "operações" que essa matriz implica? Coisas como quanta rotação, escala, etc. isso implica?

elsurudo
fonte

Respostas:

10

Você pode decompor a matriz em transformações básicas: conversão, dimensionamento e rotação. Dada esta matriz:M=TRS

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

Você pode decompor a tradução por inspeção usando a última coluna .t=(a03,a13,a23)

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,s1,s2)

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

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×3RSS1R

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

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

R=[a00/s0a01/s1a02/s2a10/s0a11/s1a12/s2a20/s0a21/s1a22/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 StsrTRS

user5488
fonte
2
Você pode esclarecer quais são os problemas com precisão de ponto flutuante? Não vejo nada neste método que possa causar problemas de precisão, a menos que a escala seja realmente extrema. Além disso, vale ressaltar que esse método pode falhar se a matriz for composta de uma sequência de matrizes que inclua escalas e rotações não uniformes. A matriz acabará não sendo uma rotação nesse caso, mas incluirá algum cisalhamento. R
Nathan Reed
2
Todos os números de ponto flutuante têm erro intrínseco (limitado). Sempre que você executa operações, e particularmente adição ou subtração, você compõe o erro, aumentando a magnitude dos limites. Escondidas no algoritmo de decomposição estão muitas operações de adição (na multiplicação da matriz e no cálculo da magnitude da escala) e uma raiz quadrada (na escala). Uma decomposição adicional introduzirá mais erros.
Timbo 16/11
1
@ Timbo Não existe aqui nenhuma multiplicação completa da matriz, basta multiplicar as colunas da matriz pelas escalas inversas. E uma magnitude vetorial envolve adicionar todas as quantidades positivas; portanto, não há cancelamento catastrófico lá; não produz muito erro relativo, AFAICT. De qualquer forma, o autor esclareceu que eles estão falando sobre decompor ainda mais a matriz de rotação em ângulos de Euler ou algo parecido, o que faz mais sentido.
Nathan Reed
Obrigado - ótima resposta. Acompanhamento: para recuperar a matriz original, suponho que precisamos seguir uma certa ordem de operações, começando pela matriz de identidade. Esse pedido seria TRS?
elsurudo