2013-04-25 7 views
20

Próbuję zrozumieć, tworząc przestrzenie w OpenGL:obiektu, świata, aparat projekcyjny i przestrzenie w OpenGL

  1. przestrzeni obiektu kosmicznego

  2. Świat

  3. przestrzeni Camera

  4. Przestrzeń projekcyjna

Czy moje zrozumienie tych etapów jest prawidłowe?

  1. W „kostka” tworzony jest w centrum układu współrzędnych kartezjański, bezpośrednio w programie, wpisując współrzędne wierzchołków.

  2. Współrzędne są przekształcane we współrzędne wewnątrz "świata", co oznacza przesuwanie go w dowolne miejsce na ekranie.

Cóż, właściwie chciałbym, abyście sprawdzili moje zrozumienie tych dwóch terminów.


Teraz tworzę trójkąt na czarnym ekranie. Jak kod OpenGL pasuje do tych przestrzeni?

Działa domyślnie pod flagą GL_MODELVIEW, ale jest to drugi etap - przestrzeń światowa. Czy to oznacza, że ​​wywołanie glVertex3f() tworzy trójkąt w przestrzeni obiektu?

Gdzie jest przestrzeń kosmiczna?


Ponadto, czytałem, że ostatnie dwie przestrzenie nie są częścią potoku OpenGL (lub jakkolwiek to się nazywa). Jednak OpenGL zawiera flagi takie jak GL_PROJECTION, na przykład:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glViewport(0, 0, w, h); // w - width, h - height 
gluPerspective(45, ratio, 1, 100); // radio = w/h 
glMatrixMode(GL_MODELVIEW); 

Co to kod zrobić? Ustawia perspektywę. Czy tworzy oś Z? Ale czy to już nie jest część przestrzeni przedmiotowej?

+2

Mam nadzieję, że tak naprawdę nie "wpiszesz" geometrii obiektu (z wyjątkiem bardzo prostych). Powinieneś załadować je z pliku. – datenwolf

Odpowiedz

35

1) Przestrzeń obiektu to wierzchołki obiektu względem punktu początkowego obiektu. W przypadku kostki 1x1x1, swoje wierzchołki byłoby:

(0.5, 0.5, 0.5) 
(-0.5, 0.5, 0.5) 
(0.5, -0.5, 0.5) 
(-0.5, -0.5, 0.5) 

itp

2) przestrzeń Świat jest, gdy obiekt znajduje się w swoim świecie. Jeśli chcesz, aby ta kostka znajdowała się pod numerem (15, 10), musisz utworzyć macierz tłumaczenia, która po pomnożeniu przez każdy z wierzchołków wyśrodkuje wierzchołki wokół wartości (15, 10). Na przykład pierwszy wierzchołek stanie się (15.5, 10.5, 0.5). Matryca, która ma przejść z obiektu do przestrzeni światowej, nazywana jest matrycą "modelu".

3) Przestrzeń oczna (czasami nazywana przestrzenią aparatu) to świat w stosunku do lokalizacji użytkownika.Ponieważ musi to być macierz, w której każdy wierzchołek jest pomnożony przez, jest to technicznie odwrotność orientacji kamery. To znaczy, jeśli chcesz mieć kamerę pod (0, 0, -10), twoja matryca "widoku" musi być tłumaczeniem (0, 0, 10). W ten sposób wszystkie obiekty na świecie przesuwają się o 10 jednostek, dzięki czemu wygląda tak, jakbyś cofnął się o 10 jednostek.

4) Przestrzeń projekcyjna to sposób, w jaki stosujemy poprawną perspektywę do sceny (zakładając, że nie używasz rzutowania ortogonalnego). To prawie zawsze jest reprezentowane przez stożek ścięty, a this article może wyjaśnić to lepiej niż ja. Zasadniczo mapujesz przestrzeń 3D na inną wypaczoną przestrzeń.

OpenGL zajmuje się przestrzenią klipu i miejscem na ekranie.


Działa na GL_MODELVIEW flaga domyślnie, ale to drugi etap - przestrzeń świata. Czy to oznacza, że ​​wywołanie glVertex3f() tworzy trójkąt w przestrzeni obiektu?

ustawić wierzchołki z glVertex3f() w przestrzeni obiektu zawsze. (W rzeczywistości jest to bardzo stary i powolny sposób, aby to zrobić, ale to naprawdę nie chodzi o to pytanie)

Po ustawieniu GL_MODELVIEW, to nic nie zmienia tylko macierz modelu (który można manipulować za pomocą glLoadMatrix, glTranslate, glRotate , glScale itp.).


Linia po linii, swój kawałek kodu jest w następujący sposób:

  1. Wszystkie transformacje będą teraz mieć wpływ na macierz projekcji.
  2. Usuń starą macierz projekcyjną i zastąp ją macierzą tożsamości.
  3. Użyj całego ekranu jako widoku.
  4. Ustaw matrycę projekcji na perspektywę z 45 stopniowym pionowym polem widzenia przy współczynniku kształtu w/h, płaszczyźnie bliskiej przycinania 1 jednostki dalej i oddalonej płaszczyźnie oddalonej o 100 jednostek.
  5. Wszystkie transformacje mają teraz wpływ na matrycę widoku modelu.

Oś Z już istnieje, to po prostu ustawia macierz projekcji, która daje perspektywy, mówi OpenGL, aby użyć całego okna do renderowania. To nie jest przestrzeń obiektu, to sposób przekształcania przestrzeni obiektu w przestrzeń projekcyjną.


Nawiasem mówiąc, używasz naprawdę starego OpenGL (1992 rok). glTranslate itp. zostały odrzucone dawno temu i teraz są po prostu usuwane z interfejsu API. Jedynym powodem, dla którego możesz nadal z nich korzystać, jest to, że kierowcy trzymają je tam ze względu na kompatybilność. Polecam zajrzeć do korzystania z nowoczesnych (3.0+) OpenGL. Nowoczesne rurociągi graficzne są kilka rzędów wielkości szybsze niż tryb natychmiastowy (glBegin, glVertex, glEnd).