我正在编写一个方法来解析波前obj文件中的数据,我理解大多数格式,但是有些事情对我来说仍然有点困惑。例如,我希望大多数文件首先列出所有顶点,然后是纹理和法线贴图坐标,然后是面索引。但是,我打开的一些文件在这些不同的部分之间交替进行。例如,我有一个米洛的维纳斯的.obj文件(在这里获得:http://graphics.im.ntu.edu.tw/~robin/courses/cg03/model/)从顶点(v)开始,然后是法线坐标(vn),然后是面(f),然后再次定义更多的顶点,法线和面。为什么要将文件分成像这样的两个部分?为什么不把所有的顶点都列出来呢?这是否意味着网格有多个分段?如果是这样,我该如何处理?
因为这就是文件格式的设计方式。不需要OBJ中数据的特定顺序,因此每个建模包都以自己的方式编写它。如果你还没有读过这篇文章,下面是对文件格式的简要总结。
也就是说,OBJ格式相当过时,默认情况下不支持动画。它对于在建模工具之间交换静态网格很有用,但除此之外就没什么用了。如果你需要一个更强大和现代的文件格式,我建议你看看Collada格式或FBX。
不是直接回答,但在注释
中将无法读取。我不使用这种文件格式,但网格分割通常是出于这些原因:
更方便的管理模型进行编辑
不同材质或纹理属性的模型部分分离
主要是通过减少不必要的材质或纹理切换来加快渲染速度
如果网格有动态移动的部分,那么它们必须分开
大多数3D网格文件格式也包含每个网格部分的变换矩阵,有些甚至包含骨架层次
现在如何处理分段网格:
如果您的引擎只支持未分割的模型,那么将所有部件合并在一起
这将失去分段网格的所有优点。不要忘记在合并
之前应用子段的变换矩阵。或者您可以在模型类中实现网格分割
现在如何处理混合模型文件格式
扫描文件中所有必要的数据块
- 记住它们是否存在
- 也存储它们的大小和起始地址在文件
- 并且不要忘记可能有多个相同数据类型的块
为所有需要的数据预分配空间
加载/合并所有需要的数据
- 将数据块加载到您的模型类或将其合并到单个模型 当然,检查是否所有需要的数据都存在,如点的数量匹配法线或纹理坐标的数量…