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 es
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?
transformations
geometry
Nerón
fuente
fuente
Respuestas:
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.n ⋅ x + d= 0 norte METRO norte′⋅ Mx + d′= 0 X
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′= d
Reescribiré esto con los productos de punto expresados en notación matricial (pensando en los vectores como matrices de 1 columna):
Ahora para satisfacer esto para todas las , debemos tener:X
Ahora resolviendo para en términos de n ,norte′ norte
¡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.X METRO METRO
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.
fuente
¡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 .
fuente