2011-05-20 48 views
0
void init (void) 
{ 
    glClearColor (1.0, 1.0, 1.0, 0.0); 

    //glMatrixMode(GL_MODELVIEW); 
    //gluLookAt(x0, y0, z0, xref, yref, zref, Vx, Vy, Vz); 

    glMatrixMode(GL_PROJECTION); 
    gluPerspective(45, 2, -1, 1); 
    //glFrustum(xwMin, xwMax, ywMin, ywMax, dnear, dfar); 
    //gluPerspective(45.0, 45, -1, 1); 
} 

void displayFcn (void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glColor3f(0.0, 1.0, 0.0); 
    glPolygonMode(GL_FRONT, GL_FILL); 
    glPolygonMode(GL_BACK, GL_LINE); 

    glBegin(GL_TRIANGLES); 
     glVertex3f(0.0, 0.0, 0.0); 
     glVertex3f(0.1, 0.0, 0.0); 
     glVertex3f(0.50, 0.866025, 0.0);  
    glEnd(); 

    glFlush(); 
} 

void reshapeFcn(GLint newWidth, GLint newHeight) 
{ 
    glViewport(0,0,newWidth, newHeight); 

    winWidth = newWidth; 
    winHeight = newHeight; 

} 
void main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowPosition(400,200); 
    glutInitWindowSize(winWidth, winHeight); 
    glutCreateWindow("Test"); 

    init(); 
    glutDisplayFunc(displayFcn); 
    glutReshapeFunc(reshapeFcn); 
    glutMainLoop(); 
} 

有人可以解釋一下,並給出建議如何使三角形可見。OpenGL投影問題:爲什麼我在屏幕上看不到任何東西?

+0

我能看到的是一個帶有白色背景的空白窗口。 – user469652 2011-05-20 11:35:38

回答

2

我不認爲你可以設置'zNear'爲負。這會對深度緩衝區做出奇怪的事情,並意味着你會看到眼前的事物。 Docs say it's always positive。不管窗口的高寬比如何,如果將高寬比固定爲2,則也可能會產生一些奇怪的結果。

您還需要將當前矩陣設置爲datenwolf顯示的MODEL_VIEW。你不需要需要來使用gluLookAt,但是你需要做一些事情來將三角形從眼睛所在的原點移開。您可以通過將z分量設置爲某個負值或通過在頂點之前應用轉換來實現此目的:

glPushMatrix(); 
glTranslated(0,0,-5); 
glBegin(GL_TRIANGLES); 
    glVertex3f(0.0, 0.0, 0.0); 
    glVertex3f(0.1, 0.0, 0.0); 
    glVertex3f(0.50, 0.866025, 0.0);  
glEnd(); 
glPopMatrix(); 
+0

我totallz錯過了。然而負值也可以在透視模式下工作。只有在原點處,「d是一個奇點,投影看起來像是兩個金字塔連接在他們的尖端 – datenwolf 2011-05-21 13:58:01

+0

@datenwolf確實,即使zNear是負數,矩陣運算也適用於視角,但我想不出深度緩衝區可能有效。 – JCooper 2011-05-21 16:33:21

+0

對於負轉換的Z值,您將看到倒置深度排序。 – datenwolf 2011-05-21 18:25:32

2

gluPrespectivegluLookAt乘法上所選擇的堆棧上的當前矩陣的頂部上。您需要首先加載身份纔有意義。你也需要在渲染之前設置一個視口。最佳做法是在顯示功能中設置所有矩陣和視口,而在其他地方不設置。堅持這一規則會讓你的生活變得更輕鬆。在OpenGL中,通常也沒有專門的初始化階段。資源按需加載。

void displayFcn (void) 
{ 
    glViewport(0,0,winWidth, winHeight); 

    glClearColor (1.0, 1.0, 1.0, 0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45, 2, 1, 10); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(x0, y0, z0, xref, yref, zref, Vx, Vy, Vz); 

    glColor3f(0.0, 1.0, 0.0); 
    glPolygonMode(GL_FRONT, GL_FILL); 
    glPolygonMode(GL_BACK, GL_LINE); 

    glBegin(GL_TRIANGLES); 
     glVertex3f(0.0, 0.0, 0.0); 
      glVertex3f(0.1, 0.0, 0.0); 
     glVertex3f(0.50, 0.866025, 0.0);  
    glEnd(); 

    glFinish(); 
} 

void reshapeFcn(GLint newWidth, GLint newHeight) 
{ 
    winWidth = newWidth; 
    winHeight = newHeight; 
    glutPostRedisplay(); 
} 

void main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowPosition(400,200); 
    glutInitWindowSize(winWidth, winHeight); 
    glutCreateWindow("Test"); 

    glutDisplayFunc(displayFcn); 
    glutReshapeFunc(reshapeFcn); 
    glutMainLoop(); 
}