1

已解决:我不确定如何...感谢您的所有帮助。

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

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

问题是网格不可见。

绘制我正在使用的显示列表glCallLists (list, 1);

我已经验证我可以通过在屏幕中心绘制一个点来将东西绘制到屏幕上,并且效果很好。

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

我知道我拥有的数据都是有效的,通过在将每个顶点、法线和纹理坐标打印到文件中,然后再将其添加到显示列表中进行验证,它看起来是有效的。

我没有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 ();
4

1 回答 1

3

这个

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

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

sgn(近) = sgn(远) ^ 0 < |近| < |远|

通常近和远都被选为正数。此外,根据经验,应选择尽可能远的近剪裁平面。远平面可以放置在无穷远处(利用同质矩阵的一些属性),但通常放置得尽可能靠近以最大化深度缓冲区分辨率。

于 2012-08-17T13:13:27.330 回答