Por que o inverso transposto da matriz da vista de modelo é usado para transformar os vetores normais?

22

Ao renderizar cenas 3D com transformações aplicadas aos objetos, os normais devem ser transformados com o inverso transposto da matriz de vista do modelo. Portanto, com um normal modelViewMatrix , o normal transformado énMn

n=(M1)Tn

Ao transformar os objetos, fica claro que os normais precisam ser transformados de acordo. Mas por que, matematicamente, essa é a matriz de transformação correspondente?

Nero
fonte
Se a matriz do modelo é feita de translação, rotação e escala, não é necessário fazer a transposição inversa para calcular a matriz normal. Simplesmente divida o normal pela escala quadrada e multiplique pela matriz do modelo e pronto. Você pode estender isso para qualquer matriz com eixos perpendiculares, apenas calcule a escala quadrada para cada eixo da matriz que você está usando. Eu escrevi os detalhes no meu blog: lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html
Eric

Respostas:

22

Aqui está uma prova simples de que a transposição inversa é necessária. Suponha que temos um plano, definido por uma equação de plano , onde é o normal. Agora eu quero transformar este plano por alguns matriz . Em outras palavras, eu quero encontrar uma nova equação de plano que seja satisfeita para exatamente os mesmos valores de que satisfazem a equação de plano anterior.n H n 'M x + d ' = 0 xnx+d=0nMnMx+d=0x

Para fazer isso, basta definir as duas equações do plano iguais. (Isso abre mão da capacidade de redimensionar arbitrariamente as equações do plano, mas isso não é importante para o argumento.) Em seguida, podemos definir e subtraí-lo. O que nos resta é:d=d

nMx=nx

Vou reescrever isso com os produtos pontuais expressos em notação matricial (pensando nos vetores como matrizes de 1 coluna):

nTMx=nTx

Agora, para satisfazer isso para todos os , precisamos ter:x

nTM=nT

Agora resolvendo em termos de , nnn

nT=nTM1n=(nTM1)Tn=(M1)Tn

Presto! Se os pontos são transformados por uma matriz , os planos normais devem se transformar pela transposição inversa de para preservar a equação do plano.M MxMM

Isso é basicamente uma propriedade do produto escalar. Para que o produto escalar permaneça invariável quando uma transformação é aplicada, os dois vetores pontilhados precisam se transformar de maneiras correspondentes, mas diferentes.

Matematicamente, isso pode ser descrito dizendo que o vetor normal não é um vetor comum, mas uma coisa chamada covector (também conhecido como vetor covariante, vetor duplo ou forma linear). Um cobridor é basicamente definido como "algo que pode ser pontilhado com um vetor para produzir um escalar invariável". Para conseguir isso, ele precisa se transformar usando a transposição inversa de qualquer matriz que esteja operando em vetores comuns. Isso vale para qualquer número de dimensões.

Observe que, especificamente em 3D, um bivetor é semelhante a um covetor. Eles não são exatamente os mesmos, pois têm unidades diferentes: um covector possui unidades de comprimento inverso, enquanto um bivetor possui unidades de comprimento ao quadrado (área); portanto, elas se comportam de maneira diferente em escala. No entanto, eles se transformam da mesma maneira em relação à sua orientação, que é o que importa para os normais. Normalmente, não nos importamos com a magnitude de um normal (sempre os normalizamos de acordo com o comprimento da unidade), portanto, geralmente não precisamos nos preocupar com a diferença entre um bivetor e um covetor.

Nathan Reed
fonte
2
explicação incrível. no entanto, um pouco mais rápido em 2 pontos, mais detalhes seriam amados: 1. como você pula de produtos pontuais para produtos matriciais? 2. entre a linha 2 e 3 da seção anterior citada, o que acontece (n é movido da esquerda para a direita um pouco magicamente para mim)
v.oddou
4
1. (a ^ T) b é o mesmo que ponto (a, b) se aeb são matrizes de coluna da mesma dimensão. Experimente a matemática por si mesmo! 2. (AB) ^ T = (B ^ t) (A ^ t), e (A ^ t) ^ T = A Para mais identidades de matriz, vá para a matriz de receitas
Mokosha
3
@ v.oddou Sim, Mokosha está certo. O produto escalar pode ser expresso como multiplicando uma matriz 1 × n (vetor de linha) por uma matriz × 1 (vetor de coluna); o resultado é uma matriz 1 × 1 cujo único componente é o produto escalar. A transposição de um vetor de coluna é um vetor de linha, para que possamos escrever a · b como a ^ T b. Para a segunda questão, transpor um produto de matrizes é equivalente a transpor os fatores individuais e reverter sua ordem.
Nathan Reed
perfeito, está tudo claro sem problemas agora. obrigado a ambos.
v.oddou 16/09/2015
@NathanReed (Puxa, isso me leva de volta aos primeiros dias do PowerVR, onde modelamos quase tudo com aviões). Também vale a pena mencionar que, para fins de otimização, se você tiver uma matriz Mr que contenha apenas rotações (ou seja, é ortogonal), então Inverse ( Mr ) = Transpose ( Mr ) e, portanto, Trans (Inverse ( Mr ) = _ Mr_. Você também pode usar atalhos com a parte da tradução e, se souber que a escala é uniforme.FWIW na biblioteca de gráficos SGL PowerVR, costumávamos manter booleanos para rastrear se uma matriz de transformação tinha essas propriedades para economizar custos com as transformações normais.
Simon F
6

Isto é simplesmente porque os normais não são realmente vetores! Eles são criados por produtos cruzados, o que resulta em bivetores , não em vetores. A álgebra funciona muito diferente para essas coordenadas, e a transformação geométrica é apenas uma operação que se comporta de maneira diferente.

Um ótimo recurso para aprender mais sobre isso é a apresentação de Eric Lengyel na álgebra de Grassman .

ap_
fonte
Os normais também são chamados pseudovetores. Como generalização e regra geral, tudo o que resultar de um produto cruzado (por exemplo, aviões) será transformado de maneira semelhante.
Matthias