Jest tu trochę zamieszania.
OpenGL jest praworęczny w przestrzeni obiektów i przestrzeni świata.
Ale w przestrzeni okna (aka przestrzeni ekranu) nagle stajemy się leworęczni .
Jak to się stało ?
Sposób, w jaki przechodzimy od praworęcznych do leworęcznych, to ujemny wpis skalowania z w macierzy glOrtho
lub glFrustum
macierzy projekcji. Skalowanie z o -1 (pozostawiając niezmienione x i y) ma wpływ na zmianę ręczności układu współrzędnych.
Dla glFrustum,
dalekie i bliskie mają być pozytywne, z daleka > blisko . Powiedz daleko = 1000 i blisko = 1. Wtedy C = - (1001) / (999) = -1,002.
Zobacz tutaj, aby uzyskać więcej szczegółów i schematów.
Z perspektywy ortograficznej glOrtho generuje taką macierz:
Tutaj lewa , prawa , dół i góra to tylko współrzędne dla lewej pionowej , prawej pionowej , dolnej poziomej , górnej poziomej płaszczyzny przycinającej (odpowiednio) .
Jednak bliskie i dalekie płaszczyzny są określane inaczej . Pobliżu parametr określa się jako
- Blisko: odległość do bliższej płaszczyzny przycięcia głębokości. Odległość ta jest ujemna, jeśli samolot ma znajdować się za widzem.
i daleko:
- zFar Odległość do dalszej płaszczyzny tnącej głębokości. Odległość ta jest ujemna, jeśli samolot ma znajdować się za widzem.
Tutaj mamy typową kanoniczną objętość widoku
Ponieważ mnożnik z wynosi (-2 / (daleko-blisko)), znak minus skutecznie skaluje z o -1 . Oznacza to, że „z” jest obracane w lewo podczas transformacji widoku, o czym większość ludzi nie wie, ponieważ po prostu pracują w OpenGL jako „praworęczny” układ współrzędnych.
Więc jeśli zadzwonisz
glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,
Wtedy BLISKI SAMOLOT jest 10 jednostek przed tobą . Gdzie jesteś? Na początku, z osią X po prawej stronie, osią Y na czubku głowy i nosem skierowanym w dół na ujemną oś Z (to jest domyślne ustawienie „Domyślnie kamera jest umieszczona na początku , wskazuje ujemną oś z i ma wektor w górę (0, 1, 0). ” ). Więc najbliższa płaszczyzna ma z = -10. Daleka płaszczyzna znajduje się 10 jednostek za tobą, w punkcie z = + 10 .