Co reprezentuje matryca?

19

Ostatnio zacząłem uczyć się OpenGL i mam problemy z wizualizacją, czym są macierze i ich rola w grafice komputerowej. Biorąc pod uwagę szablon matrycy 4x4:

wprowadź opis zdjęcia tutaj

Zakładam, że każda taka macierz to współrzędne wierzchołka w przestrzeni świata. A kilka z nich połączonych i zacienionych daje obiekt?

Ale dlaczego istnieje a Xx, a Xyi an Xz? Czytam, że jest to inna oś (góra, lewo, przód), ale wciąż nie potrafię zrobić znaczących głów ani ogonów.

Smutny programista CRUD
źródło

Odpowiedzi:

19

Macierze w grafice komputerowej to przekształcenia podane dla każdej współrzędnej w modelu. Każda macierz jest kombinacją wielu przekształceń stosowanych do współrzędnych (punkt w 3-przestrzeni).

Budowanie transformacji opiera się na jednym z trzech typów transformacji: Tłumacz, Obróć i Skaluj.

Macierz tłumacząca jest czymś w rodzaju:

Matryca tłumaczeń

I macierz skali: Macierz skali

Macierze rotacji wyglądają następująco:

wprowadź opis zdjęcia tutaj

Aby połączyć dowolną z tych macierzy, wystarczy pomnożyć je razem. Aby zastosować transformację do wierzchołka, wystarczy pomnożyć go do wierzchołka (jak pokazano na diagramie translacji).

Alex Shepard
źródło
4
O, więc macierze nie reprezentują punktów. Jestem teraz podekscytowany
Sad CRUD Developer
Wiele razy są one stosowane do obiektu lub rzutni jako całości (w ten sposób uzyskuje się widoki orto vs. widoki perspektywiczne)
Alex Shepard
3
@BDillan: Nie, ale z pewnością mogą zawierać punkty. Na przykład ostatnia kolumna w matrycy ModelView (GL / column-major) określa sposób tłumaczenia źródła. Innymi słowy, określa, gdzie oko znajduje się w przestrzeni świata i może być dosłownie użyte jako punkt samo w sobie.
Andon M. Coleman,
twoja współrzędna 3-krotna. dlaczego macierz nie jest 3 razy 3? Załóżmy, że potrafimy połączyć trzy rodzaje transformacji w jedną matrycę i nadal mieć wystarczająco dużo miejsca, co wtedy robi prawy dolny róg, wygląda na to, że zawsze ma wartość 1?
n611x007
Czwarty wiersz / kolumna jest specjalnie do tłumaczenia. Jedną z najpiękniejszych cech matematyki matematycznej jest to, że mogę łączyć wszystkie tłumaczenia i rotacje, które chcę osiągnąć, w jedną macierz. Oznacza to, że bardzo złożone zbiory transformacji (teoretycznie nieskończone) można skompresować do 1 macierzy. Tak, ta ostatnia komórka pozostaje 1, ale pozwala nam wykonać resztę matematyki.
Alex Shepard
10

W grafice komputerowej używamy macierzy do kodowania transformacji .

Macierze zawierające tylko transformacje translacji, obrotu lub skalowania mają powszechnie wykorzystywaną interpretację: górny lewy 3x3 matrycy zawiera tylko dane rotacji lub skali, dolny wiersz lub prawa kolumna zawiera dane translacji. To nie ogólność, ale posiada dość często dla podzbioru przemian przedstawionych w grafice komputerowej, że ludzie wykorzystują to prawda.

Podobnie istnieje związek między wartościami macierzy i odpowiadającymi im ramkami współrzędnych reprezentowanymi przez macierz (co nie zawsze jest „przestrzenią świata”, muszę zauważyć). Lewe górne kolumny 3x3 (lub rzędy) reprezentują osie X, Y i Z ramy współrzędnych.

To, czy wiersze reprezentują osie, czy kolumna, zależy od tego, czy używasz konwencji mnożenia jako row vector * matrixczy matrix * column vector. Podczas mnożenia macierzy wewnętrzne wymiary dwóch macierzy muszą się zgadzać, a więc to, czy reprezentujesz wektory jako macierze rzędów, czy macierzy kolumn, wpływa na ten wybór (OpenGL i tradycyjna matematyka preferują wektory kolumnowe).

Polecam zdobyć dobrą książkę na temat algebry liniowej lub przynajmniej zajrzeć do Matrix and Quaternion FAQ i tego postu na temat układów matryc w DirectX i OpenGL .

wjl
źródło
mam mnóstwo „dobrych” książek o algebrze liniowej, z których część nawet przeczytałem i zrozumiałem. Chodzi o to, że to trochę nie pomaga, nie dlatego, że je mam, że tego nie rozumiem. Mam wrażenie, że twoja ostatnia rada odpowiada na błędne założenie.
n611x007
9

Co to jest matryca?

Macierz z mkolumnami i nwierszami reprezentuje funkcję, która zużywa wektor * z melementami (lub współrzędnymi) i wytwarza wektor z nelementami.

Z tego można zaobserwować, że jeśli tylko macierz jest kwadratowa, wymiar wektora nie ulegnie zmianie. Na przykład. otrzymujesz wektor 3D z transformacji wektora 3D, 2D z 2D itp.

* : W fizyce wektory są zwykle używane do wskazywania sił lub innych „wpływów”, które „poruszają się” wokół rzeczy, takich jak prędkość lub przyspieszenie. Ale nic nie stoi na przeszkodzie, abyś użył wektora do reprezentowania punktu lub dowolnej dowolnej tablicy liczb (niektóre biblioteki i języki programowania używają nawet „wektora”, co oznacza „tablicę 1D”). Do użytku z macierzami wszystko może być elementami wektora (nawet łańcuchy lub kolory), o ile istnieje możliwość dodawania, odejmowania i mnożenia ich przez dowolne elementy macierzy. Stąd wektor nazw , który oznacza „nośnik” - przenosi lub przechowuje wartości dla Ciebie.

Co oznacza mnożenie przez macierz?

Więc jeśli macierz jest funkcją, jaki rodzaj funkcji ? Do czego służy ta funkcja? Przepis na to określają elementy macierzy. Nazwijmy dane wejściowe u, wyjściowe v, macierz M(mnożenie M*u=vjest wtedy takie samo jak f(u)=v) i u(i)daje ielement th u(na przykład drugi element to współrzędna y). Dla matrycy M(i,j)oznacza wiersz i, kolumnę j.

Konstrukcja elementu v(1), pierwsza w wyniku, opisana jest przez pierwszy rząd macierzy. u(1)razy M(1,1)plus u(2)razy M(1,2)... plus u(i)razy M(1,i). Matryca jest trochę jak bardzo prosty język programowania, który nadaje się tylko do programowania funkcji, które działają poprzez tasowanie danych wejściowych, dodawanie ich do siebie itp. **

Warto sobie wyobrazić, że pracujesz nad jednym elementem wyniku naraz, dlatego używasz tylko jednego wiersza macierzy na raz. Piszesz upoziomo. Piszesz i-ty rząd Mpod nim. Mnożycie każdą parę powyżej / poniżej i piszesz poniższe produkty, a następnie sumujesz produkty. Powtórz dla każdego wiersza, aby uzyskać każdy element v. (Teraz widzicie, dlaczego mprzez nmacierz musi działać na mwektorze i wytwarzają nwektor).

Inny sposób myślenia o tym - powiedzmy, że wykonujemy transformację 3D na 3D, więc macierz 3x3 (lub transformacja 3D, jak się często nazywa, ponieważ można udawać, że ta „funkcja” przesuwa punkty 3D, chociaż tak naprawdę jest po prostu zmieniam liczby). Powiedzmy, że pierwszy rząd to [1 2 0]. Oznacza to, że aby uzyskać x wyniku, 1 wejścia x, 2 wejścia y i 0 wejścia z. To naprawdę przepis.

** : Jeśli matryca jest językiem programowania, oznacza to, że nawet Turing nie jest kompletny.

Co oznacza pomnożenie dwóch macierzy?

Jeżeli obie są matryce o odpowiedniej wielkości, to A*Bznaczy „stosuje się funkcję, która najpierw Bnastępnie A”. Możesz zobaczyć, dlaczego istnieją ograniczenia dotyczące rozmnażania, ponieważ rozmiar określa rozmiar danych wejściowych i wyjściowych, a jedna matryca zużywa dane wyjściowe drugiej. Dlaczego mnożenie oznacza łączenie funkcji? Łatwiej zauważyć, że tak musi być. Jeśli A*ujest taki sam jak f(u)i B*ujest taki sam, jak g(u)wtedy f(g(u))jest taki sam jak f(B*u)który jest taki sam jak A*(B*u).

Podobnie, wielokrotne zastosowania tej samej funkcji mogą być pokazane jako potęgi, ponieważ A*A*Aoznaczają zastosowanie funkcji, która Areprezentuje trzykrotnie.

Jak przydatne są macierze?

Co dobrego robi transformacja new_x = 1*x+2*y+0*z(jeśli pierwszy wiersz to [1 2 0])? To nie jest bardzo oczywiste, ale weźmy kolejną matrycę 2D, aby to wyjaśnić. Matryca to:

[ 0 1
  1 0 ]

Lub [0 1; 1 0]używając wygodnej notacji Matlab. Co robi ta matryca? Przekształca wektor 2D w taki sposób: dla x wyniku weź 1 y wartości wejściowej. Dla y wyniku weź 1 x wartości wejściowej. Właśnie zamieniliśmy współrzędne xiy wejścia - ta macierz odzwierciedla punkty wokół linii x = y. To trochę przydatne! Po rozszerzeniu zobaczysz, że wszystkie macierze z 1s wzdłuż linii SW - NE odzwierciedlają. Możesz także zobaczyć, dlaczego macierze tożsamości zwracają dane wejściowe (dla x wyjścia, weź x danych wejściowych; dla y wyniku, weź y danych wejściowych ...).

Teraz rozumiesz, dlaczego symbole są np. Xx, Yx- to znaczy ile wejściowych X, Yitp idzie do wyjścia x.

W jaki inny sposób przydatne są macierze?

Jaką inną transformację możesz zrobić? Możesz zmienić rozmiar, biorąc matrycę tożsamości, ale z inną liczbą niż 1 wzdłuż przekątnej. Na przykład, [2.5 0; 0 22.5]pomnoży każdą współrzędną wejścia przez 2,5, a jeśli zastosujesz tę macierz do każdego punktu na obrazie, obraz będzie miał 2,5 wielkości. Jeśli umieścisz tylko 2,5 w jednym rzędzie ( [2.5 0; 0 1]), tylko współrzędna x zostanie pomnożona, więc rozciągniesz tylko wzdłuż x.

Inne matryce mogą dawać inne przekształcenia, takie jak „wypaczanie”, które mają różny stopień użyteczności. Osobiście pochylanie jest moim najmniej ulubionym, ponieważ matryca wygląda tak prosto, ale sama transformacja rzadko robi cokolwiek poza zaklęciem obrazu. Przydatnym jest „obrót” - jak obrócić punkt? Spróbuj obliczyć pozycję punktu (x, y)po obróceniu o thetastopień w kierunku przeciwnym do ruchu wskazówek zegara wokół początku. Przekonasz się, że nowe współrzędne xiy wynikają z pomnożenia starego xiy przez niektóre sinus i cosinus theta. Powinieneś być w stanie łatwo napisać macierz obrotu za pomocą sinusów i cosinusów, które odpowiadają tej funkcji.

Za pomocą macierzy innych niż kwadratowe można również zmienić wymiar wejściowy. Przekształcanie wejścia 2D w 3D nie jest zbyt przydatne, ponieważ trudno jest „wyprodukować” coś, co można by umieścić w nowej współrzędnej, ale 3D w 2D jest bardzo użyteczny. Między innymi w ten sposób twój komputer potrafi rzutować *** scenę 3D na obraz 2D, aby narysować go na monitorze.

Ponieważ wektory mogą zawierać różne rzeczy, możesz nawet opisać macierz, która szyfruje ciąg n-znaków naraz, tasując je lub „mnożąc” (musiałbyś wymyślić funkcję mnożenia / dodawania).

*** : Kiedy projektujesz , bierzesz obiekt 3D, taki jak rzeźba, świecisz na nim światło i widzisz, jaki cień 2D spada na ścianę.

Jakie są ograniczenia macierzy?

Czy możesz wykonać każdą funkcję za pomocą macierzy? Nie. Myśląc graficznie, trudno sobie wyobrazić coś, czego nie mogłaby zrobić matryca (ale istnieje: na przykład nie można zrobić efektu „zawirowania”). Oto prosty przykład: załóżmy, że funkcja fjest taka, że f(u)zwraca u każdy kwadrat do kwadratu . Przekonasz się, że nie możesz napisać do tego macierzy: w przypadku macierzy istnieje tylko funkcja opisywania przepisów, które mnożą współrzędne przez stałą liczbę, nie można wyrazić innych wymyślnych funkcji, takich jak moc.

**** : Dlatego nazywa się to algebrą liniową - funkcja mocy jest nieliniowa , nie tworzy linii prostej podczas kreślenia.

W dziwnym dodatkowym rzędzie w matrycach 4D

Dlaczego macierz w twoim przykładzie 4 na 4? Czy to nie oznacza 4-wymiarowej przestrzeni? Nie mamy komputerów 4D, więc dlaczego? To właściwie interesująca sztuczka z matrycami, która odnosi się do poprzedniego punktu dotyczącego operacji liniowych.

Jeśli chodzi o funkcje, których nie można wykonać za pomocą macierzy: co to jest macierz służąca do przesuwania punktu 2D o 2 jednostki w prawo (co powoduje powstanie punktu (x+2, y)? Ponownie utkniemy. Istnieje sposób na pomnożenie danych wejściowych, ale nie ma możliwości dodania w pracy 2D, sztuczka polega na udawaniu, że tak naprawdę nie jesteś w przestrzeni 2D, ale w przestrzeni 3D, z wyjątkiem tego, że wysokość (współrzędna Z lub 3. element) zawsze wynosi 1 (to trochę tak, jak we wszechświecie 2D po prostu „płyta” leżąca płasko na podłodze wszechświata 3D - w tym przypadku trzecia współrzędna ma zawsze wartość 0. Następnie możesz użyć tej magicznej ostatniej współrzędnej jako stałej, ponieważ wiesz, że zawsze jest to 1 dla każdego wejścia.

Podobnie do przemieszczania punktów 3D potrzebne są współrzędne 4D. Dlatego też wszystkie macierze transformacji 3D, które widzisz, będą miały [0 0 0 1]jako ostatni wiersz - nigdy nie wolno zmieniać czwartego wymiaru, w przeciwnym razie wynik będzie zbyt skomplikowany, aby przedstawić go w 3D!

Superbest
źródło
więc jak zrobić macierz do dodania? powiedzmy, że wiersz to Xx Yx Zx Tx... a ostatni wiersz jest tak 0t 0t 0t 1tjak zastąpiony Xt Yt Zt Tt. Aby zrobić (x+2, y)z (x, y)ciebie, możesz odejść 1x 0y 0z 2t, co dałoby ci 1*x + 0*y + 0*z + 2*1od t=1razu, prawda? Co właściwie wynosi x + 2. Och, kochanie, teraz możesz popsuć renderowanie śmiesznymi wartościami T, prawda? -grin- (długi odczyt, wciąż najlepsza wartość, thx)
n611x007
2

Jest to matryca z kolumnami 4x4, a na pierwszy rzut oka macierz widoków.

Pierwsze 3 kolumny określają kierunek wektorów bazowych (w górę, w lewo, do przodu, jak je nazwałeś), a ostatnia kolumna określa przesunięcie punktu oka. Złóż je razem, aby opisać orientację kamery, a co ważniejsze, możesz użyć tej macierzy do przekształcenia punktów w przestrzeń współrzędnych znaną jako „przestrzeń oka”, „przestrzeń widzenia” lub „przestrzeń kamery”.

Są to synonimy tej samej przestrzeni współrzędnych. Niestety musisz nauczyć się wszystkich synonimów, mając do czynienia z grafiką komputerową, ponieważ różne książki i ludzie będą je nazywać różnymi nazwami. Większość przestrzeni współrzędnych ma wiele nazw.

Nawiasem mówiąc, trzy kolumny macierzy widoku są zazwyczaj ortogonalne, to znaczy tworzą względem siebie kąty proste. Nie jest to wymagane, ale jest to bardzo powszechna właściwość przy konstruowaniu tradycyjnej kamery.

Andon M. Coleman
źródło
1

Wersja TL; DR:

Pierwsze trzy elementy [x y z]w każdym rzędzie reprezentują pojedynczy wektor bazowy transformowanego układu współrzędnych. Ostatni element wto komponent tłumaczący.

Wersja długa

Jeśli chcesz macierz, która po nałożeniu na wierzchołek obracałaby wierzchołek wokół początku o, powiedzmy, o 45 stopni, wypełniłbyś macierz trzema wektorami reprezentującymi transformowane osie:

  • Punkt ina xosi [1 0 0], ale obrócony o 45 stopni. Jest to po prostu [i_x i_y i_z], w którym i_xi i_ysą nogi trójkąta o 45 stopni wewnętrzny kąt względem osi X: [cos(45) sin(45) 0].
  • Punkt jna osi y [0 1 0], ale obrócony o 45 stopni od tej osi. Naszkicuj go na kartce papieru, a zobaczysz, że podczas obracania w lewo elementy stają się [-sin(45) cos(45) 0].
  • Punkt kna zosi. W tym przykładzie znie ma to wpływu, ponieważ obracamy się w płaszczyźnie xy (wyrównanej do ekranu)

Mamy więc trzy nowe wektory: i, j, k. Łatwym sposobem na wizualizację tego jest po prostu przyjęcie osi X i Y i obrócenie całego układu krzyża.

Jak umieścić je w matrycy?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

Lub

 cos(45)  sin(45)    0
-sin(45)  cos(45)    0
    0        0       1

Jeśli pomnożysz dowolny wierzchołek przez tę macierz, otrzymasz

v1_x = v_x cos(Θ)     - v_y sin(Θ) + v_z * 0
V1_y = v_x*sin(Θ)    + v_y cos(Θ) + v_Z * 0
V1_z = v_x * 0        + v_y * 0    + v_z * 1

bo v = [1 0 0]i Θ = 90°tak się staniev1 = [0 1 0]

Do tłumaczenia dodajemy czwarty wiersz i kolumnę, a składniki tłumaczenia umieszczamy w ostatniej kolumnie. Dodajemy czwarty składnik do wierzchołka, wktóry zwykle jest 1. Dzieje się tak, gdy mnożąc wierzchołek przez macierz, składnik w powoduje dodanie ostatniej kolumny do wierzchołka wejściowego, tak że wierzchołek jest przenoszony lub tłumaczony. Nazywamy te „jednorodnymi współrzędnymi”. (Dla naszych celów „jednorodny” oznacza po prostu, że ww każdym wektorze jest czwarty składnik , a my używamy macierzy 4x4 zamiast 3x3. Często zobaczysz shadery, które używają matryc 4x3, aby uniknąć wysyłania najczęściej bezużytecznego czwartego rzędu do procesora graficznego, który zużywa cenną pamięć i przepustowość. Czwarty rząd jest potrzebny do projekcji perspektywicznej, ale niewiele więcej.)

Mam nadzieję że to pomoże.

3Dave
źródło
2
Moment, w którym zdajesz sobie sprawę, że właśnie odpowiedziałeś na pytanie, na które odpowiedziałeś już trzy lata temu ...
3Dave
: P Zawsze patrz na pytanie, zanim
odpowiesz