opengl无法绘制网格

时间:2012-08-17 12:50:52

标签: c opengl mesh

解决:我不太确定如何...感谢所有帮助人员。

我尝试glDisable(GL_CULL_FACE);,但网格仍然不可见。

基本上我正在尝试使用显示列表在OpenGL中绘制网格(由顶点,法线和纹理坐标构成)。网格为.obj格式(从3ds max 2013导出)

问题是网格不可见。

要绘制显示列表,我只是使用glCallLists (list, 1);

我已经确认我可以通过在屏幕中央绘制一个点来绘制内容并且工作正常。

相机是否可能位于网格内?如果是这样,我可以启用OpenGL状态以允许我看到一组顶点的内部吗?

我知道我拥有的数据都是有效的,通过在将每个vert,normal和texture coord打印到文件之前对其进行验证,然后将其添加到显示列表中,它看起来是有效的。

我没有glTranslatef或类似的东西,我的投影矩阵设置如下:

glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (45.0, (float)1024/(float)768, -9999, 9999);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();

如果您想查看.obj文件,请点击此处:http://pastebin.com/PpG3vG5e

这是我创建显示列表的方式:

list = glGenLists (1);
glNewList (list, GL_COMPILE);
glBegin (GL_TRIANGLES);

for (i = 0; i < data.face_count; i++)
{
    // first vert
    normal[0][0] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[0]]->e[0];
    normal[0][1] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[0]]->e[1];
    normal[0][2] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[0]]->e[2];
    tex[0][0] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[0]]->e[0];
    tex[0][1] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[0]]->e[1];
    tex[0][2] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[0]]->e[2];
    vert[0][0] = (float)data.vertex_list[data.face_list[i]->vertex_index[0]]->e[0];
    vert[0][1] = (float)data.vertex_list[data.face_list[i]->vertex_index[0]]->e[1];
    vert[0][2] = (float)data.vertex_list[data.face_list[i]->vertex_index[0]]->e[2];

    // second vert
    normal[1][0] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[1]]->e[0];
    normal[1][1] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[1]]->e[1];
    normal[1][2] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[1]]->e[2];
    tex[1][0] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[1]]->e[0];
    tex[1][1] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[1]]->e[1];
    tex[1][2] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[1]]->e[2];
    vert[1][0] = (float)data.vertex_list[data.face_list[i]->vertex_index[1]]->e[0];
    vert[1][1] = (float)data.vertex_list[data.face_list[i]->vertex_index[1]]->e[1];
    vert[1][2] = (float)data.vertex_list[data.face_list[i]->vertex_index[1]]->e[2];

    // third vert
    normal[2][0] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[2]]->e[0];
    normal[2][1] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[2]]->e[1];
    normal[2][2] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[2]]->e[2];
    tex[2][0] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[2]]->e[0];
    tex[2][1] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[2]]->e[1];
    tex[2][2] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[2]]->e[2];
    vert[2][0] = (float)data.vertex_list[data.face_list[i]->vertex_index[2]]->e[0];
    vert[2][1] = (float)data.vertex_list[data.face_list[i]->vertex_index[2]]->e[1];
    vert[2][2] = (float)data.vertex_list[data.face_list[i]->vertex_index[2]]->e[2];

    for (j = 0; j < 3; j++)
    {
        glNormal3f (normal[j][0], normal[j][1], normal[j][2]);
        glTexCoord3f (tex[j][0], tex[j][1], tex[j][2]);
        glVertex3f (vert[j][0], vert[j][1], vert[j][2]);
    }
}

glEnd ();
glEndList ();

编辑: 我尝试过这样的事情:

glTranslatef (0, 0, 5);
glCallList (mesh);
glTranslatef (0, 0, 0);

但它们也不起作用:(

编辑:

@datenwolf 这是我用来绘制它的代码:

Draw_Begin ();
Mdl_Draw (list, 0.0f, 0.0f, 0.0f);
Draw_End ();

1 个答案:

答案 0 :(得分:3)

gluPerspective (45.0, (float)1024/(float)768, -9999, 9999);

错了。在透视投影中,近平面和远平面距离必须具有相同的符号,即正或负两者。此外,近平面的绝对值必须小于远平面的绝对值。 并且近平面距离必须非零。用数学符号表示:

sgn(near)= sgn(far)^ 0&lt; |近| &LT; |远|

通常选择近和远都是正面的。同样作为经验法则,应尽可能选择近剪裁平面。远平面可以放置在无限远处(显示均匀矩阵的一些属性),但通常尽可能接近最大深度缓冲区分辨率。