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 é
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?
transformations
geometry
Nero
fonte
fonte
Respostas:
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 xn ⋅ x + d= 0 n M n′⋅ Mx + d′= 0 x
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
Vou reescrever isso com os produtos pontuais expressos em notação matricial (pensando nos vetores como matrizes de 1 coluna):
Agora, para satisfazer isso para todos os , precisamos ter:x
Agora resolvendo em termos de , nn′ n
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 Mx M M
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.
fonte
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 .
fonte