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:
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 Xy
i 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.
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 * matrix
czymatrix * 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 .
źródło
Co to jest matryca?
Macierz z
m
kolumnami in
wierszami reprezentuje funkcję, która zużywa wektor * zm
elementami (lub współrzędnymi) i wytwarza wektor zn
elementami.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ściowev
, macierzM
(mnożenieM*u=v
jest wtedy takie samo jakf(u)=v
) iu(i)
dajei
element thu
(na przykład drugi element to współrzędna y). Dla matrycyM(i,j)
oznacza wierszi
, kolumnęj
.Konstrukcja elementu
v(1)
, pierwsza w wyniku, opisana jest przez pierwszy rząd macierzy.u(1)
razyM(1,1)
plusu(2)
razyM(1,2)
... plusu(i)
razyM(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
u
poziomo. Piszesz i-ty rządM
pod 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 elementv
. (Teraz widzicie, dlaczegom
przezn
macierz musi działać nam
wektorze i wytwarzająn
wektor).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*B
znaczy „stosuje się funkcję, która najpierwB
następnieA
”. 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śliA*u
jest taki sam jakf(u)
iB*u
jest taki sam, jakg(u)
wtedyf(g(u))
jest taki sam jakf(B*u)
który jest taki sam jakA*(B*u)
.Podobnie, wielokrotne zastosowania tej samej funkcji mogą być pokazane jako potęgi, ponieważ
A*A*A
oznaczają zastosowanie funkcji, któraA
reprezentuje 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: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ściowychX
,Y
itp idzie do wyjściax
.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 otheta
stopień 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
f
jest taka, żef(u)
zwracau
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!źródło
Xx Yx Zx Tx
... a ostatni wiersz jest tak0t 0t 0t 1t
jak zastąpionyXt Yt Zt Tt
. Aby zrobić(x+2, y)
z(x, y)
ciebie, możesz odejść1x 0y 0z 2t
, co dałoby ci1*x + 0*y + 0*z + 2*1
odt=1
razu, 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)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.
źródło
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 elementw
to 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:
i
nax
osi[1 0 0]
, ale obrócony o 45 stopni. Jest to po prostu[i_x i_y i_z]
, w którymi_x
ii_y
są nogi trójkąta o 45 stopni wewnętrzny kąt względem osi X:[cos(45) sin(45) 0]
.j
na 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]
.k
naz
osi. W tym przykładziez
nie 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?
Lub
Jeśli pomnożysz dowolny wierzchołek przez tę macierz, otrzymasz
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,
w
który zwykle jest1
. 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, żew
w 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.
źródło