-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;
}
또한 GLUT_DEPTH를'glutInitDisplayMode'에 넣어서 (그리고 지구상에서 누가 GLUT_SINGLE을 합리적으로 사용하는지 가르쳐야 하는가?) 문맥에 깊이 버퍼를 요구해야한다. –
여러분 감사합니다! 그것은 효과가 있었다. 선생님 께서 GLUT_SINGLE을 사용하라고 말씀하셨습니다. 이중 버퍼를 사용해야합니까? 그 차이점을 설명해 주시겠습니까? 감사! –
@CarlosVargas : GLUT_SINGLE 대신 GLUT_DOUBLE을 사용하면 깜박임을 방지 할 수 있습니다. –