2013-07-11 3 views
-1

4 면체를 수동으로 (4 개의 삼각형) 만들고 회전시키기로 결정했습니다. 그것은 일종의 일이지만 유일한 문제는 삼각형 중 하나가 그려지지 않는다는 것입니다. 내 예제 코드에서는 앞쪽 삼각형 (빨강)이 먼저 그려지지만, 렌더링하면 결코 나타나지 않습니다. 대신 왼쪽 삼각형 (흰색)과 오른쪽 삼각형 (파란색)의 절반이 나타납니다. 그러나 코드를 변경하고 다른 삼각형의 정점 다음에 앞 삼각형의 세 꼭지점을 넣으면 전 삼각형을 얻습니다. 그럼에도 불구하고 다른 두 개의 삼각형 중 하나가 사라집니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?OpenGL로 4 개의 삼각형을 가진 4 면체를 그리기

#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

또한 GLUT_DEPTH를'glutInitDisplayMode'에 넣어서 (그리고 지구상에서 누가 GLUT_SINGLE을 합리적으로 사용하는지 가르쳐야 하는가?) 문맥에 깊이 버퍼를 요구해야한다. –

+0

여러분 감사합니다! 그것은 효과가 있었다. 선생님 께서 GLUT_SINGLE을 사용하라고 말씀하셨습니다. 이중 버퍼를 사용해야합니까? 그 차이점을 설명해 주시겠습니까? 감사! –

+1

@CarlosVargas : GLUT_SINGLE 대신 GLUT_DOUBLE을 사용하면 깜박임을 방지 할 수 있습니다. –

관련 문제