¿Por qué se utiliza el inverso transpuesto de la matriz de vista del modelo para transformar los vectores normales?

22

Al renderizar escenas 3D con transformaciones aplicadas a los objetos, las normales deben transformarse con el inverso transpuesto de la matriz de vista del modelo. Entonces, con un normal , modelViewMatrix M , el n ' normal transformado esnMn

n=(M1)Tn

Al transformar los objetos, está claro que las normales deben transformarse en consecuencia. Pero ¿por qué, matemáticamente, esta es la matriz de transformación correspondiente?

Nerón
fuente
Si la matriz modelo está hecha de traslación, rotación y escala, no es necesario realizar una transposición inversa para calcular la matriz normal. Simplemente divida lo normal por la escala al cuadrado y multiplique por la matriz del modelo y listo. Puede extender eso a cualquier matriz con ejes perpendiculares, solo calcule la escala al cuadrado para cada eje de la matriz que está utilizando. Escribí los detalles en mi blog: lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html
Eric

Respuestas:

22

Aquí hay una prueba simple de que se requiere la transposición inversa. Supongamos que tenemos un plano, definido por una ecuación plana , donde n es lo normal. Ahora quiero transformar este plano por alguna matriz M . En otras palabras, quiero encontrar una nueva ecuación de plano n M x + d = 0 que se satisfaga exactamente para los mismos valores de x que satisfacen la ecuación de plano anterior.norteX+re=0 0norteMETROnorteMETROX+re=0 0X

Para hacer esto, es suficiente establecer las dos ecuaciones planas iguales. (Esto da la capacidad de reescalar las ecuaciones del plano arbitrariamente, pero eso no es importante para el argumento). Entonces podemos establecer y restarlo. Lo que nos queda es:re=re

norteMETROX=norteX

Reescribiré esto con los productos de punto expresados ​​en notación matricial (pensando en los vectores como matrices de 1 columna):

norteTMETROX=norteTX

Ahora para satisfacer esto para todas las , debemos tener:X

norteTMETRO=norteT

Ahora resolviendo para en términos de n ,nortenorte

norteT=norteTMETRO-1norte=(norteTMETRO-1)Tnorte=(METRO-1)Tnorte

¡Presto! Si los puntos son transformados por una matriz M , entonces las normales del plano deben transformarse por la transposición inversa de M para preservar la ecuación del plano.XMETROMETRO

Esto es básicamente una propiedad del producto punto. Para que el producto punto permanezca invariable cuando se aplica una transformación, los dos vectores punteados tienen que transformarse de formas correspondientes pero diferentes.

Matemáticamente, esto puede describirse diciendo que el vector normal no es un vector ordinario, sino una cosa llamada un vectorizador (también conocido como vector covariante, vector dual o forma lineal). Un covector se define básicamente como "una cosa que se puede puntear con un vector para producir un escalar invariante". Para lograr eso, tiene que transformarse usando la transposición inversa de cualquier matriz que esté operando en vectores ordinarios. Esto se cumple en cualquier cantidad de dimensiones.

Tenga en cuenta que en 3D específicamente, un bivector es similar a un covector. No son exactamente lo mismo ya que tienen unidades diferentes: un Covector tiene unidades de longitud inversa, mientras que un Bivector tiene unidades de longitud al cuadrado (área), por lo que se comportan de manera diferente bajo la escala. Sin embargo, se transforman de la misma manera con respecto a su orientación, que es lo que importa para los normales. Por lo general, no nos importa la magnitud de un normal (de todos modos, siempre los normalizamos a la longitud de la unidad), por lo que generalmente no debemos preocuparnos por la diferencia entre un bivector y un covector.

Nathan Reed
fuente
2
Increíble explicación. Sin embargo, un poco rápido en 2 puntos, un poco más de detalles serían amados: 1. ¿Cómo saltas de productos de punto a productos de matriz? 2. entre la línea 2 y 3 de la última sección citada, lo que sucede (n se mueve mágicamente de izquierda a derecha un poco hacia mí)
v.oddou
44
1. (a ^ T) b es lo mismo que punto (a, b) si a y b son matrices de columna de la misma dimensión. ¡Prueba las matemáticas por ti mismo! 2. (AB) ^ T = (B ^ T) (A ^ T), y (A ^ T) ^ T = A Para obtener más identidades de matriz, consulte The Matrix Cookbook
Mokosha
3
@ v.oddou Sí, Mokosha tiene razón. El producto de puntos puede expresarse multiplicando una matriz 1 × n (vector de fila) con una matriz × 1 (vector de columna); el resultado es una matriz 1 × 1 cuyo componente único es el producto escalar. La transposición de un vector de columna es un vector de fila, por lo que podemos escribir a · b como a ^ T b. Para la segunda pregunta, la transposición de un producto de matrices es equivalente a transponer los factores individuales y revertir su orden.
Nathan Reed
perfecto, todo está claro sin problemas ahora. Gracias a ambos.
v.oddou
@NathanReed (Dios mío, esto me lleva de vuelta a los primeros días de PowerVR donde modelamos la mayoría de las cosas con aviones). También vale la pena mencionar que, para fines de optimización, si tiene una matriz Mr que solo contiene rotaciones, (es decir, es ortogonal), entonces Inverse ( Mr ) = Transpose ( Mr ), y así Trans (Inverse ( Mr ) = _ Mr_. También puede tomar atajos con la parte de traducción y si sabe que la escala es uniforme. FWIW en la biblioteca de gráficos SGL PowerVR, solíamos mantener booleanos para rastrear si una matriz de transformación tenía estas propiedades para ahorrar costos con las transformaciones normales.
Simon F
6

¡Esto es simplemente porque las normales no son realmente vectores! Son creados por productos cruzados, lo que da como resultado bivectores , no vectores. El álgebra funciona de manera muy diferente para estas coordenadas, y la transformación geométrica es solo una operación que se comporta de manera diferente.

Un gran recurso para aprender más sobre esto es la presentación de Eric Lengyel sobre Grassman Algebra .

ap_
fuente
Las normales también se denominan pseudovectores. Como generalización y regla general, todo lo que resulte de un producto cruzado (por ejemplo, planos) se transformará de manera similar.
Matthias