我正在编写一个python转换器,它接收一个.obj文件并以另一种格式输出。我注意到.obj文件有很多重复的顶点,很多面都引用了这些副本。
所以我编写的脚本只添加一个顶点并忽略任何重复,如果任何面引用了重复的顶点,我只需将其重定向到正确的索引。
我通过使用字典检查dupes,其中键是x,y,z值,值只是“1”,因此我可以将其添加为条目。然后我检查密钥是否存在以确定所讨论的顶点是否是欺骗。
但obj文件有重复顶点的原因是什么?如果我决定取出所有重复的条目,结果模型是否不同?我有一个特殊的obj文件有2849个顶点,除了845个重复。
答案 0 :(得分:2)
您应该使用set()
而不是字典来存储您的唯一顶点,您将不再需要使用虚拟值。
关于重复的顶点,它似乎是模型制作软件的“bug”或软件开发者的“bug”(have a look here)
答案 1 :(得分:2)
很可能是因为在OpenGL中渲染对象的方式。根据您想要设置渲染的方式,OBJ文件非常易于在OpenGL中读取和渲染。他们可能有重复顶点的一个原因是,如果你想要交错的顶点数组,最终可能更容易从具有重复顶点的OBJ文本文件创建交错数组而不是非重复顶点,因为使用GL_TRIANGLES调用glDrawArrays()需要一行中定义一个面的三个顶点,它不使用索引。缺少glDrawArrays的索引使得必须具有重复的顶点。当然,可能会有某些聪明的c ++技巧,我不知道可以绕过这个限制,但我还是没想到它。