繁体   English   中英

纹理映射过程后如何合并两个 .obj 文件?

[英]How to merge two .obj files after texture mapping process?

在 3D 网格上应用纹理后,会生成三个文件(包括一个 .obj、.mtl 和一个 atlas 文件)。 我已经在 2 个对象上映射了纹理,现在我想将这些对象合并在一起,但我不知道如何合并它们的文件。 有什么方法(不是非免费工具)吗?

单对象波前 obj 文件的简单文件合并相对容易:

  1. 将第一个文件读入内存

    记住每个表的条目数

  2. 将第二个文件附加到内存中(面除外)

  3. 将第二个文件的面附加到内存中

    这是唯一需要改变的东西。 所有索引都从1开始,因此您需要将前一个文件中每个表的大小添加到其中。 例如,如果第一个 obj 有 10 行以v开头,这意味着在附加第二个 obj 之后,它将开始从11开始引用它的点。 所以取每个顶点索引并将大小添加到它。

    对于您获得的任何信息,例如法线、纹理坐标或其他信息,也是如此。

  4. 将整个内容保存为单个 obj 文件

抱歉,我不使用材料扩展名,所以我不知道格式以及是否需要在 mtl 文件中进行任何更改(但我不这么认为)。

如果您还想更新网格(删除不可见的相交部分),那么您需要使用一些几何方法(不是微不足道的问题)。

只是为了确定这里的小例子......

文件1:

v -1.0 -1.0 -1.0 
v +1.0 -1.0 -1.0 
v +1.0 +1.0 -1.0 
v -1.0 +1.0 -1.0 
v -1.0 -1.0 +1.0 
v +1.0 -1.0 +1.0 
v +1.0 +1.0 +1.0 
v -1.0 +1.0 +1.0 

f 1 2 3 4 
f 5 6 7 8 
f 1 2 6 5 
f 2 3 7 6 
f 3 4 8 7 
f 4 1 5 8 

文件2:

v -1.0 -1.0 +1.0 
v +1.0 -1.0 +1.0 
v +1.0 +1.0 +1.0 
v -1.0 +1.0 +1.0 
v -2.0 -2.0 +2.0 
v +2.0 -2.0 +2.0 
v +2.0 +2.0 +2.0 
v -2.0 +2.0 +2.0 

f 1 2 3 4 
f 5 6 7 8 
f 1 2 6 5 
f 2 3 7 6 
f 3 4 8 7 
f 4 1 5 8 

合并:

v -1.0 -1.0 -1.0 
v +1.0 -1.0 -1.0 
v +1.0 +1.0 -1.0 
v -1.0 +1.0 -1.0 
v -1.0 -1.0 +1.0 
v +1.0 -1.0 +1.0 
v +1.0 +1.0 +1.0 
v -1.0 +1.0 +1.0 

v -1.0 -1.0 +1.0 
v +1.0 -1.0 +1.0 
v +1.0 +1.0 +1.0 
v -1.0 +1.0 +1.0 
v -2.0 -2.0 +2.0 
v +2.0 -2.0 +2.0 
v +2.0 +2.0 +2.0 
v -2.0 +2.0 +2.0 

f 1 2 3 4 
f 5 6 7 8 
f 1 2 6 5 
f 2 3 7 6 
f 3 4 8 7 
f 4 1 5 8 

f  9 10 11 12 
f 13 14 15 16 
f  9 10 14 13 
f 10 11 15 14 
f 11 12 16 15 
f 12  9 13 16

File18个顶点,因此File2f中的每个顶点索引都增加了8 我手动完成了整个示例(包括 File1,2),所以希望我没有犯一些愚蠢的错误,但是预览还可以,所以看起来不是这样。

预习

如果你想消除重复条目(空间和速度),那么你需要为每个表重新索引表并使用它而不是仅仅添加......

非常感谢 Spektre,您的解决方案适用。 对于 Mtl 文件,我们可以将逐行的 Mtl 文件集成到一个唯一的 Mtl 文件中,并在其面记录之前打印每种材料的名称。 对于解析 Obj 文件, libobj可能是一个有用的库。 合适的教程还解释了解决方案的分步过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM