lookat opengl screen coordinates transformation

lookat opengl



Cómo transformar el mundo 2D en coordenadas de pantalla OpenGL (3)

Actualmente estoy trabajando en la implementación de un renderizador basado en OpenGL en un motor de juego 2D.

Debido a que el espacio de coordenadas de la pantalla OpenGL es [-1,1], estoy un poco confundido en cuanto a cómo se debe interconectar con un sistema de coordenadas cartesiano 2D mundo genérico.

Digamos que la ventana gráfica de mi mundo es de [-500, -500] a [1200, 1200], donde [0, 0] es el origen del mundo. ¿Solo necesito traducir y escalar a coordenadas entre -1 y 1? ¿O hay alguna otra forma de transformación que necesita ser realizada?

¿Cómo calcula dónde dibujar objetos en la pantalla que tienen posiciones definidas en su propio sistema de coordenadas?

Apreciaría una explicación con y sin GlOrtho (para que podamos usar el eje Z también para efectos de perspectiva).


Coloque su escena en cualquier sistema de coordenadas que desee. Recomiendo usar glm ( glm ) para inicializar matrices y realizar operaciones matemáticas, etc. Por lo tanto, es probable que tenga un motor de gráficos de escena, donde administre todos los objetos en su mundo 2D / 3D. Solo configura la vista y proyección correcta en glm. En realidad, no debería necesitar ningún detalle de implementación de gráficos, por lo que podría haber una mala decisión de diseño en su motor de juego.


Primero, OpenGL usa sistemas de coordenadas múltiples, por lo que no hay " el sistema de coordenadas OpenGL". A lo que se refiere son las coordenadas normalizadas del dispositivo (NDC), donde las tres coordenadas están en el rango [-1, 1]. Los diferentes sistemas de coordenadas y sus nombres se explican here , en la sección "9.011 ¿Cómo se transforman las coordenadas? ¿Cuáles son los diferentes espacios de coordenadas?". 1)

En segundo lugar, para evitar confusiones, en OpenGL el término "viewport" se refiere a la parte de la ventana a la que está procesando, y está en las coordenadas de la ventana. En su pregunta, la usó para describir la porción (l, r, t, b) = (- 500, -500, 1200, 1200) de su mundo que desea representar, que está en coordenadas mundiales.

Preguntó cómo "calcular dónde dibujar objetos en la pantalla". Lo que debe hacer es definir una transformación (una matriz de 4x4) que se asigne de un sistema de coordenadas a otro. Su mundo 2D se proporciona en coordenadas mundiales, por lo que necesita definir una matriz que transforme las coordenadas mundiales en NDC, es decir, una matriz de proyección. En sus shaders, simplemente multiplique sus vértices con esta matriz de proyección, y obtendrá NDCs. glm::ortho / glOrtho calcula tal matriz de proyección. En cuanto a la proyección en perspectiva, no está claro qué quiere hacer, pero debe experimentar con las funciones de perspective y lookat en glm.

Para que quede claro, defina vértices en el sistema de coordenadas que desee (que se denomina sistema de coordenadas mundo) y simplemente dibuje estos vértices. El trabajo de tu sombreador de vértices es aplicar la transformación que definiste.

También tenga en cuenta que especificó un cuadrado, y normalmente eso no es lo que quiere. Los monitores y la mayoría de las ventanas no son cuadrados, por lo que si asigna esa plaza a una ventana gráfica típica, obtendría una visión distorsionada de su mundo. Debe tener en cuenta la relación de aspecto (ancho: alto) de la ventana gráfica. He tratado de explicar eso here .

1) Como nota al margen, las preguntas frecuentes son bastante antiguas y se refieren a versiones antiguas de OpenGL. Hoy en día, se espera y anima a los programadores a administrar las matrices de visualización de modelo y de proyección, ya que las necesita en sus shaders. Recomiendo altamente glm , es solo de cabecera, por lo tanto es muy fácil de integrar y tiene una buena sintaxis que refleja GLSL.


Use glOrtho en la matriz de proyección y luego dibuje normalmente. Para su ejemplo, supongo que desea GlOrtho (0, 1000, 0, 3000, -1, 1) que le daría una ventana gráfica de 1000 unidades de ancho y 3000 unidades de altura.