¿Es posible convertir una matriz de rotación 3d (4x4) en sus componentes (rotación, escala, etc.)?

11

Para ser más concreto, estoy trabajando en una aplicación de iOS y tengo una CATransform3Destructura (básicamente una matriz de transformación 4x4).

¿Es posible deducir todas las diferentes "operaciones" que implica esta matriz? ¿Cosas como cuánta rotación, escala, etc. implica?

elsurudo
fuente

Respuestas:

10

Puede descomponer la matriz M=TRS en transformaciones básicas: traslación, escala y rotación. Dada esta matriz:

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

t=(a03,a13,a23)

s=(s0,s1,s2)

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

Ahora que tiene la escala, puede deshacerse de ella usando la que corresponde a multiplicando la matriz con el inverso de la escala para get3×3RSS1R

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

Así ( ):(RS)S1=RI=R

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

Esta es la matriz de rotación final. Puede descomponerlo aún más de muchas maneras. Es bastante largo pero puede buscar descomponer una matriz de rotación .


Este método solo proporciona valores equivalentes en forma de traslación, escala y rotación (la matriz original puede ser el resultado de otros tipos de transformaciones). Puede tener problemas con la precisión de coma flotante con los ángulos de rotación si usa más los ángulos descompuestos, se pueden acumular errores de redondeo en los cálculos. No debe usarlo a menos que no haya construido la matriz usted mismo.

Si usted es quien construyó la matriz y quería la descomposición para poder editar y mostrar la traducción, la escala y la rotación de forma individual e independiente , probablemente la razón más limpia es almacenar los componentes de , y en una clase de transformación individualmente como vectores (quizás cuaternión para la rotación). Solo cuando necesite la matriz de transformación, construya una matriz partir de estos componentes (puede almacenar en caché la matriz hasta que se cambie algún componente).tsrTRS

usuario5488
fuente
2
¿Puedes aclarar cuáles son los problemas con la precisión de punto flotante? No veo nada en este método que pueda causar problemas de precisión, a menos que la escala sea realmente extrema. Además, vale la pena señalar que este método puede fallar si la matriz se compuso de una secuencia de matrices que incluye tanto escalas no uniformes como rotaciones. La matriz resultará no ser una rotación en ese caso, pero incluirá algo de cizallamiento. R
Nathan Reed
2
Todos los números de coma flotante tienen un error intrínseco (acotado). Cada vez que realiza operaciones, y particularmente sumas o restas, agrava el error y aumenta la magnitud de los límites. Oculto en el algoritmo de descomposición hay muchas operaciones de suma (tanto en la multiplicación de la matriz como en el cálculo de la magnitud de la escala) y una raíz cuadrada (en la escala). Una mayor descomposición introducirá más errores.
Timbo
1
@Timbo No hay ninguna multiplicación de matriz completa aquí, simplemente multiplicando las columnas de la matriz por las escalas inversas. Y una magnitud vectorial implica sumar todas las cantidades positivas, por lo que no hay cancelación catastrófica allí; no produce mucho error relativo, AFAICT. De todos modos, el autor aclaró que están hablando de descomponer aún más la matriz de rotación en ángulos de Euler o similares, lo que tiene más sentido.
Nathan Reed
Gracias, gran respuesta. Seguimiento: para recuperar la matriz original, supongo que necesitamos seguir un cierto orden de operaciones, comenzando desde la matriz de identidad. ¿Esta orden sería TRS?
elsurudo