Co robi glLoadIdentity () w OpenGL?

133

Jestem nowy w OpenGL i jestem trochę przytłoczony wszystkimi przypadkowymi funkcjami, które mam w swoim kodzie. Działają i wiem, kiedy ich używać, ale nie wiem, dlaczego ich potrzebuję i co właściwie robią.

Wiem, że glLoadIdentity()zastępuje obecną macierz macierzą tożsamości, ale co to właściwie robi? Jeśli każdy program tego wymaga, dlaczego macierz tożsamości nie jest domyślnie, chyba że określono inaczej? Nie lubię mieć funkcji w swoim kodzie, chyba że wiem, co one robią. Powinienem zauważyć, że używam OpenGL wyłącznie dla bogatych klientów 2D, więc wybacz moją ignorancję, jeśli jest to coś bardzo oczywistego dla 3D.

Także trochę mylić o glMatrixMode(GL_PROJECTION)VS glMatrixMode(GL_MODELVIEW).

Aleksandra
źródło

Odpowiedzi:

140

Macierz tożsamości, pod względem macierzy projekcji i widoku modelu, zasadniczo resetuje macierz z powrotem do stanu domyślnego.

Jak masz nadzieję, wiesz, glTranslatei glRotatezawsze są one zależne od aktualnego stanu matrycy. Na przykład, jeśli dzwonisz glTranslate, wykonujesz tłumaczenie z bieżącej pozycji macierzy, a nie z początku. Ale jeśli chcesz zacząć od początku od początku, wtedy wywołujesz glLoadIdentity(), a następnie możesz glTranslatez macierzy, która jest teraz zlokalizowana w początku, lub glRotatez macierzy, która jest teraz zorientowana w domyślnym kierunku.

Myślę, że odpowiedź Boon, że jest to odpowiednik 1, nie jest do końca poprawna. Macierz faktycznie wygląda tak:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

To jest macierz tożsamości. Boon ma rację matematyczną, że każda macierz pomnożona przez tę macierz (lub macierz, która wygląda tak; diagonalne, wszystkie inne 0s) da w wyniku oryginalną macierz, ale nie sądzę, aby wyjaśnił, dlaczego jest to ważne.

Powodem, dla którego jest to ważne, jest fakt, że OpenGL mnoży wszystkie pozycje i obroty w każdej macierzy; więc kiedy na przykład rysujesz wielokąt ( glBegin(GL_FACE)kilka punktów glEnd()), przekształca go on w „przestrzeń świata” mnożąc go przez WIDOK MODELU, a następnie przekłada z 3D na 2D, mnożąc go przez macierz PROJEKTU, co daje punkty 2D na ekranie wraz z głębią (z „kamery” ekranu), której używa do rysowania pikseli. Ale kiedy jedna z tych macierzy jest macierzą tożsamości, punkty są mnożone przez macierz tożsamości i dlatego nie są zmieniane, więc macierz nie ma wpływu; nie dokonuje translacji punktów, nie obraca ich, pozostawia je bez zmian.

Mam nadzieję, że to wyjaśnia trochę więcej!

Ricket
źródło
1
Oznacza to, że OpenGL utrzymuje macierz „Master” lub „Global”, a każda kolejna macierz jest stosowana względem tej macierzy „Master” lub „Global”. Czy mam rację?
user366312
42

Macierz tożsamości jest odpowiednikiem liczby 1 dla liczby. Jak wiesz, każda liczba, która mnoży się przez 1, jest sobą (e.g. A x 1 = A),

To samo dotyczy matrycy ( MatrixA x IdentityMatrix = MatrixA).

Tak więc ładowanie macierzy tożsamości jest sposobem na zainicjowanie macierzy do właściwego stanu przed pomnożeniem kolejnych macierzy do stosu macierzy.

glMatrixMode(GL_PROJECTION) : zajmuje się macierzami używanymi przez transformację perspektywiczną lub transformację ortogonalną.

glMatrixMode(GL_MODELVIEW): zajmuje się macierzami używanymi przez transformację widoku modelu. To znaczy, aby przekształcić swój obiekt (inaczej model) w przestrzeń współrzędnych widoku (lub przestrzeń kamery).

Dar
źródło
7

Macierz projekcji służy do tworzenia przestrzeni wyświetlania. Wyobraź sobie scenę w prawdziwym świecie. Tak naprawdę nie widzisz wszystkiego wokół siebie, tylko to, na co pozwalają twoje oczy. Jeśli na przykład jesteś rybą, widzisz rzeczy nieco szersze. Więc kiedy mówimy, że ustawiamy macierz projekcji, mamy na myśli to, że ustawiamy to, co chcemy zobaczyć ze sceny, którą tworzymy. Mam na myśli, że możesz rysować obiekty w dowolnym miejscu na świecie. Jeśli nie znajdują się one w obszarze widoku, nic nie zobaczysz. Tworząc przestrzeń widoku, wyobraź sobie, że tworzysz 6 płaszczyzn tnących, które definiują twoje pole widzenia.

Jeśli chodzi o macierz modelu, służy ona do dokonywania różnych transformacji modeli (obiektów) w Twoim świecie. W ten sposób wystarczy zdefiniować obiekt tylko raz, a następnie przetłumaczyć go, obrócić lub przeskalować.

Możesz użyć macierzy projekcji przed narysowaniem obiektów na scenie, aby ustawić objętość widoku. Następnie rysujesz obiekt i odpowiednio zmieniasz macierz modelu. Oczywiście możesz zmienić swoją macierz w trakcie rysowania modeli, jeśli na przykład chcesz narysować scenę, a następnie narysować tekst (który z niektórymi metodami możesz łatwiej pracować w rzutowaniu ortograficznym), a następnie zmienić z powrotem na macierz widoku modelu.

Jeśli chodzi o nazwę modelview, wiąże się ona z dwoistością transformacji modelowania i przeglądania. Jeśli cofniesz kamerę o 5 jednostek lub przesuniesz obiekt o 5 jednostek do przodu, to w zasadzie to samo.

Mam nadzieję, że rzuciłem trochę światła

niebieski
źródło
2

Macierz tożsamości jest używana do „inicjalizacji” macierzy do rozsądnych wartości domyślnych.

Należy sobie zdawać sprawę, że mnożenie macierzy jest w pewnym sensie addytywne. Na przykład, jeśli weźmiesz macierz, która zaczyna się od macierzy tożsamości, pomnożymy ją razy macierz rotacji, a następnie pomnożymy ją przez macierz skalowania, otrzymamy macierz, która obraca i skaluje macierze, względem których jest mnożona.

dicroce
źródło
0

Podsumowując to, co powiedzieli inni, macierz tożsamości jest taką macierzą, że kiedy pomnożymy przez nią wektor / macierz, otrzymamy ten sam wektor / macierz. Jest to odpowiednik liczby 1 z mnożeniem lub liczby 0 z dodawaniem.

glLoadIdentity () jest przestarzałą funkcją i zachęcamy do zarządzania własnymi macierzami.

Thomas K.
źródło
-1

glLoadIdentity() funkcja zapewnia, że ​​za każdym razem, gdy wejdziemy w tryb projekcji, matryca zostanie zresetowana do macierzy identyczności, dzięki czemu nowe parametry podglądu nie będą łączone z poprzednim.

Srinath ks
źródło