显示3D三角形的旋转

问题描述

我试图显示一个相对于y轴旋转的三角形。但我无法正确显示。我该如何解决?我的代码有什么问题

init:

void init() {
     glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    glClearColor(0.7f,0.9f,1.0f,1.0f);
    glEnable(GL_CULL_FACE);
  glCullFace(GL_BACK);


    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
  glFrustum(-30,30,-30,90);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}

显示

void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glrotatef(0.0,0.0f,0.0f);


    glBegin(GL_TRIANGLES);


    glVertex3f(20.0f,10.0f,-10.0f);
    glVertex3f(50.0f,15.0f,-20.0f);
    glVertex3f(32.0f,30.0f,-10.0f);

    glEnd();

    glutSwapBuffers();
}

解决方法

模型绕(0,0,0)旋转。不要沿负z轴平移顶点,而是围绕(0,0,0)排列顶点,并在旋转模型后通过glTranslate平移模型。例如:

void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0.0f,0.0f,-60.0f);
    glRotatef(0.0,1.0f,0.0f);


    glBegin(GL_TRIANGLES);

    glVertex3f(-15.0f,-10.0f,5.0f);
    glVertex3f(15.0f,-5.0f,-5.0f);
    glVertex3f(-3.0f,10.0f,5.0f);

    glEnd();

    glutSwapBuffers();
}

请注意,您必须确保模型在透视投影的近平面和远平面之间。在您的情况下,近平面为30.0,远平面为90.0:

glFrustum(-30,30,-30,90);

所有不在近平面和远平面之间的几何都将被裁剪。

由于您的几何不是封闭体积,因此我建议禁用人脸剔除:

glEnable(GL_CULL_FACE);