gluPerspective, glViewport, gluLookAt und die GL_PROJECTION und GL_MODELVIEW Matricies

Ursprüngliche Frage

Ich will 'gluPerspective', 'glViewport" und "gluLookAt" zu manipulieren, meine Kamera und Bildschirm.

Welche Funktionen ich anwenden, um die matrix-Modus? Und in welcher Reihenfolge sollte ich /muss ich Sie nutzen?

So bin ich zum Beispiel versuche, mein Bildschirm und Kamera wie diese: (Aber es funktioniert nicht!)

glMatrixMode(GL_PROJECTION) //Apply following to projection matrix - is this correct?
glLoadIdentity(); //Reset first
glPerspective(45.0, (double)w/(double)h, 1.0, 200.0); //Set perspective
glViewport(0, 0, w, h); //Set viewport

glMatrixMode(GL_MODELVIEW); //Apply following to modelview - should glViewport come under here?
glLoadIdentity(); //Reset first
gluLookAt(px, py, pz, cx, cy, cz, ux, uy, uz); //Set position, centre and then up vectors
//This surely comes after calling GL_MODELVIEW?

Ich habe mir um für die online-Dokumentation, und ich verstehe die Funktionen, nur nicht dort, wo Sie gehen sollten, und in welcher Reihenfolge!

Einige Zeit später...

Ist es einige Monate später jetzt, und ich bin das hinzufügen einer quick-edit-um zu zeigen, das system, das ich zum Rendern von Sachen mit OpenGL. Dies ist, um anderen zu helfen, die diese Frage in der Zukunft.

Ich in Erster Linie zwei Methoden verwenden.

Methode 1:

Diese Methode Gruppen alles zusammen.

//Firstly, the window may have been resized so re-create the viewing area
glViewport(0, 0, width_of_window_rendering_area, height_of_window_rendering area);

Dieser bildet den viewport für die Darstellung über die gesamte Fläche der Innenseite des Fensters. Mit sfml, würden Sie etwas tun, wie Fenster.width() oder window.Höhe(), oder etwas ähnliches, je nachdem, welche windowing toolkit, die Sie verwenden (glut, glfw, sdl etc)...

//The second step is to add a projection matrix. There are three main ones I like to use
//Uncomment the one you want
glMatrixMode(GL_PROJECTION); //Tell OpenGL to manipulate the correct matrix stack
glLoadIdentity(); //Reset the projection matrix, or bad things happen after multiple calls to below functions!
//glOrtho( ... ) //Uncomment to use 2D rendering
//gluPerspective( ... ) //Uncomment to use (easy) 3D rendering
glFrustrum( ... ) //Uncomment to use (harder/less intuitive?) 3D rendering
glMatrixMode(GL_MODELVIEW); //I always prefer to leave OpenGL in the modelview manipulation mode.
    //I consider it the "default" and safest mode to leave OpenGL in, as any rogue
    //calls to functions changing its contents is likely to mess up your geometry
    //which should be visible as a problem on the screen, which tells you you need
    //to fix something! Manipulating the other matrix stacks may not show obvious
    //problems.

Müssen Sie wählen Sie eine der drei aus 'glOrtho', 'gluPerspective' und 'glFrustrum'. Es gibt auch "gluOrtho2D', aber verwenden Sie mit Vorsicht! (Ich bevorzuge, um anzugeben, nah und fern, die Flugzeuge selbst mit 'glOrtho'.) Ersetzen Sie den '...' mit deinen Argumenten an die Funktion auch.

//The third step is to clear the screen and set your camera /geometry position
glClear(GL_COLOR_BUFFER_BIT); //use bitwise OR ('||') with 'GL_DEPTH_BUFFER_BIT' and 'GL_STENCIL_BUFFER_BIT' if required
gluLookAt( ... );
//I like to use gluLookAt, or at least I _italic_used to! Now I implement my own camera...
 //That is another fun thing you should try if you are comfortable with 3D geometry and hard math!

//The fourth step is to draw your scene. You may want to put lighting stuff first or in with the drawing
glutWireTeapot( ... );

Methode 2:

Die zweite Methode ist die gleiche wie oben beschrieben, aber bewegen Sie den ersten Schritt in eine separate Funktion. Dann müssen Sie erkennen, window-resize-Ereignisse und rufen Sie diese Funktion. Mit glut, können Sie einen Rückruf. Mit SFML Sie erkennen können, ein Ereignis, wenn das Fenster in der Größe geändert wird. Ich vergessen, wie SDL funktioniert, aber es ist ähnlich. Ich habe noch nicht gelernt, wie glfw funktioniert.

Hoffentlich, dass wird Ihnen helfen.

Einige OpenGL-Anfänger (wahrscheinlich mich eingeschlossen gleichzeitig) versuchen, um festzulegen, Kamera-übersetzungen auf der PROJEKTIONS-matrix. Dies nicht tun - ich leite es vermasselt Beleuchtung und evtl. andere Dinge.

  • Das was du da hast sieht geeignet, um mich. Vielleicht ist dein Fehler woanders liegt.
  • Stellen Sie sicher, dass Ihre Szene ist zwischen dem nahen und Fernen Ebenen, die Sie angegeben in glPerspective.
  • Wenn Sie das verstehen der Funktionen, würden Sie verstehen, wo Sie gehen. Zum Beispiel, Sie scheinen zu glauben, dass glViewport erzeugt eine matrix. Tut es aber nicht.
  • "Aber es funktioniert nicht!"...segfault? Bluescreen? Kernel Panik? Wischt Ihr home-Verzeichnis? Monitor Feuer fängt? Drucker Feuer fängt? Anlass zu dom?
  • Haha, @genpfault - meine, dass ich meine leeren Bildschirm, der Drucker ist in Ordnung! 😉
  • Was ich Frage ist, bin ich mit der Manipulation der korrekten Matrizen? Und ich Bearbeiten diese in der richtigen Reihenfolge?
  • Wenn Sie nicht verstehen, die Fragen, sollten Sie nicht kommentiert haben. Max hat mir die Antwort, die ich fragte.

InformationsquelleAutor user3728501 | 2012-10-24
Schreibe einen Kommentar