Estoy en la etapa de desarrollo de mi juego donde necesito hacer un HUD o GUI. Nunca he llegado a esta parte, así que no sé cómo se hace. Intenté renderizar un quad simple en una posición fija en la pantalla, pero hay un problema. Para hacer que mi cámara funcione con ortografía, uso esto:
public void lookThrough()
{
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(position.x, position.x + Display.getDisplayMode().getWidth()/zoom, position.y + Display.getDisplayMode().getHeight()/zoom, position.y, -1, 1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
}
No veo cómo podría hacer que algo arreglado en la pantalla con este método. ¿Alguna forma de evitar esto? Gracias :)
([0...1], [0...1], 0, 1)
sin proyección, vista o matriz mundial, siempre aterrizarán en el espacio de la pantalla.Respuestas:
Esto es de un viejo motor de juegos basado en OpenGL que estaba tratando de escribir hace siete años, escrito en C ++, tan claro conmigo mientras trato de explicar cómo manejé las operaciones de renderizado 3D GUI y mundo 2D dentro de él. Usé cuatro métodos principales dentro de mi clase de renderizador OpenGL (OGLRender) de los cuales son:
render2D () para el actual dibujo GUI 2D.
Y luego, en el bucle de hilo principal, básicamente llamaría a los métodos en el siguiente orden:
Entonces, lo que estoy haciendo es dibujar primero mi escena mundial en 3D y luego dibujar mi GUI al final de esa manera, la GUI siempre está en la cima de la escena mundial. El método ready3D () prepara la proyección del mundo 3D para el dibujo de la escena mundial y el método ready2D () prepara la escena orto 2D para el dibujo de la GUI.
m_Setup.width
ym_Setup.height
son solo las dimensiones de la pantalla del puerto de vista.Lo que es especial sobre el método ready2D () es que
gluOrtho2D()
se llama a la función con argumentos que le indican que cuando dibujamos las primitivas de GUI las dibujamos en las coordenadas de pantalla especificadas para que coincidan con Windows, Mac y otros sistemas de coordenadas de pantalla de escritorio. Tal como la parte superior izquierda es (0,0) en formato (X, Y) mientras que la parte inferior derecha es(ViewportWidth-1, ViewportHeight-1)
. YglTranslatef()
se utiliza para corregir el posicionamiento preciso por píxel. De modo que cuando dibujamos una línea desde (0,0) hasta (0,9), la línea realmente dibujará desde la parte superior izquierda y hacia abajo diez píxeles en total de longitud y un ancho de píxel.En general, lo más probable es que solo te interese lo que está haciendo el método ready2D () . Proporcioné los ejemplos de código fuente de los otros métodos para darle una idea de cómo generalmente la mayoría de los juegos hacen la escena mundial 3D y el orden de dibujo de la GUI.
fuente