2011-05-20 12 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

答えて

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はそれを逃した。ただし、負の値はパースペクティブモードでも機能します。 – datenwolf

+0

@datenwolf zNearが負であっても、行列の数学が視点を適用することは事実ですが、どのように考えることができないのですか?深度バッファが機能する可能性があります。 – JCooper

+0

負の変換されたZ値の場合、反転深度ソートが表示されます。 – datenwolf

2

gluPrespectiveおよびgluLookAt選択したスタックの現在のマトリックスの上に乗算します。最初にIDをロードして意味をなす必要があります。また、レンダリングする前にビューポートを設定する必要があります。ベストプラクティスは、すべての行列とビューポートを表示関数に設定することです。そのルールに従えば、あなたの人生はずっと楽になります。また、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(); 
} 
関連する問題