如何从3ds文件中正确渲染人脸?

How can I properly render faces from a 3ds file

本文关键字:3ds 文件      更新时间:2023-10-16

我已经实现了将3DS文件加载到我的OpenGL程序中的能力,并且遇到了一个小问题。所有的顶点都被正确地放置,并且绘制了面,但问题是大多数(或全部)顶点似乎保留了与一个或两个顶点的连接,从而创建了大量额外的边。有人遇到这个问题之前或有一个建议,我可以如何解决它?

下面的代码块是我用来绘制面的循环。它一次循环一个顶点,跳过每四个值(理论上),因为它们是未使用的面部修饰符。

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x++)
{
    //Face bit modifiers not needed, skip em.
    if(tLoop == 4)
    {
        tLoop = 0;
        continue;
    }
    else
    {
        glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
        tLoop++;
    }
}
glEnd();

下面是一个图像,代表了我遇到的问题。http://img.photobucket.com/albums/v298/Reaperc89/Pistol.jpg

glBeginglEnd在循环之外的事实绝对没有问题。使用每个顶点一个接一个地绘制三角形是正确的方法。它将每3个连续的顶点构建一个三角形,这就是你想要的。

您的问题是,您在else块中增加了tLoop,因此实际上跳过了每第五个索引,而不是每四个索引。所以展开阻止了它,但是它与glBegin/glEnd不能在循环外工作无关。但就像评论中说的,你不需要tLoop,因为你可以用x代替:

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x++)
    if(x % 4)   //works if x starts at 1, though I don't know why x has to start at 1
        glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
glEnd();

或者更好的是展开循环:

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x+=4) {
    glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
    glVertex3f(Vertices[Triangles[x+1]*3],Vertices[(Triangles[x+1]*3)+1],Vertices[(Triangles[x+1]*3)+2]);
    glVertex3f(Vertices[Triangles[x+2]*3],Vertices[(Triangles[x+2]*3)+1],Vertices[(Triangles[x+2]*3)+2]);
}
glEnd();

但是将glBegin/glEnd放在循环中是你能做的最愚蠢的事情。事实上,如果你已经使用了基于顶点/索引数组的表示,那么将渲染代码移植到顶点数组应该是相当容易的,这比直接模式要快得多,在vbo的支持下更是如此。

自己解决了问题。注意开始和结束块是如何出现在循环之外的。程序试图使用网格中的每个顶点绘制三角形,一个接一个。因此它制造了一个巨大的混乱。我改为一次放置三个顶点(一个面),并将开始/结束块放置在循环中,并将循环更改为每次递增4,允许我跳过面数据。

如果有人好奇的话