2013-07-11 62 views
-1

我決定手動創建一個四面體(4個三角形)並旋轉它。它有點工作,唯一的問題是其中一個三角形從未畫出。在我的示例代碼中,前三角形(紅色)首先繪製,但是當我渲染它時,它從不出現。出現左半邊三角形(白色)和直角三角形(藍色)的一半。但是,當我更改代碼並將前三角形的三個頂點放在其他三角形的頂點之後時,我確實得到了前三角形。儘管如此,另外兩個三角形中的一個消失了。我究竟做錯了什麼?用OpenGL繪製一個帶有四個三角形的四面體

#include <stdio.h> 
#include <stdlib.h> 
#include <GLUT/glut.h> 
#include <OpenGL/glu.h> 
#include <OpenGL/gl.h> 

float posx = 0; 
float posy = 0; 

void drawLines(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    //THIS ROTATES THE WHOLE SCENCE 
    /*glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glRotatef(posx, 0.0f, 1.0f, 0.0f);*/ 

    //THIS ROTATES ONLY THE OBJECTS INSIDE THE GLPUSHMATRIX AND GLPOPMATRIX FUNCTIONS 
    glPushMatrix(); 
    glRotatef(posx, 0.0f, 1.0f, 0.0f); 

    //TETAEDRON BY HAND 
    glBegin(GL_TRIANGLES); 

    //front triangle 
    glColor4f(1.0f, 0.0f, 0.0f, 1.0f); 
    glVertex3f(0.0f, 5.0f, 0.0f); 
    glVertex3f(-5.0f, -5.0f, 0.0f); 
    glVertex3f(5.0f, -5.0f, 0.0f); 

    //right side triangle 
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f); 
    glVertex3f(5.0f, -5.0f, 0.0f); 
    glVertex3f(0.0f, 5.0f, 0.0f); 
    glVertex3f(0.0f, -5.0f, -5.0f); 

    //left side triangle 
    glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
    glVertex3f(-5.0f, -5.0f, 0.0f); 
    glVertex3f(0.0f, 5.0f, 0.0f); 
    glVertex3f(0.0f, -5.0f, -5.0f); 

    //bottom triangle 
    glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
    glVertex3f(-5.0f, -5.0f, 0.0f); 
    glVertex3f(5.0f, -5.0f, 0.0f); 
    glVertex3f(0.0f, -5.0f, -5.0f); 

    glEnd(); 

    //glutSolidTeapot(5.0); 
    glPopMatrix(); 
    glutWireTeapot(5.0); 
    glFlush(); 
} 

void init() 
{ 
    /*glClearDepth(1.0f); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL);*/ 
    glClearColor(0, 0, 0, 0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-10.0f, 10.0f, -10.0f, 10.0f, -10.0f, 10.0f);//range of x,y,z axis 
    //gluOrtho2D(0.0f, 500.0f, 500.0f, 0.0f);//setup the camera in 2d mode 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

void keyboard(unsigned char key, int x, int y) 
{ 
    switch (key) 
    { 
     case 'd':posx+=10; 
      printf("derecha %f\n",posx); 
      break; 
     case 'a':posx-=10; 
      printf("izquierda\n"); 
      break; 
     case 'w':posy-=10; 
      printf("arriba\n"); 
      break; 
     case 's':posy+=10; 
      printf("abajo\n"); 
      break; 
    } 

//glMatrixMode(GL_MODELVIEW); 
//glLoadIdentity(); 
//glViewport(100.0f, 100.0f, 500.0f, 500.0f); 
//glTranslatef(posx, posy, 0.0); 
if(posx>=360) 
    posx = 0; 
//glRotatef(posx, 0.0f, 1.0f, 0.0f); 
} 

int main(int argc, const char * argv[]) 
{ 

    // insert code here... 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE); 
    glutInitWindowPosition(400, 200); 
    glutInitWindowSize(500, 500); 
    glutCreateWindow("OpenGLTest"); 

    init(); 

    glutDisplayFunc(drawLines); 
    glutIdleFunc(drawLines); 
    glutKeyboardFunc(keyboard); 
    glutMainLoop(); 
    return 1; 
} 

回答

2

您需要啓用深度測試。目前它已在您的init()函數中註釋掉。

+1

除此之外,你還應該通過在'glutInitDisplayMode'中放入'GLUT_DEPTH'(以及誰在地球上使用或教導使用GLUT_SINGLE'作爲合理的?)來爲上下文請求深度緩衝區。 –

+0

謝謝你們!有效。我的老師Christian告訴我們要使用GLUT_SINGLE。我應該使用雙緩衝區嗎?你介意解釋我的區別嗎?謝謝! –

+1

@CarlosVargas:使用GLUT_DOUBLE而不是GLUT_SINGLE可以防止它閃爍。 –