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.
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
Vous devez vous connecter pour publier un commentaire.
Je définir mon remodeler fonction de rappel:
Appel
glViewport(...)
une seule fois au début.Puis de recharger la matrice de projection avec une matrice d'identité:
Alors:
gluLookAt(...)
peut être appelée à tout moment plus tard si vous avez besoin de changer votre position de la caméra.Pour mes simples fins.
Désolé, une autre question: est glViewPort modifier une matrice? Dois-je appeler glMatrixMode(GL_PROJECTION) avant tout appel à glViewPort?
Oui, il fait pivoter l'ensemble de la scène deux fois. Mais si vous le mettez dans votre affichage en fonction de rappel, alors souvenez-vous de l'affichage de la fonction est appelée plusieurs fois, vous devez charger le modèle de matrice de vue avec une matrice d'identité dans le début de votre écran en fonction de rappel.
Merci @Max, ce qui est extrêmement utile et il fonctionne parfaitement maintenant. Ne peux pas vous remercier assez - non seulement il fonctionne parfaitement j'ai maintenant vraiment comprendre ce que je suis censé faire.
Non, il n'est pas nécessaire d'appeler glMatrixMode(GL_PROJECTION) avant glViewport. glViewport est censé être appelé lorsque la fenêtre est redimensionnée, c'est à dire vous avez besoin de redimensionner votre fenêtre. Afin de le mettre dans votre remodeler fonction de rappel.
OriginalL'auteur Max