3D金字塔显得分散,两侧混合

时间:2012-11-18 16:52:02

标签: c opengl glut

首先,我定义了一个表达金字塔协调的结构:

typedef struct
{
    GLfloat xUp;
    GLfloat yUp;
    GLfloat zUp;
    GLfloat base;
    GLfloat height;
}pyramid;

这里很明显:我存储了最高点,底座和高度的坐标 我写了一个绘制金字塔的函数:

void drawPyramid(pyramid pyr)
{
    GLfloat p1[]= {pyr.xUp+pyr.base/2.0, pyr.yUp-pyr.height, pyr.zUp-pyr.base/2.0};
    GLfloat p2[]= {pyr.xUp+pyr.base/2.0, pyr.yUp-pyr.height, pyr.zUp+pyr.base/2.0};
    GLfloat p3[]= {pyr.xUp-pyr.base/2.0, pyr.yUp-pyr.height, pyr.zUp+pyr.base/2.0};
    GLfloat p4[]= {pyr.xUp-pyr.base/2.0, pyr.yUp-pyr.height, pyr.zUp-pyr.base/2.0};
    GLfloat up[]= {pyr.xUp, pyr.yUp, pyr.zUp};

    glBegin(GL_TRIANGLES);

    glColor4f(1.0, 0.0, 0.0, 0.0);
    glVertex3fv(up);
    glVertex3fv(p1);
    glVertex3fv(p2);

    glColor4f(0.0, 1.0, 0.0, 0.0);
    glVertex3fv(up);
    glVertex3fv(p2);
    glVertex3fv(p3);

    glColor4f(0.0, 0.0, 1.0, 0.0);
    glVertex3fv(up);
    glVertex3fv(p3);
    glVertex3fv(p4);

    glColor4f(1.0, 1.0, 0.0, 0.0);
    glVertex3fv(up);
    glVertex3fv(p4);
    glVertex3fv(p1);
    glEnd();



    glColor4f(0.0, 1.0, 1.0, 0.0);
    glBegin(GL_QUADS);
    glVertex3fv(p1);
    glVertex3fv(p2);
    glVertex3fv(p3);
    glVertex3fv(p4);
    glEnd();

}

我努力以逆时针顺序绘制所有顶点,但可能我搞砸了一些东西 这就是我在渲染函数中显示金字塔的方式:

void display()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glTranslatef(0.0, -25.0, 50.0);
    glRotatef(-angle, 0.0, 1.0, 0.0);
    glTranslatef(0.0, 25.0, -50.0);

    pyramid pyr;
    pyr.xUp=0.0;
    pyr.yUp=10.0;
    pyr.zUp=50.0;
    pyr.base=10.0;
    pyr.height=18.0;
    glColor4f(1.0, 0.0, 0.0, 0.0);
    drawPyramid(pyr);

    glutSwapBuffers();
}

我还使用在glut主循环之前调用的init方法:

void init()
{
    glEnable(GL_DEPTH);
    glViewport(-1.0, 1.0, -1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(35.0, 1.0, 1.0, 100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0,1.0,0.0, 0.0,1.0,30.0, 0.0,1.0,0.0);
}

角度只是我用来旋转金字塔的两倍,可以通过按“r”来改变,但这是不相关的。看来真正的问题是我如何绘制顶点。
问题是金字塔的面孔看起来很分散,搞砸了。我最好用图像描述这种情况:

Pyramid

有一张太小的脸,显示出来,我不知道为什么 如果我旋转金字塔,它看起来搞砸了,我甚至还记得一段视频来描述这一点 如果问题不完全清楚,我可以上传它。

PS:很多人都注意到我使用的是过时的技术。但不幸的是,这就是我大学提供的。

修改

我忘了说主要功能:

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(500, 500);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Sierpinsky Pyramid");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    init();
    glutMainLoop();
    return 0;
}

1 个答案:

答案 0 :(得分:3)

看起来深度缓冲区未初始化。

调用glEnable(GL_DEPTH_TEST)是不够的。您必须正确初始化过剩并指定您需要深度缓冲区支持,否则您将无法获得深度缓冲区。如果我没记错的话,可以使用glutInitDisplayMode(GLUT_DEPTH|...)完成。请参阅文档here和简介here。可以使用谷歌找到其他信息。

- 编辑 -

您将无效参数传递给glEnable。请致电glEnable(GL_DEPTH_TEST)而不是glEnable(GL_DEPTH)

此外:

  1. 显示功能中的矩阵代码不受glPushMatrix / glPopMatrix的保护。这意味着每次旋转金字塔时,旋转都会应用于上一次变换。即调用显示功能将旋转金字塔。
  2. 使用无效参数调用glViewport。 glViewport需要4个整数参数,但是你试图传递浮点数。那么,什么是“-1.0的宽度”应该是什么意思?
  3. 您尚未检查任何错误代码(glGetError)。如果你试图在glEnable调用之后调用glGetError,那么你会看到它返回GL_INVALID_ENUM。
  4. OpenGL有文档。文档可在opengl.org上获得。使用它并阅读它。另外,我建议阅读“OpenGL红皮书”。