2014-09-18 43 views
0

我有一個設置功能,設置視口占據整個窗口大小,加載單位矩陣,然後使用gluOrtho2d()在該視口內設置一個座標系。如果我的這個功能的理解是正確的,我現在應該能夠在y軸呼叫使用座標我的繪圖功能,從0到780的X軸和0至460使用gluortho2d但繪圖功能不使用新的座標

void gl_setup(void) { 
    glViewport(0,0, 780,460); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0,0,780,460); 

    return ; 
} 

然而,在我my_display函數,我的形狀根據(-1,1,-1,1)座標系繪製。例如,

glBegin(GL_LINE_STRIP); 
glVertex2f(0, -1.0f); 
glVertex2f(0, 1.0f); 
glEnd(); 
glBegin(GL_LINE_STRIP); 
glVertex2f(-1.0f, 0); 
glVertex2f(1.0f, 0); 
glEnd(); 

繪製兩條線,一條直接下視區的中間從上到下,和一個直接穿過視口的中間從左到右。在我以爲我在上面定義的座標系中,我是否應該使用

glBegin(GL_LINE_STRIP); 
glVertex2f(0, 230.0f); 
glVertex2f(780, 230.0f); 
glEnd(); 
glBegin(GL_LINE_STRIP); 
glVertex2f(390.0f, 0); 
glVertex2f(390.0f, 460.0f); 
glEnd(); 

或大約那裏?

編輯:繪圖發生在my_display()函數,這是glutDisplayFunc回調。這個功能看起來是這樣的:

void my_display(void) { 
    glClear(GL_COLOR_BUFFER_BIT) ; 

    glColor3f(0.1, 0.1, 0.79); 

    glBegin(GL_LINE_STRIP); 
    glVertex2f(0, -1.0f); 
    glVertex2f(0, 1.0f); 
    glEnd(); 
    glBegin(GL_LINE_STRIP); 
    glVertex2f(-1.0f, 0); 
    glVertex2f(1.0f, 0); 
    glEnd(); 

    glColor3f(1.0f, 0, 0); 
    glBegin(GL_LINE_STRIP); 
    glVertex2f(0.0, -1.0f); 
    glVertex2f(0.0, -2.0f); 
    glEnd(); 
    glBegin(GL_LINE_STRIP); 
    glVertex2f(-2.0f, 0); 
    glVertex2f(-1.0f, 0); 
    glEnd(); 

    glutSwapBuffers(); 

    return ; 
} 

編輯2:我的主要功能如下:

int main(int argc, char **argv) { 
    glutInit(&argc, argv) ; 
    glut_setup() ; 
    gl_setup() ; 
    glutMainLoop() ; 

    return(0) ; 
} 

我glSetup以上。 glut_setup()是我定義我的所有回調:

glutDisplayFunc(my_display); 
glutReshapeFunc(my_reshape); 
glutKeyboardFunc(my_keyboard); 
glutMouseFunc(my_mouse); 

而且my_reshape如下所示,這在我的理解(這可能誠然從真相很遠)保持視每當窗口大小相同的大小,並保持其相對居中:

void my_reshape(int w, int h) { 
    // update window dimensions 
    WIN_W = w; 
    WIN_H = h; 

    int win_x = (w-780)/2; 
    int win_y = (h-460)/2; 

    glViewport (win_x,win_y,780,460); 
    return; 
} 
+0

當您將矩陣模式保留在GL_PROJECTION處時,一種瘋狂的猜測就是您重置投影矩陣時使用了一些'glLoadIdentity()'調用或類似的操作。但是到目前爲止所給出的代碼,這是遠未確定的。 – derhass 2014-09-18 17:57:45

+0

你是對的@derhass,我已經添加了實際完成繪圖的全部功能。 – sven 2014-09-18 18:13:12

+0

這還不夠。你在哪裏調用'gl_setup()',並在進入主循環的過程中發生了什麼?其他回調也可能會在這裏產生干擾,如重塑功能。 – derhass 2014-09-18 18:17:33

回答

2

您對gluOrtho2D的參數順序錯誤。它應該是左側,右側,底部,頂部,這將爲您的程序gluOrtho2D(0,780,0,460)制定正確的順序。你定義它的方式將有一個0的寬度,這很可能會導致一個錯誤,它不會將投影矩陣設置爲默認值。請參閱此處的功能規格:https://www.opengl.org/sdk/docs/man2/xhtml/gluOrtho2D.xml

相關問題