Transformar el orden de multiplicación de la matriz

21

Estoy experimentando dificultades tratando de averiguar el orden de multiplicación correcto para una matriz de transformación final. Siempre obtengo movimientos extraños o geometría distorsionada. Mi modelo actual se explica a continuación:

Para un solo nodo, mi orden de multiplicación es:

L = S * R * T

dónde

L = matriz de transformación local

S = matriz de escala local

R = matriz de rotación local

T = matriz de traducción local

Para la transformación del mundo de un nodo:

W = PW * L

dónde

W = matriz de transformación mundial

PW = matriz de transformación del mundo padre

L = la matriz de transformación local calculada anteriormente

Al renderizar, para cada nodo calculo la matriz:

MV = Inv (C) * NO

dónde

MV = la matriz de transformación de vista de modelo para un nodo particular

Inv (C) = la matriz de transformación de cámara inversa

NW = la matriz de transformación del mundo del nodo calculada anteriormente.

Finalmente, en el sombreador tengo la siguiente transformación:

TVP = PRP * MV * VP

dónde

TVP = posición final del vértice transformado

PRP = matriz de perspectiva

MV = matriz de transformación del mundo del nodo calculada anteriormente

VP = posición de vértice no transformada.

Con el modelo actual, los nodos secundarios que tienen rotación local, rotan de manera extraña al transformar la cámara. ¿Dónde me equivoqué con el orden de multiplicación?

Colin Dumitru
fuente

Respuestas:

37

Cualquier combinación del orden S*R*Tproporciona una matriz de transformación válida. Sin embargo, es bastante común escalar primero el objeto, luego rotarlo y luego traducirlo:

L = T * R * S

Si no lo hace en ese orden, una escala no uniforme se verá afectada por la rotación anterior, haciendo que su objeto se vea sesgado. Y la rotación se verá afectada por la traducción, haciendo que la posición final de su objeto sea muy diferente de lo que el valor de la traducción le haría esperar.

sam hocevar
fuente
¿Puedes explicar esto un poco más? Por lo que estoy acostumbrado, la rotación no puede verse afectada por una traslación ya que es una diferencia de orientación entre dos cuadros, independientemente de la posición. En cambio, una traslación puede verse afectada por una rotación que ocurre antes, ya que se traducirá en el eje de rotación recién definido. En L = TRS, la traducción ocurre primero, por lo que no se ve afectada por los nuevos vectores creados por la rotación.
user-2147482637
44
La confusión proviene del hecho de que estás hablando de transformaciones locales (donde el marco permanece vinculado al objeto), mientras que las transformaciones descritas aquí suceden en el espacio mundial (donde solo hay un marco de referencia fijo, el mundo). Conceptualmente, su forma de ver las cosas es válida, y es equivalente a aplicar transformaciones en orden inverso.
sam hocevar