Domanda

Diciamo che voglio disegnare un quad semplice come questo:

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

C'è un modo per disegnarlo in modo tale che appaia dietro tutti gli oggetti 3D e riempia l'intero schermo? La mia macchina fotografica si sposta con il mouse, quindi anche questo quad deve apparire fisso con il movimento della fotocamera. Lo scopo è quello di creare uno sfondo semplice.

Devo fare alcune trasformazioni folli basate sulla posizione / rotazione dell'occhio, o c'è un modo più semplice usando glMatrixMode ()?

È stato utile?

Soluzione

Sembra che ciò che si desidera fare sia simile a quello che si farebbe quando si disegna un HUD 2D in un gioco semplice o solo uno sfondo persistente. Non sono un esperto, ma l'ho fatto relativamente di recente. Quello che vuoi fare è cambiare la matrice di proiezione in una proiezione ortografica, renderizzare il tuo quad e quindi tornare a qualsiasi proiezione che avevi prima. Puoi farlo con la pila di matrici ed è completamente indipendente da qualsiasi videocamera.

Quindi, prima:

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

Questo spinge una nuova matrice di proiezione sullo stack di proiezione (stavo usando glut per questo progetto, ma dovrebbe tradursi in un normale OpenGL). Quindi, ottengo la larghezza e l'altezza della finestra e utilizzo gluOrtho2D per impostare la mia proiezione ortografica.

Avanti:

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

Qui ho appena inserito una nuova matrice pulita nella vista modello. Potrebbe non essere necessario farlo.

Infine:

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

Spero che questo aiuti. Come puoi vedere, non richiede alcun uso della posizione dell'occhio. Questo principalmente perché quando usiamo una nuova proiezione ortografica che si adatta perfettamente alla nostra finestra, questo è irrilevante. Questo non può mettere il tuo quad nella parte posteriore, tuttavia, se questo viene eseguito dopo le altre chiamate di disegno.

EDIT: anche disattivare i test di profondità e cancellare il buffer di profondità, come suggerisce Boojum.

Altri suggerimenti

Ecco i passaggi che vorrei utilizzare per ogni frame:

  1. Cancella il buffer di profondità con glClear(GL_DEPTH_BUFFER_BIT);
  2. Disattiva il test di profondità con glDisable(GL_DEPTH_TEST);
  3. Carica in una proiezione ortografica fissa con gluOrtho2D (-1.0, 1.0, -1.0, 1.0);
  4. Disegna il tuo quad come l'hai descritto.
  5. Riattiva il test di profondità.
  6. Carica le tue normali proiezioni prospettiche e disegna il resto della vista.

Non puoi semplicemente posizionarlo in background, inseriscilo se lo vuoi intorno a te. Devi prima disegnarlo per farlo dietro tutti gli oggetti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top