2010-10-06 29 views
0

我想提請使用GL_POLYGON但由於某種原因它正在整個窗口的三角形..三角形正在佔據整個窗口?

... 
typedef struct myTriangle { 
    float tx; 
    float ty; 
} myTriangle; 

std::vector<myTriangle> container; 

void display() { 
    glClear(GL_COLOR_BUFFER_BIT); 

    for(int i = 0; i < (int)container.size(); ++i) { 
     glBegin(GL_POLYGON); 
     glColor3f(0.35, 0.0, 1.0); 
     glVertex2f(container.at(i).tx, container.at(i).ty + 20); 
     glVertex2f(container.at(i).tx - 20, container.at(i).ty - 20); 
     glVertex2f(container.at(i).tx + 20, container.at(i).ty - 20); 
     glEnd(); 
    } 

    glutSwapBuffers(); 
} 

... 

int main(int argc, char** argv) { 
    myTriangle t1; 
    container.push_back(t1); 
    container.back().tx = (float)0.; 
    container.back().ty = (float)0.; 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE); 

    // initializations 
    glutInitWindowSize(400, 400); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Transformer"); 
    glClearColor(1.0, 1.0, 1.0, 1.0); 

    // global variable initialization 
    GW = GH = 200; 

    // callback functions 
    glutDisplayFunc(display); 
    glutMouseFunc(mouse); 
    glutMotionFunc(mouseMove); 
    glutKeyboardFunc(keyboard); 

    glutMainLoop(); 
} 

應該在原點(0,0)在400x400的窗口中繪製一個等邊三角形40× 。有什麼我做錯了嗎?

回答

2

你似乎混淆3D(世界)與二維(屏幕)座標座標。您傳遞給glVertex2f的座標是3D座標,需要在它們顯示在窗口中之前進行相應的轉換。您的窗口大小無關緊要:您可以隨時設置您的投影矩陣,以便在任何窗口中儘可能多地顯示3D空間。

您還沒有設置任何轉換的OpenGL初始化後,讓你在使用默認矩陣,坐落在3D空間中的原點(0,0,0)和三角形就在你繪製。

這裏有一個quick tutorial,顯示你,讓你看起來查看從遠處三角形如何設置變換矩陣。

0

在OpenGL中,您的屏幕從[-1,-1]到[1,1]定義。它的渲染系統如何工作。

嘗試做

glScalef(2.0f/400, 2.0f/400, 1); 
glTranslatef(-1f, -1f, 0); 

什麼顯卡現在做的就是把它們在像素定義你的頂點,並轉化他們,使他們正確地坐在裏面[-1,-1]到[1, 1]邊界。

你會看到,它首先從[0,0]對其進行縮放 - [400,400] boundry爲[0,0] - [2,2]。它將它翻譯成最終的[-1,-1] - [1,1]