2010-05-01 109 views
1

也許我設置了錯誤的GLUT。我想verticies相對於它們的大小以像素爲單位。現在,如果我創建了一個六邊形,它佔據了整個屏幕,即使單位爲6OpenGL座標系統混淆

#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 
} 

我怎樣才能讓這個座標: (0,0)(10,0)(10,10), 和(0,10)定義一個從屏幕左上角開始的多邊形,寬度和高度爲10像素?

回答

3

如果您希望按照某種方式縮放對象,則應使用正交投影。

現在,有了透視圖,事物不僅可以按照它們的大小縮放,而且可以按照它們的Z軸位置縮放。因此,使用此功能,而不是gluPerspective

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

這個功能基本上定義可以看到的空間,這就像一個大長方體。這使得遠遠的事物看起來和近乎事物的尺寸相同。

至於確切的縮放比例,它也會相對於視口大小而改變。爲了正確地獲取像素,您必須不斷更改投影,或保持視口大小不變。

爲了使其工作爲1:1,如果您的視口爲x像素寬,則正交投影應爲x像素寬。

2

如果您使用2D繪圖,則不想使用透視投影。如果你用gluOrtho2D(0, window_width, window_height, 0);設置你的相機,那麼你應該得到你想要的。

+0

在我的代碼中應該更改它的位置,我試過了,但它什麼都沒做 – jmasterx 2010-05-01 22:03:28

+0

您需要更換'gluPerspective()'調用。 – tzaman 2010-05-01 22:51:44