gluPerspective, glViewport, gluLookAt et la GL_PROJECTION et GLMATRIXMODE Matricies

Question D'Origine

Je veux utiliser 'gluPerspective', 'glViewport" et "gluLookAt de" manipuler mon appareil photo et de l'écran.

Qui fonctionne à I s'applique à un mode de matrice? Et dans quel ordre dois-je /dois-je utiliser?

Par exemple, je suis en train de configurer mon écran et de la caméra comme ceci: (Mais ça ne fonctionne pas!)

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?

J'ai regardé autour pour la documentation en ligne, et je comprends les fonctions, tout simplement pas où aller et dans quel ordre!

Quelques temps plus tard...

C'est plusieurs mois plus tard maintenant et je suis l'ajout d'une modification rapide pour montrer le système que j'utilise pour faire un rendu avec OpenGL. C'est pour aider les autres qui voient cette question dans l'avenir.

J'utilise principalement deux méthodes.

Méthode 1:

Cette méthode des groupes de tout ensemble.

//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);

Cette recrée la fenêtre d'affichage pour le rendu sur l'ensemble de la zone de l'intérieur de la fenêtre. Avec la sfml, vous feriez quelque chose comme la fenêtre.largeur() ou de la fenêtre.hauteur(), ou quelque chose de similaire en fonction de fenêtrage trousse à outils que vous utilisez (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.

Vous devez sélectionner l'un des trois sortie de "glOrtho', 'gluPerspective" et "glFrustrum'. Il y a aussi "gluOrtho2D", mais l'utiliser avec précaution! (Je préfère préciser, de près et de loin avions de moi-même avec "glOrtho'.) Vous devez remplacer les " ... " avec vos arguments à la fonction.

//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( ... );

Méthode 2:

La deuxième méthode est la même que ci-dessus, mais pour passer la première étape dans une fonction séparée. Ensuite, vous devez détecter les événements de redimensionnement de la fenêtre et de l'appel de cette fonction. Avec glut, vous pouvez spécifier une fonction de rappel. Avec la SFML, vous pouvez détecter un événement lorsque la fenêtre est redimensionnée. J'ai oublier comment SDL fonctionne, mais il est similaire. Je n'ai pas encore appris comment glfw œuvres.

J'espère que ça va vous aider.

Certains OpenGL novices (probablement moi-même en même temps) essayez de spécifier la caméra de traductions sur la matrice de PROJECTION. Ne le faites pas - je la tête, il bousille l'éclairage et peut-être d'autres choses.

Ce que vous avez ici semble approprié pour moi. Peut-être que votre erreur est ailleurs.
Assurez-vous que votre scène est entre le près et le loin les avions que vous avez spécifié dans glPerspective.
Si vous avez compris les fonctions, vous pourrez comprendre où ils vont. Par exemple, vous semblez croire que glViewport crée une matrice. Il ne le fait pas.
"Mais ça ne fonctionne pas!"...erreur de segmentation? Bluescreen? Kernel panic? Efface le contenu de votre répertoire d'accueil? Suivre les captures sur le feu? Imprimante captures sur le feu? Donne lieu à de dom?
Haha, @genpfault - mon que je veux dire, l'écran est vide, l'imprimante est bien! 😉

OriginalL'auteur user3728501 | 2012-10-24