为什么还有很多波前obj文件在一个面上包含4个顶点?

时间:2016-07-09 06:45:08

标签: opengl wavefront

今天,我开始实现一个wavefront obj加载器,事实是我不知道为什么在互联网上有这么多obj文件包含4个顶点,尽管OpenGL不再支持GL_QUADS并且不赞成使用它。

这有什么解决方法吗?我的意思是,每当我尝试使用GL_TRIANGLE_FAN或GL_TRIANGLE_STRIP绘制包含4个顶点的面时,它都会显示悲剧结果。所以最后我别无选择,只能在每张脸上发出绘图命令,如你所知,它表现出糟糕的表现。我想绘制它,在每个组或平滑组上只发出一个命令。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

因为OBJ是一种与OpenGL完全无关的文件格式。

OBJ文件中的Face语句可以包含任意数量的顶点,而不仅仅是3或4.而且它们包含4个以上并不罕见。因此,如果您希望能够阅读合理的各种类型的顶点。 OBJ文件,你需要准备好每面读取任意数量的顶点。

这确实不会增加太多困难。除非您使用算法来分析连接性并构建网格,否则无论如何,每个face语句都会得到一个单独的三角形,即使对于每个面只有3个顶点的文件也是如此。因此,在这种情况下,您为每个面创建一个三角形,并使用基本类型GL_TRIANGLES绘制它们。

因此,每个面具有超过3个顶点的所有更改都是每个面生成多个三角形。对于具有n - 2个顶点的面,您需要n个三角形。我对这个问题的回答更详细地解释了如何做到这一点:Converting quadriladerals in an OBJ file into triangles?

另一种选择是将每个面部视为三角形扇形,并使用GL_TRIANGLE_FAN基本类型渲染它们。凸多边形(如果文件中的面是非凸多边形,则所有这些都会分解)可以始终绘制为三角形扇形,同时保持顶点完全按原始顺序排列。要将每个面部视为单独​​的三角形扇形,您可以使用自OpenGL 3.1以来可用的基元重启功能,使用如下调用:

glEnable(GL_PRIMITIVE_RESTART);
glPrimitiveRestartIndex(...);

很容易判断OBJ没有针对OpenGL渲染。更麻烦的方面是OBJ对位置,法线和纹理坐标使用单独的索引,而OpenGL仅支持用于所有顶点属性的单个索引集。这往往会给编写解析器的人带来更多困难。例如,请参见:OpenGL - Index buffers difficulties

答案 1 :(得分:1)

如果你有一个可以打开/导出像Maya或Blender这样的objs的建模程序,我建议在那里打开模型,使用适当的菜单选项三角测量,然后重新出口它。

如果您无法访问其中任何一个,那么编写一个读取obj数据,对其进行三角测量并将其写入文件的程序应该相对简单。您需要对obj格式有一些更深入的了解,但它不需要任何其他软件。