Przeznaczenie macierzy rzutowania widoku modelu

102

Do jakich celów używamy macierzy rzutowania widoku modelu? Dlaczego shadery wymagają macierzy rzutowania widoku modelu?

Yuriy Vikulov
źródło
12
Wystarczy sprawdzić ten link: songho.ca/opengl/gl_transform.html
iKushal,
3
Zaproponowałem otwarcie witryny Stack Exchange poświęconej grafice komputerowej i wybrałem to pytanie jako przykładowe . Śledź computergraphics.stackexchange.com, jeśli chcesz zobaczyć uruchamianie strony!
wyczyść

Odpowiedzi:

196

Macierze modelu, widoku i rzutowania to trzy oddzielne macierze. Modeluj mapy z lokalnej przestrzeni współrzędnych obiektu do przestrzeni świata, widok z przestrzeni świata do przestrzeni kamery, projekcja z kamery na ekran.

Jeśli skomponujesz wszystkie trzy, możesz użyć jednego wyniku do odwzorowania całej drogi od przestrzeni obiektu do przestrzeni ekranu, dzięki czemu będziesz w stanie ustalić, co musisz przekazać do następnego etapu programowalnego potoku z nadchodzących pozycji wierzchołków.

W starych potokach o stałej funkcjonalności stosowałeś model i widok razem, a następnie opracowywałeś oświetlenie używając innego wyniku uzyskanego z nich (z pewnymi poprawkami, aby np. Normalne nadal miały długość jednostkową, nawet jeśli zastosowałeś skalowanie do obiektu ), a następnie zastosuj rzut. Widać to odzwierciedlone w OpenGL, który nigdy nie oddziela modelu i nie wyświetla macierzy - zachowując je jako pojedynczy stos macierzy widoku modelu. Dlatego czasami widzisz to odzwierciedlone w shaderach.

Tak więc: skomponowana macierz projekcji widoku modelu jest często używana przez shadery do mapowania z wierzchołków załadowanych dla każdego modelu na ekran. Nie jest to wymagane, jest wiele sposobów osiągnięcia tego samego, jest to zwyczajne, ponieważ umożliwia wszystkie możliwe transformacje liniowe. Z tego powodu słabiej skomponowana wersja była również normą w starym świecie stałych rurociągów.

Tommy
źródło
3
więc dla kilku obiektów (siatek) potrzebujemy kilku macierzy modelView, prawda?
Yuriy Vikulov
5
Zakładając, że mogą poruszać się niezależnie lub zostały umieszczone oddzielnie, to tak. Jest to więc najczęstszy sposób postępowania - przekazanie modelView lub projectionModelView jako uniforma do programu cieniującego, po skonfigurowaniu go dla bieżącego modelu na procesorze.
Tommy,
Cześć Tommy, czy możesz zasugerować dowolny przykładowy kod funkcji panoramowania w Opengl Es2.0 w systemie Android, używając tej macierzy rzutowania widoku modelu, jeśli to możliwe. Skierowałem więcej linków, nie mogłem uzyskać żadnego jasnego pomysłu. Jeśli jakiś przykładowy kod oznacza, jest to dla mnie łatwe do zrozumienia ..
harikrishnan
1
Mam pytanie. Jeśli openGL używa macierzy MV jako jednego i gdybyśmy przeszli z przestrzeni kamery do przestrzeni świata, musielibyśmy odwrócić (macierz projekcji * macierz widoku) * (pozycja kursora), ale jeśli widok modelu jest jedną złożoną macierzą. jak oddzielić model od macierzy widoku, aby móc użyć macierzy widoku do tych obliczeń. Więc muszę je rozdzielić?
Evren Bingøl
@ EvrenBingøl Czy otrzymałeś już odpowiedź? Oddzieliłem model i matryce widoku, ale chciałbym poznać rzeczywistą odpowiedź na Twoje pytanie, czy powinienem nadal go rozdzielać, czy nie.
tom_mai78101
9

Ponieważ macierze są wygodne. Macierze pomagają przekształcić lokalizacje / kierunki w odniesieniu do różnych przestrzeni (przestrzeń można zdefiniować za pomocą 3 prostopadłych osi i początku).

Oto przykład z książki określonej przez @ legends2k w komentarzach.

Mieszkańcy Kartezji posługują się mapą swojego miasta, której początki są dość sensownie wyśrodkowane w centrum miasta i osie skierowane wzdłuż kardynalnych punktów kompasu. Mieszkańcy Dysleksji używają mapy swojego miasta, na której współrzędne są wyśrodkowane w dowolnym punkcie, a osie biegną w dowolnych kierunkach, co prawdopodobnie wydawało się wówczas dobrym pomysłem. Mieszkańcy obu miast są bardzo zadowoleni ze swoich map, ale stanowy inżynier ds. Transportu, któremu powierzono zadanie przygotowania budżetu na pierwszą autostradę między Kartezją a Dysleksją, potrzebuje mapy ze szczegółami obu miast, która w związku z tym wprowadza trzecią współrzędną system, który jest lepszy od niego, choć niekoniecznie od kogokolwiek innego.

Oto kolejny przykład,

Załóżmy, że w grze stworzyłeś samochód z pozycjami jego wierzchołków przy użyciu współrzędnych świata. Przypuśćmy, że musisz użyć tego samego samochodu w innej grze w zupełnie innym świecie, musisz ponownie zdefiniować pozycje, a obliczenia będą skomplikowane. Dzieje się tak, ponieważ ponownie musisz obliczyć pozycje okien, maski, reflektorów, kół itp. W samochodzie w odniesieniu do nowego świata.

Obejrzyj ten film, aby zrozumieć koncepcje modelu, widoku i projekcji. (wysoce rekomendowane)

Następnie zobacz to, aby zrozumieć, w jaki sposób wierzchołki świata są reprezentowane jako Matryce i jak są przekształcane.

cegprakash
źródło
Jeśli dobrze się nad tym zastanowisz, zdasz sobie sprawę, że chociaż transformacja jest oparta na pochodzeniu obiektu (tj. Pojedynczym punkcie), wszystkie wierzchołki obiektu (siatka / model formalnie) zostaną przekształcone, tj. Wszystkie 1000 wierzchołków zostanie pomnożonych przez macierz modelu. Dlatego twój punkt widzenia nie jest dobrze sformułowany. Macierz modelu to po prostu macierz, która przekształca wierzchołki w przestrzeni modelu w przestrzeń świata. Nie ma tu żadnej korzyści z wydajności, to tylko wygoda.
legends2k
Jeśli tak, dlaczego po prostu nie reprezentują każdego punktu w jednej przestrzeni 3D? Powinno przynieść korzyści, jeśli użyjesz wyjścia sceny do innej sceny, która może być wejściem do innej sceny ruchomej :)
cegprakash
1
Nie reprezentują wszystkich wierzchołków w pojedynczej przestrzeni, ponieważ wygodniej jest pracować w przestrzeni względnej niż w większej przestrzeni, takiej jak świat. Powiedzmy, że robot, gdy otrzyma polecenie przesunięcia się o 2 metry do przodu, robienie tego przekręconym okiem jest dla niego bardziej odpowiednie niż zlokalizowanie centrum świata, a następnie obliczenie odpowiednich współrzędnych.
legends2k
Myślę, że masz rację. W każdym razie Fragment Shader zostanie wywołany dla każdego piksela i będziemy wykonywać mnożenie macierzy dla każdego piksela w przypadku złożonych siatek. : |
cegprakash,
2
W Fragment Shader wykonywane są tylko obliczenia oświetlenia / kolorowania, zanim dane dotrą do Fragment Shadera, wszystkie obliczenia pozycji są zakończone (tj. W Vertex Shader); Lepsze wyjaśnienie, dlaczego należy używać wielu układów współrzędnych, znajduje się tutaj . Ta książka to doskonałe źródło matematyki w grach 3D. Ten sam rozdział, co przykładowy plik PDF ze strony internetowej książki .
legends2k