【问题标题】:.obj file format - alternates between different data types.obj 文件格式 - 在不同的数据类型之间交替
【发布时间】:2014-04-28 03:12:15
【问题描述】:
我正在编写一种方法来解析波前 obj 文件中的数据,并且我了解大部分格式,但是有些事情对我来说仍然有点困惑。例如,我希望大多数文件首先列出所有顶点,然后是纹理和法线贴图坐标,然后是面索引。但是,我打开的一些文件在这些不同部分之间交替出现。例如,我拥有的 Venus de Milo 的一个 .obj 文件(在此处获得:http://graphics.im.ntu.edu.tw/~robin/courses/cg03/model/)从顶点 (v) 开始,然后是法线坐标 (vn),然后是面 (f),然后定义更多顶点,法线和面孔再次。为什么文件像这样分成两部分?为什么不预先列出所有顶点?这是否意味着网格有多个段?如果是这样,我该如何处理?
【问题讨论】:
标签:
file
graphics
geometry
mesh
.obj
【解决方案1】:
不是直接的答案,但在评论中将无法阅读
我不使用这种文件格式,但网格通常出于以下原因进行分割:
更轻松地管理模型以进行编辑
-
分离具有不同材料或纹理属性的模型部分
主要是通过减少不必要的材质或纹理切换来加快渲染速度
-
如果网格有动态移动的部分,那么它们必须分开
大多数 3D 网格文件格式还包含每个网格部分的变换矩阵,有些甚至包含骨架层次结构
现在如何处理分段网格:
-
如果您的引擎仅支持未分段模型,则将所有部分合并在一起
这将失去分段网格的所有优点。不要忘记在合并之前应用子段的变换矩阵
-
或者你可以在你的模型类中实现网格分割
通过添加模型层次结构,变换矩阵,...
现在如何处理混合模型文件格式:
-
扫描文件以获取所有必要的数据块
- 记住它们是否存在
- 还将它们的大小和起始地址存储在文件中
- 并且不要忘记可能存在不止一个相同数据类型的块
为您需要的所有数据预分配空间
-
加载/合并您需要的所有数据
- 将数据块加载到模型类或将其合并到单个模型中
- 当然要检查是否所有需要的数据 id 都存在,例如点数与法线数或纹理坐标数匹配...
【解决方案2】:
因为这是设计文件格式的方式。对 OBJ 中的数据没有特定的排序要求,因此每个建模包都以自己的方式编写它。 Here 是文件格式的一个简要总结,如果你还没有读过的话。
也就是说,OBJ 格式已经过时并且默认不支持动画。它对于在建模工具之间交换静态网格很有用,但没有太多用处。如果您需要更强大和更现代的文件格式,我建议您查看Collada 格式或FBX。