Perché l'inverso trasposto della matrice della vista del modello viene utilizzato per trasformare i vettori normali?


22

Durante il rendering di scene 3D con trasformazioni applicate agli oggetti, le normali devono essere trasformate con l'inverso trasposto della matrice della vista del modello. Quindi, con una normale , modelViewMatrix , la normale trasformata ènMn

n=(M1)Tn

Quando si trasformano gli oggetti, è chiaro che le normali devono essere trasformate di conseguenza. Ma perché, matematicamente, è questa la matrice di trasformazione corrispondente?


Se la matrice del modello è composta da traslazione, rotazione e scala, non è necessario eseguire la trasposizione inversa per calcolare la matrice normale. Basta dividere il normale per scala quadrata e moltiplicare per matrice modello e il gioco è fatto. Puoi estenderlo a qualsiasi matrice con assi perpendicolari, calcola semplicemente la scala quadrata per ogni asse della matrice che stai utilizzando. Ho scritto i dettagli nel mio blog: lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html
Eric

Risposte:


22

Ecco una semplice prova che è richiesta la trasposizione inversa. Supponiamo di avere un piano, definito da un'equazione del piano , dove è il normale. Ora voglio trasformare questo piano da parte di alcuni di matrice . In altre parole, voglio trovare una nuova equazione del piano che sia soddisfatta esattamente per gli stessi valori che soddisfano l'equazione del piano precedente.nx+d=0nMnMx+d=0x

Per fare ciò, è sufficiente impostare le due equazioni del piano uguali. (Ciò rinuncia alla capacità di ridimensionare le equazioni del piano arbitrariamente, ma questo non è importante per l'argomento.) Quindi possiamo impostare e sottrarlo. Ciò che ci resta è:d=d

nMx=nx

Riscriverò questo con i prodotti punto espressi in notazione matrice (pensando ai vettori come matrici a 1 colonna):

nTMx=nTx

Ora per soddisfare questo per tutti gli , dobbiamo avere:x

nTM=nT

Ora risolvendo per in termini di ,nn

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

Presto! Se i punti vengono trasformati da una matrice , le normali piane devono trasformarsi per trasposizione inversa di al fine di preservare l'equazione del piano.xMM

Questa è fondamentalmente una proprietà del prodotto punto. Affinché il prodotto punto rimanga invariante quando viene applicata una trasformazione, i due vettori punteggiati devono trasformarsi in modi corrispondenti ma diversi.

Matematicamente, questo può essere descritto dicendo che il vettore normale non è un vettore normale, ma una cosa chiamata covector (aka vettore covariante, doppio vettore o forma lineare). Un covector è sostanzialmente definito come "una cosa che può essere punteggiata da un vettore per produrre uno scalare invariante". Per raggiungere questo obiettivo, deve trasformarsi utilizzando la trasposizione inversa di qualunque matrice operi su vettori ordinari. Questo vale per qualsiasi numero di dimensioni.

Si noti che in 3D in particolare, un bivector è simile a un covector. Non sono del tutto lo stesso in quanto hanno diverse unità: un covector ha unità di lunghezza inversa mentre un bivettore ha unità di lunghezza quadrati (area), in modo che si comportano diversamente in scala. Tuttavia, si trasformano allo stesso modo rispetto al loro orientamento, che è ciò che conta per le normali. Di solito non ci interessa la grandezza di un normale (li normalizziamo comunque comunque in unità di lunghezza), quindi di solito non dobbiamo preoccuparci della differenza tra un bivettore e un covector.


2
spiegazione fantastica. tuttavia un po 'veloce su 2 punti, un po' più di dettagli sarebbero amati: 1. come si passa dai prodotti punto a prodotti matrice? 2. tra le righe 2 e 3 dell'ultima sezione citata, cosa succede (n viene spostato magicamente da sinistra a destra un po 'magicamente per me)
v.oddou

4
1. (a ^ T) b è uguale al punto (a, b) se aeb sono matrici di colonne della stessa dimensione. Prova la matematica per te stesso! 2. (AB) ^ T = (B ^ T) (A ^ T) e (A ^ T) ^ T = A Per ulteriori identità di matrice, dai un'occhiata a The Matrix Cookbook
Mokosha,

3
@ v.oddou Sì, Mokosha ha ragione. Il prodotto punto può essere espresso come moltiplicando una matrice 1 × n (vettore riga) con una matrice × 1 (vettore colonna); il risultato è una matrice 1 × 1 il cui singolo componente è il prodotto punto. La trasposizione di un vettore di colonna è un vettore di riga, quindi possiamo scrivere a · b come a ^ T b. Per la seconda domanda, trasporre un prodotto di matrici equivale a trasporre i singoli fattori e invertire il loro ordine.
Nathan Reed,

perfetto, è tutto chiaro senza problemi ora. grazie ad entrambi.
v.oddou,

@NathanReed (Accidenti, questo mi riporta ai primi giorni di PowerVR in cui abbiamo modellato la maggior parte delle cose con gli aerei). Potrebbe anche valere la pena ricordare che, a fini di ottimizzazione, se si dispone di una matrice Mr che contiene solo rotazioni, (ovvero è ortogonale), quindi Inverse ( Mr ) = Transpose ( Mr ), e quindi Trans (Inverse ( Mr ) = _ Mr_. Puoi anche prendere scorciatoie con la parte di traduzione e se sai che il ridimensionamento è uniforme. FWIW nella libreria grafica SGL PowerVR, eravamo soliti mantenere booleani per monitorare se una matrice di trasformazione avesse queste proprietà per risparmiare sui costi con le normali trasformazioni.
Simon F

6

Questo semplicemente perché i normali non sono realmente vettori! Sono creati da prodotti incrociati, che si traducono in bivettori , non vettori. Algebra funziona in modo molto diverso per queste coordinate e la trasformazione geometrica è solo un'operazione che si comporta diversamente.

Una grande risorsa per saperne di più su questo è la presentazione di Eric Lengyel su Grassman Algebra .


I normali sono anche i cosiddetti pseudovettori. Come generalizzazione e regola empirica, tutto ciò che risulta da un prodotto incrociato (ad esempio gli aerei) verrà trasformato in modo simile.
Matthias,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.