2010-05-01 5 views
1

Peut-être que j'ai mal configuré le GLUT. Je veux que les verticies soient relatives à leur taille en pixels. En ce moment, si je crée un hexagone, il prend tout l'écran même si les unités sont 6.Confusion du système OpenGL Coordinate

#include <iostream> 
#include <stdlib.h> //Needed for "exit" function 
#include <cmath> 
//Include OpenGL header files, so that we can use OpenGL 
#ifdef __APPLE__ 
#include <OpenGL/OpenGL.h> 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 

using namespace std; 

//Called when a key is pressed 
void handleKeypress(unsigned char key, //The key that was pressed 
        int x, int y) { //The current mouse coordinates 
    switch (key) { 
     case 27: //Escape key 
      exit(0); //Exit the program 
    } 
} 

//Initializes 3D rendering 
void initRendering() { 
    //Makes 3D drawing work when something is in front of something else 
    glEnable(GL_DEPTH_TEST); 
} 

//Called when the window is resized 
void handleResize(int w, int h) { 
    //Tell OpenGL how to convert from coordinates to pixel values 
    glViewport(0, 0, w, h); 

    glMatrixMode(GL_PROJECTION); //Switch to setting the camera perspective 

    //Set the camera perspective 
    glLoadIdentity(); //Reset the camera 
    gluPerspective(45.0,     //The camera angle 
        (double)w/(double)h, //The width-to-height ratio 
        1.0,     //The near z clipping coordinate 
        200.0);    //The far z clipping coordinate 
} 

//Draws the 3D scene 
void drawScene() { 
    //Clear information from last draw 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 


    glLoadIdentity(); //Reset the drawing perspective 
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 

    glBegin(GL_POLYGON); //Begin quadrilateral coordinates 

    //Trapezoid 
    glColor3f(255,0,0); 

    for(int i = 0; i < 6; ++i) { 
     glVertex2d(sin(i/6.0*2* 3.1415), 
      cos(i/6.0*2* 3.1415)); 
    } 

    glEnd(); //End quadrilateral coordinates 

    glutSwapBuffers(); //Send the 3D scene to the screen 
} 

int main(int argc, char** argv) { 
    //Initialize GLUT 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); 
    glutInitWindowSize(400, 400); //Set the window size 

    //Create the window 
    glutCreateWindow("Basic Shapes - videotutorialsrock.com"); 
    initRendering(); //Initialize rendering 

    //Set handler functions for drawing, keypresses, and window resizes 
    glutDisplayFunc(drawScene); 
    glutKeyboardFunc(handleKeypress); 
    glutReshapeFunc(handleResize); 

    glutMainLoop(); //Start the main loop. glutMainLoop doesn't return. 
    return 0; //This line is never reached 
} 

Comment puis-je faire en sorte que les coordonnées: (0,0), (10,0), (10,10), et (0,10) définir un polygone commençant en haut à gauche de l'écran et est une largeur et une hauteur de 10 pixels?

Répondre

3

Si vous souhaitez que les objets soient mis à l'échelle de cette manière, vous devez utiliser une projection orthographique.

À l'heure actuelle, avec la perspective, les choses sont mises à l'échelle non seulement par leur taille, mais par leur position de l'axe Z. Il faut donc utiliser cette fonction au lieu de gluPerspective:

gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); 

Cette fonction définit essentiellement l'espace que vous pouvez voir, qui est comme un grand prisme rectangulaire. Cela fait que les choses semblent être de la même taille que les choses proches. En ce qui concerne la mise à l'échelle exacte, elle changera également par rapport à la taille de la fenêtre. Pour obtenir des pixels parfaitement droits, vous devez constamment modifier la projection ou conserver la taille de la fenêtre fixe. Pour que cela fonctionne comme 1: 1, si votre fenêtre est x pixels de large, la projection orthographique doit également être de x pixels de large.

2

Si vous dessinez en 2D, vous ne souhaitez pas utiliser la projection perspective. Si vous configurez votre appareil photo avec gluOrtho2D(0, window_width, window_height, 0);, vous devriez obtenir ce que vous cherchez.

+0

Où dans mon code devrais-je le changer, j'ai essayé mais il n'a rien fait – jmasterx

+0

Vous devez remplacer l'appel 'gluPerspective()'. – tzaman