Frage

Lassen Sie uns sagen, ich möchte eine einfache Quad wie folgt zeichnen:

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

Gibt es eine Möglichkeit, diese so zu lenken, dass es hinter allen 3D-Objekten angezeigt wird, und den ganzen Bildschirm ausfüllt? Meine Kamera bewegt sich mit der Maus, so dass dieses Quad hat auch stationär mit Kamerabewegung erscheinen. Der Zweck ist es, einen einfachen Hintergrund zu machen.

Habe ich ein paar verrückten Transformationen zu tun habe, basierend auf Augenposition / Umdrehung, oder gibt es eine einfachere Art und Weise mit glMatrixMode ()?

War es hilfreich?

Lösung

Es klingt wie Sie wollen, was zu tun ist ähnlich zu dem, was Sie würden, wenn sie in einem einfachen Spiel ein 2D-HUD zeichnen, oder einfach nur einen Hintergrund, die persistent ist. Ich bin kein Experte, aber ich habe nur, dass vor relativ kurzer Zeit. Was Sie tun möchten, ist die Projektionsmatrix zu einer orthographischen Projektion zu ändern, machen Ihr Quad, und wechseln Sie dann wieder zu, was Projektion Sie vorher hatten. Sie können dies mit dem Matrix-Stack, und es ist völlig unabhängig von jeder Kamera.

Also, zuerst:

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

Dies drückt eine neue Projektionsmatrix auf den Projektionsstapel (I wurde für dieses Projekt mit Schwemme, aber es sollte nur normale OpenGL übersetzen). Dann habe ich die Fensterbreite und Höhe erhalten, und verwenden gluOrtho2D meine Orthogonalprojektion einzurichten.

Weiter:

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

Hier schiebe ich gerade eine neue, saubere Matrix auf den Model-View. Sie können dies nicht tun müssen, um.

Schließlich:

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

Ich hoffe, das hilft. Wie Sie sehen können, bedarf es keinen Gebrauch von der Augenposition. Dies ist vor allem, weil, wenn wir eine neue orthographische Projektion verwenden, die perfekt unser Fenster paßt, das ist irrelevant. Dies kann jedoch nicht in den Rücken legen Sie Ihre Quad, wenn dies nach den anderen Zeichenaufrufe ausgeführt wird.

EDIT:. Turning gründlichere Prüfung ab und Löschen der Tiefenpuffer auch helfen könnte, wie Boojum schlägt

Andere Tipps

Hier sind die Schritte, die ich für jeden Frame verwenden würde:

  1. Löschen der Tiefenpuffer mit glClear(GL_DEPTH_BUFFER_BIT);
  2. Schalten Sie eine gründlichere Prüfung mit glDisable(GL_DEPTH_TEST);
  3. Laden in einer festen orthographischen Projektion mit gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
  4. Zeichnen Sie Ihr Quad, wie Sie es beschrieben.
  5. Schalten gründlichere Prüfung wieder an.
  6. Legen Sie Ihre regelmäßigen perspektivischen Projektionen und den Rest der Ansicht ziehen.

Cant Sie legen Sie ihn einfach im Hintergrund, Box selbst, wenn du es überall Sie wollen. Sie müssen sie ziehen es zuerst hinter allen Objekten zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top