una por matriz matrices inversa ejercicios determinantes adjunta 3x3 2x2 opengl glsl game-engine game-physics

opengl - matrices - ¿Por qué transformar las normales con la transposición de la inversa de la matriz modelview?



matriz inversa por adjunta (5)

Estoy trabajando en algunos sombreadores, y necesito transformar normales.

Leí en algunos tutoriales la forma en que transforma las normales si las multiplica con la transposición de la inversa de la matriz de modelos . Pero no puedo encontrar una explicación de por qué es así, y ¿cuál es la lógica detrás de eso?


Eche un vistazo a este tutorial:

https://paroj.github.io/gltut/Illumination/Tut09%20Normal%20Transformation.html

Puedes imaginar que cuando la superficie de una esfera se estira (por lo que la esfera se escala a lo largo de un eje o algo similar) las normales de esa superficie se "doblarán" una hacia la otra. Resulta que necesitas invertir la escala aplicada a las normales para lograr esto. Esto es lo mismo que transformar con la Matriz de Transposición Inversa . El enlace de arriba muestra cómo derivar la matriz de transposición inversa de esto.

También tenga en cuenta que cuando la escala es uniforme, simplemente puede pasar la matriz original como matriz normal. Imagine que la misma esfera se escala uniformemente a lo largo de todos los ejes, la superficie no se estirará ni doblará, ni las normales.


Fluye desde la definición de una normal.

Supongamos que tiene la normal, N , y un vector, V , un vector tangente en la misma posición en el objeto que la normal. Entonces, por definición, N·V = 0 .

Los vectores tangentes se ejecutan en la misma dirección que la superficie de un objeto. Entonces, si su superficie es plana, entonces la tangente es la diferencia entre dos puntos identificables en el objeto. Entonces, si V = Q - R donde Q y R son puntos en la superficie, entonces si transforma el objeto por B :

V'' = BQ - BR = B(Q - R) = BV

La misma lógica se aplica a las superficies no planas al considerar los límites.

En este caso supongamos que tiene la intención de transformar el modelo por la matriz B Entonces, B se aplicará a la geometría. Luego, para averiguar qué hacer con las normales, debe resolver para la matriz, A , para que:

(AN)·(BV) = 0

Convertir eso en una fila versus una columna para eliminar el producto de puntos explícito:

[tranpose(AN)](BV) = 0

Tire de la transposición hacia afuera, elimine los soportes:

transpose(N)*transpose(A)*B*V = 0

Así que eso es "la transposición de lo normal" [producto con] "la transposición de la matriz de transformación conocida" [producto con] "la transformación que estamos resolviendo para" [producto con] "el vector en la superficie del modelo" = 0

Pero comenzamos declarando que transpose(N)*V = 0 , ya que eso es lo mismo que decir que N·V = 0 . Entonces, para satisfacer nuestras limitaciones, necesitamos la parte media de la expresión: transpose(A)*B - para irse.

Por lo tanto, podemos concluir que:

transpose(A)*B = identity => transpose(A) = identity*inverse(B) => transpose(A) = inverse(B) => A = transpose(inverse(B))


Mi prueba favorita está debajo de donde N es el normal y V es un vector tangente. Como son perpendiculares, su producto escalar es cero. M es cualquier transformación invertible 3x3 (M -1 * M = I). N ''y V'' son los vectores transformados por M.

Para obtener algo de intuición, considere la transformación de corte a continuación.

Tenga en cuenta que esto no se aplica a los vectores tangentes.


No entiendo por qué simplemente no pone a cero el 4 ° elemento del vector de dirección antes de multiplicar con la matriz del modelo. No es necesario invertir o transponer. Piensa en el vector de dirección como la diferencia entre dos puntos. Mueva los dos puntos con el resto del modelo; aún se encuentran en la misma posición relativa que el modelo. Tome la diferencia entre los dos puntos para obtener la nueva dirección, y el 4 ° elemento, cancela a cero. Mucho mas barato


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 la escala normal por cuadrada y multiplique por la matriz del modelo y terminamos. Puede extender eso a cualquier matriz con ejes perpendiculares, simplemente calcule la escala cuadrada para cada uno de los ejes de la matriz que está utilizando.

Escribí los detalles en mi blog: https://lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html