Pregunta

Digamos que quiero dibujar un quad simple como este:

glBegin(GL_QUADS);
glVertex2f(-1.0,-1.0);
glVertex2f(1.0,-1.0);
glVertex2f(1.0, 1.0);
glVertex2f(-1.0, 1.0);
glEnd();

¿Hay alguna manera de dibujar esto de modo que aparezca detrás de todos los objetos 3D y llene toda la pantalla? Mi cámara se mueve con el mouse, por lo que este quad también debe aparecer estacionario con el movimiento de la cámara. El propósito es hacer un fondo simple.

¿Tengo que hacer algunas transformaciones locas basadas en la posición / rotación de los ojos, o hay una forma más simple de usar glMatrixMode ()?

¿Fue útil?

Solución

Parece que lo que quieres hacer es similar a lo que harías al dibujar un HUD 2D en un juego simple, o simplemente un fondo que es persistente. No soy un experto, pero lo hice hace relativamente poco. Lo que desea hacer es cambiar la matriz de proyección a una proyección ortográfica, renderizar su quad y luego volver a la proyección que tenía antes. Puede hacer esto con la pila de matriz, y es completamente independiente de cualquier cámara.

Entonces, primero:

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
int w = glutGet(GLUT_WINDOW_WIDTH);
int h = glutGet(GLUT_WINDOW_HEIGHT);
gluOrtho2D(0, w, h, 0);

Esto empuja una nueva matriz de proyección en la pila de proyección (estaba usando glut para este proyecto, pero debería traducirse a OpenGL normal). Luego, obtengo el ancho y la altura de la ventana, y uso gluOrtho2D para configurar mi proyección ortográfica.

Siguiente:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// Draw your quad here in screen coordinates

Aquí solo inserto una matriz nueva y limpia en la vista del modelo. Es posible que no necesite hacer esto.

Por último:

glPopMatrix() // Pops the matrix that we used to draw the quad
glMatrixMode(GL_PROJECTION);
glPopMatrix(); // Pops our orthographic projection matrix, which restores the old one
glMatrixMode(GL_MODELVIEW); // Puts us back into GL_MODELVIEW since this is probably what you want

Espero que esto ayude. Como puede ver, no requiere el uso de la posición del ojo. Esto se debe principalmente a que cuando usamos una nueva proyección ortográfica que se ajusta perfectamente a nuestra ventana, esto es irrelevante. Sin embargo, esto puede no poner su quad en la parte posterior, si se ejecuta después de las otras llamadas de sorteo.

EDITAR: Desactivar las pruebas de profundidad y limpiar el búfer de profundidad también podría ayudar, como sugiere Boojum.

Otros consejos

Estos son los pasos que usaría para cada cuadro:

  1. Borrar el búfer de profundidad con glClear(GL_DEPTH_BUFFER_BIT);
  2. Desactive las pruebas de profundidad con glDisable(GL_DEPTH_TEST);
  3. Cargar en una proyección ortográfica fija con gluOrtho2D (-1.0, 1.0, -1.0, 1.0);
  4. Dibuja tu quad como lo describiste.
  5. Vuelva a activar la prueba de profundidad.
  6. Cargue sus proyecciones de perspectiva regulares y dibuje el resto de la vista.

No puede simplemente colocarlo en el fondo, encuadrarlo si lo desea a su alrededor. Primero debe dibujarlo para colocarlo detrás de todos los objetos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top