2013-04-21 11 views
14

Obecnie pracuję nad implementacją renderera z obsługą OpenGL w silnik gry 2D.Jak przekształcić świat 2D na współrzędne ekranu OpenGL

Ponieważ przestrzeń współrzędnych ekranu OpenGL wynosi [-1,1], jestem nieco zdezorientowana, w jaki sposób powinna być połączona z ogólnym, kartezjańskim układem współrzędnych 2D.

Załóżmy, że widok w moim świecie to [-500, -500] do [1200, 1200], gdzie [0, 0] to pochodzenie świata. Czy muszę tylko tłumaczyć i skalować w dół do współrzędnych od -1 do 1? Czy jest jeszcze jakaś inna forma transformacji, którą należy wykonać?

Jak obliczyć miejsce rysowania obiektów na ekranie, które mają zdefiniowane pozycje we własnym układzie współrzędnych?

Byłbym wdzięczny za wyjaśnienie zi bez glorusa (możemy więc użyć osi Z również dla efektów perspektywicznych).

Odpowiedz

13

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.

+0

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

+0

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'. –

+0

Jak korzystać z glm :: perspective? Jak wchodzi w interakcję z 'gl_ModelViewProjectionMatrix'? – bgroenks

1

Użyj glOrtho na macierzy projekcji, a następnie narysuj normalnie. Na przykład: domyślam się, że chcesz glOrtho (0, 1000, 0, 3000, -1, 1), który daje obszar wyświetlania 1000 jednostek szerokości i 3000 jednostek wysokości

0

Umieść swoją scenę w dowolnym układzie współrzędnych, który chcieć. Polecam glm (http://glm.g-truc.net/), aby zainicjować matryce i wykonywać operacje matematyczne itp. Więc prawdopodobnie masz silnik wykresu sceny, w którym zarządzasz wszystkimi obiektami w twoim świecie 2D/3D. Po prostu ustaw poprawny widok i projekcję. Właściwie nie powinieneś potrzebować żadnych szczegółów implementacji potoku graficznego - aby w twoim silniku gry mogła powstać zła decyzja.

Powiązane problemy