【问题标题】:Why there are still many wavefront obj files containing 4 vertices in one face?为什么还有很多波前 obj 文件在一张面上包含 4 个顶点?
【发布时间】:2016-07-09 06:45:08
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 回答第一部分,因为其他3D渲染API不限于三角形。例如,Pixar RenderMan 中的基本渲染图元是四个顶点的“微多边形”(双线性补丁),其中四边形是子集。任何从事电影/电视 CGI 的人都可能想要四边形,而不是三角形。
  • 明白。感谢您的评论!

标签: opengl wavefront


【解决方案1】:

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

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

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

因此,每个面超过 3 个顶点的所有变化就是每个面生成多个三角形。对于具有n 顶点的面,您将需要n - 2 三角形。我对这个问题的回答更详细地解释了这是如何完成的: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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你认为OpenGL开发者有必要配备这样的软件吗?每次我尝试使用 OpenGL 做一些工作时,我都需要一些工具来以某种方式可视化任何 3D 文件。
    • 哦,原来 Blender 是免费的!我不知道!
    • 如果您要开发具有 3D 图形的应用程序,我绝对建议您使用某种外部建模软件。这是尽早检查您的工作的好方法,以后如果您需要快速制作模型或导出为不同的格式,这将非常简单。 Blender 是免费的,但如果您是学生,则可以免费获取任何 Autodesk 产品,包括 Maya 和 3ds Max。编辑:是的,正是
    猜你喜欢
    • 2022-08-18
    • 2012-02-27
    • 2016-10-21
    • 2015-03-02
    • 2020-06-08
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多