Dlaczego transponowana odwrotność macierzy widoku modelu służy do transformacji wektorów normalnych?

22

Podczas renderowania scen 3D z transformacjami zastosowanymi do obiektów normalne muszą zostać przekształcone za pomocą transponowanej odwrotności macierzy widoku modelu. Zatem przy normalnym , modelViewMatrix M , przekształcona normalna n jestnMn

n=(M1)Tn

Podczas przekształcania obiektów jasne jest, że normalne muszą zostać odpowiednio przekształcone. Ale dlaczego matematycznie jest to odpowiednia macierz transformacji?

Nero
źródło
Jeśli macierz modelu składa się z translacji, obrotu i skali, nie trzeba wykonywać odwrotnej transpozycji, aby obliczyć normalną macierz. Po prostu podziel normalną przez kwadratową skalę i pomnóż przez macierz modelu i gotowe. Możesz rozszerzyć tę funkcję na dowolną macierz z osiami prostopadłymi, po prostu oblicz kwadratową skalę dla każdej osi używanej macierzy. Szczegóły napisałem na moim blogu: lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html
Eric

Odpowiedzi:

22

Oto prosty dowód, że wymagana jest odwrotna transpozycja. Załóżmy, że mamy płaszczyznę zdefiniowaną równaniem płaszczyzny , gdzie n jest normą. Teraz chcę, aby przekształcić ten samolot za pośrednictwem macierzy M . Innymi słowy, chcę znaleźć nowe równanie płaszczyzny n M x + d = 0, które jest spełnione dla dokładnie tych samych wartości x , które spełniają poprzednie równanie płaszczyzny.nx+d=0nMnMx+d=0x

Aby to zrobić, wystarczy ustawić dwa równania równe. (Daje to możliwość arbitralnego skalowania równań płaskich, ale nie jest to ważne dla argumentu.) Następnie możemy ustawić d=d i odjąć go. Pozostało nam:

nMx=nx

Przepiszę to z kropkami wyrażonymi w notacji macierzowej (myślenie o wektorach jako macierzach 1-kolumnowych):

nTMx=nTx

Teraz, aby to spełnić dla wszystkich x , musimy mieć:

nTM=nT

Teraz rozwiązuję dla w kategoriach n ,nn

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

Presto! Jeśli punkty są przekształcane przez macierz M , wówczas normalne płaskie muszą przekształcać się przez odwrotną transpozycję M , aby zachować równanie płaskie.xMM

Jest to w zasadzie właściwość produktu kropkowego. Aby iloczyn kropkowy pozostał niezmienny po zastosowaniu transformacji, dwa wektory kropkowane muszą transformować w odpowiadający, ale różne sposoby.

Matematycznie można to opisać mówiąc, że normalny wektor nie jest zwykłym wektorem, ale rzeczą zwaną a kowektorem (inaczej wektor kowariantny, wektor podwójny lub postać liniowa). Kowektor jest zasadniczo zdefiniowany jako „rzecz, którą można kropkować wektorem, aby uzyskać niezmienny skalar”. Aby to osiągnąć, musi transformować za pomocą odwrotnej transpozycji macierzy działającej na zwykłych wektorach. Dotyczy to dowolnej liczby wymiarów.

Zwróć uwagę, że w 3D biwektor jest podobny do kowektora. Nie są do końca takie same, ponieważ mają różne jednostki: kowboj ma jednostki o odwrotnej długości, podczas gdy biwektor ma jednostki długości do kwadratu (pola), więc zachowują się inaczej podczas skalowania. Jednak przekształcają się w ten sam sposób w odniesieniu do ich orientacji, co ma znaczenie dla normalnych. Zwykle nie dbamy o wielkość normalnego (i tak zawsze normalizujemy je do długości jednostki), więc zwykle nie musimy martwić się różnicą między biwektorem a kowektorem.

Nathan Reed
źródło
2
niesamowite wyjaśnienie. jednak nieco szybciej z 2 punktami, trochę więcej szczegółów byłoby zachwyconych: 1. w jaki sposób skaczesz z produktów punktowych do produktów matrycowych? 2. między wierszami 2 i 3 ostatniej cytowanej sekcji, co się dzieje (n przesuwa się do mnie nieco magicznie z lewej na prawą)
w.oddou
4
1. (a ^ T) b jest taki sam jak kropka (a, b), jeżeli aib są macierzami kolumnowymi o tym samym wymiarze. Wypróbuj matematykę dla siebie! 2. (AB) ^ T = (B ^ T) (A ^ T) i (A ^ T) ^ T = A Aby uzyskać więcej tożsamości matrycowych, sprawdź Matrix Cookbook
Mokosha
3
@ v.oddou Tak, Mokosha ma rację. Iloczyn iloczynu można wyrazić jako pomnożenie macierzy 1 × n (wektor wiersza) przez macierz × 1 (wektor kolumny); wynikiem jest macierz 1 × 1, której pojedynczym składnikiem jest iloczyn punktowy. Transpozycja wektora kolumny jest wektorem wiersza, więc możemy zapisać · b jako ^ Tb. W przypadku drugiego pytania transpozycja iloczynu macierzy jest równoważna transpozycji poszczególnych czynników i odwróceniu ich kolejności.
Nathan Reed,
idealnie, wszystko jest teraz jasne bez problemu. dzięki obu.
v.oddou
@NathanReed (Boże, to przenosi mnie z powrotem do wczesnych dni PowerVR, w których modelowaliśmy większość rzeczy za pomocą samolotów). Warto również wspomnieć, że dla celów optymalizacji, jeśli macie matrycę Mr, która zawiera tylko obroty (tj. Jest ortogonalna), wówczas Inverse ( Mr ) = Transpose ( Mr ), a więc Trans (Inverse ( Mr ) = _ Mr_. Możesz również skorzystać ze skrótów z części do tłumaczenia i jeśli wiesz, że skalowanie jest jednolite. FWIW w bibliotece graficznej SGL PowerVR używaliśmy logicznych wartości, aby śledzić, czy macierz transformacji ma te właściwości, aby oszczędzać koszty przy normalnych transformacjach.
Simon fa
6

Jest tak po prostu dlatego, że normalne nie są tak naprawdę wektorami! Są tworzone przez produkty krzyżowe, w wyniku czego powstają biwektory , a nie wektory. Algebra działa znacznie inaczej dla tych współrzędnych, a transformacja geometryczna to tylko jedna operacja, która zachowuje się inaczej.

Świetnym źródłem informacji na ten temat jest prezentacja Erica Lengyela na temat Grassman Algebra .

ap_
źródło
Normalne są również tak zwanymi pseudowektorami. Jako ogólna zasada i ogólna zasada, wszystko wynikające z produktu krzyżowego (np. Płaszczyzny) zostanie przekształcone w podobny sposób.
Matthias,