Wavefront OBJ 格式 -> 群组和 usemtl 命令

6

我正在编写Wavefront obj模型文件的解析器,但是有一些不规则的情况我不确定该如何处理。

据我所知,一个网格可以使用“g”命令分成多个组,并且每个组可以使用“usemtl”命令分配材质。

因此,理想的文件应该像这样:

g group1
usemtl material1
//vertices
//UV coords
//faces

g group2
usemtl material2
//vertices
//UV coords
//faces

etc....

然而,在我下载的一些obj文件(来自Turbosquid等地方),我看到一个单一的组包含多个“usemtl”,如下所示:

g group1
usemtl material1
//vertices, faces, etc 
usemtl material2 
//vertices, faces, etc

g group2 
usematerial material3
//vertices, faces, etc

如果组内可以有多个材料,那么创建组的意义何在?
这些文件是否被认为是“非标准”或者是错误的?
我是否应该基于共享材料而不是共享组来分组面?
如果组内有多个材料,将会使我的代码变得更加复杂。比如,假设我需要在一个三角形/面的组中生成一组具有某种材料的 N 个随机样本。如果每个组只有一个材料,我只需查找该组中的三角形并生成样本即可。但是如果该组包含一些带正确材料的三角形和一些没有带的,则除了检查组之外,还必须检查材料以生成正确的样本。这只是其中一个示例,还有其他情况也会出现这个问题。
2个回答

3

Obj模型不仅可以分为组项(g),还可以分为对象(o)和光滑区域(s)。最简单的方法是让面通过usemtl指定当前材质,或者只是按照usemtl进行分组。


在我的情况下,我按照"usemtl"进行分组。每个新的"usemtl"关键字定义了一个与上一个组相同名称的新组,并带有一个计数后缀。效果非常好! - Alex Byrth
4
对象和群组物品之间有什么区别? - Tyler Shellberg

0

组的作用是为了方便进行变换。例如,如果我有一个由不同网格组成的头像,包括皮肤、衬衫、眼球等,将所有网格分组非常方便,这样我就可以刚性旋转、平移或缩放整个头像。请注意,这允许组的不同元素具有不同的材质。皮肤不必与眼球具有相同的材质。

在此链接中向下滚动至“分组”:http://paulbourke.net/dataformats/obj/

对于 OBJ 文件中的“组”和“对象”元素之间的区别对我来说并不太清楚,除了一个网格可以分配给多个组,而似乎不能将其分配给一个对象。Paul Bourke 在上面的链接中提供了一个关于立方体嵌套组的示例。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接