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:
- Wszystkie transformacje będą teraz mieć wpływ na macierz projekcji.
- Usuń starą macierz projekcyjną i zastąp ją macierzą tożsamości.
- Użyj całego ekranu jako widoku.
- 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.
- 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).
Mam nadzieję, że tak naprawdę nie "wpiszesz" geometrii obiektu (z wyjątkiem bardzo prostych). Powinieneś załadować je z pliku. – datenwolf