.obj文件格式 - 在不同数据类型之间切换

时间:2014-03-20 23:15:02

标签: file graphics geometry mesh .obj

我正在编写一个方法来解析wavefront obj文件中的数据,我理解大部分格式,但有些事情对我来说仍然有点混乱。例如,我希望大多数文件首先列出所有顶点,然后是纹理和法线贴图坐标,然后是面部索引。但是,我打开的一些文件在这些不同的部分之间交替。例如,我对Venus de Milo的一个.obj文件(在这里获得:http://graphics.im.ntu.edu.tw/~robin/courses/cg03/model/)以顶点(v)开始,然后是法线坐标(vn),然后是面(f),然后定义更多顶点,法线和面孔。为什么文件分为两部分?为什么不预先列出所有顶点?这是否意味着网格有多个片段?如果是这样,我该如何处理?

2 个答案:

答案 0 :(得分:1)

不是直接答案,但在评论

中将无法阅读

我不使用此文件格式,但网格细分通常是出于以下原因:

  1. 更轻松地管理模型进行编辑

  2. 分离具有不同材质或纹理属性的模型部分

    主要是通过减少不必要的材料或纹理切换来加速渲染

  3. 如果网格有动态移动部分,那么它们必须分开

    大多数3D网格文件格式还包含每个网格零件的变换矩阵,甚至还包含骨架层次结构

  4. 现在如何处理分段网格:

    1. 如果您的引擎仅支持未分段的模型,则将所有部分合并在一起

      这将失去分段网格的所有优点。不要忘记在合并之前应用子段的变换矩阵

    2. 或者您可以将网格细分实现到模型类

      通过添加模型层次结构,转换矩阵,......

    3. 现在如何处理混合模型fileformat:

      1. 扫描所有必要数据块的文件

        • 记住它们是否存在
        • 还存储其大小,并在文件
        • 中开始地址
        • 并且不要忘记可能有更多相同数据类型的一个
      2. 为您需要的所有数据预分配空间

      3. 加载/合并您需要的所有数据

        • 将数据块加载到模型类或将其合并到单个模型
        • 当然检查所有需要的数据是否存在,如点数与正常数或纹理坐标数相匹配......

答案 1 :(得分:1)

因为这是文件格式的设计方式。 OBJ中不需要特定的数据排序,因此每个建模包都以自己的方式编写它。 Here是文件格式的简短摘要,如果您尚未阅读此文件格式。

也就是说,OBJ格式已经过时,默认情况下不支持动画。它对于在建模工具之间交换静态网格物体很有用,但不是很多。如果您需要更强大,更现代的文件格式,我建议您查看Collada格式或FBX