Po pierwsze, OpenGL używa wielu układów współrzędnych, więc nie ma "dla układu współrzędnych OpenGL". To, o czym mówisz, to znormalizowane współrzędne urządzenia (NDC), gdzie wszystkie trzy współrzędne są w zakresie [-1, 1]. Różne układy współrzędnych i ich nazwy objaśniono jako here, w rozdziale "9.011 Jak są przekształcane współrzędne? Jakie są różne przestrzenie współrzędnych?". 1)
Po drugie, aby uniknąć nieporozumień, w OpenGL termin "rzutnia" odnosi się do części okna, którą renderujesz, i jest we współrzędnych okna. W swoim pytaniu użyłeś go do opisania części (l, r, t, b) = (- 500, -500, 1200, 1200) twojego świata, którą chcesz renderować, która jest współrzędna światowa.
Zapytałeś, jak "obliczyć, gdzie narysować obiekty na ekranie". Trzeba tylko zdefiniować transformację (macierz 4x4), która jest mapowana z jednego układu współrzędnych na inny. Twój świat 2D jest podany we współrzędnych światowych, więc musisz zdefiniować macierz, która przekształca współrzędne świata w NDC, tj. Macierz projekcji. W swoich programach cieniujących po prostu pomnóż swoje wierzchołki za pomocą tej macierzy projekcji, a otrzymasz NDC. glm::ortho
/glOrtho
oblicza taką matrycę projekcji. Jeśli chodzi o rzut perspektywiczny, nie jest jasne, co chcesz zrobić, ale powinieneś eksperymentować z funkcjami perspective
i lookat
w skrócie.
Aby było jasne, definiujesz wierzchołki w dowolnym układzie współrzędnych, który chcesz (który nazywa się światowym układem współrzędnych) i po prostu rysujesz te wierzchołki. Zadaniem modułu cieniującego wierzchołka jest zastosowanie zdefiniowanej transformacji.
Należy również pamiętać, że określono kwadrat, a zazwyczaj nie jest to, co chcesz. Monitory i większość okien nie są kwadratowe, więc jeśli zamienisz ten kwadrat na typową rzutnię, zobaczysz zniekształcony widok swojego świata. Należy uwzględnić współczynnik proporcji (szerokość: wysokość) okna ekranu. Próbowałem wyjaśnić, że here.
1) Na marginesie FAQ jest dość stary i odnosi się do dawnych wersji OpenGL. W dzisiejszych czasach programiści są oczekiwani i zachęcani do zarządzania zarówno matrycą, jak i matrycami projekcyjnymi, ponieważ są one potrzebne w shaderów. Gorąco polecam glm, jest to tylko nagłówek, dlatego bardzo łatwo go zintegrować i ma ładną składnię, która odzwierciedla GLSL.
Jeśli używasz ortograficznej matrycy projekcyjnej, widok może i zawsze będzie tylko 2D, ponieważ ignoruje oś Z, prawda? W większości rzeczy robię to dobrze, ale chcę móc eksperymentować z wykorzystaniem osi Z, aby stworzyć mniej płaskie perspektywy na światach 2D. Jak zdefiniować macierz transformacji dla perspektywy, a nie orto? Jakie funkcje GL to robią? – bgroenks
1) Nie, nie ignoruje osi Z, po prostu wyświetla wszystko z tą samą współrzędną xy na tym samym pikselu. Ale nadal możesz wykonywać testy głębokości. 2) 'glm :: perspective'. –
Jak korzystać z glm :: perspective? Jak wchodzi w interakcję z 'gl_ModelViewProjectionMatrix'? – bgroenks