3D格式:obj和重复顶点

2 投票
2 回答
1733 浏览
提问于 2025-04-16 16:40

我正在写一个Python程序,用来把.obj文件转换成其他格式。我发现.obj文件里有很多重复的顶点,而且很多面都是指向这些重复的顶点。

所以我写了一个脚本,只添加每个顶点一次,忽略重复的部分。如果某个面指向了一个重复的顶点,我就把它指向正确的顶点索引。

我用一个字典来检查重复的顶点,字典的键是顶点的x、y、z坐标,值就简单地设为“1”,这样我就可以把它作为一个条目添加进去。然后我检查这个键是否存在,以此来判断这个顶点是不是重复的。

但是,为什么.obj文件里会有重复的顶点呢?如果我把所有重复的条目都去掉,生成的模型会有什么不同吗?我有一个特定的.obj文件,有2849个顶点,其中845个是重复的。

2 个回答

2

很可能这是因为在OpenGL中对象的渲染方式。根据你想要的渲染设置,OBJ文件在OpenGL中非常容易读取和渲染。它们可能会有重复的顶点,原因之一是如果你想使用交错顶点数组,那么从一个包含重复顶点的OBJ文本文件创建交错数组可能会更简单,而不是从没有重复顶点的文件中创建。因为在调用glDrawArrays()时,GL_TRIANGLES需要连续的三个顶点来定义一个面,而它不使用索引。由于glDrawArrays不使用索引,所以就需要有重复的顶点。当然,可能有一些我不知道的聪明的C++技巧可以绕过这个限制,但我到现在还没搞明白。

2

你应该用一个 set() 来存储你的唯一顶点,这样就不需要再用一个虚假的值了。

关于重复的顶点,这似乎是模型制作软件的一个“bug”,或者是软件开发者的一个“bug”(可以看看这里)。

撰写回答