如何在纹理映射过程后合并两个 .obj 文件?
How to merge two .obj files after texture mapping process?
在 3D 网格上应用纹理后,会生成三个文件(包括 .obj、.mtl 和 atlas 文件)。我已经在 2 个对象上映射了纹理,现在我想将这些对象合并在一起,但我不知道如何合并它们的文件。有什么方法(不是非免费工具)?
单个对象波前 obj 文件的原始文件合并相对容易:
将第一个文件读入内存
记住每个条目的数量table
将第二个文件追加到内存中(人脸除外)
将第二个文件的人脸追加到内存中
这是唯一需要稍微更改的内容。所有索引都来自 1
,因此您需要将每个 table 的大小从上一个文件添加到它。例如,如果第一个 obj 有 10 行以 v
开头,这意味着在附加第二个 obj 之后将开始从 11
引用它的点。所以获取每个顶点索引并为其添加大小。
同样适用于您获得的任何信息,例如法线、纹理坐标或其他信息。
将整个文件保存为单个 obj 文件
抱歉,我不使用 material 扩展,所以我不知道格式,也不知道 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
File1 有 8
个顶点,因此 File2 中 f
中的每个顶点索引增加 8
。我手动完成了整个示例(包括文件 1、2),所以希望我没有犯一些愚蠢的错误,但预览没问题,所以看起来不是这样。
如果你想消除重复的条目(为了 space 和速度),那么你需要为每个 table 重新索引 table 并使用它而不是仅仅添加...
非常感谢 Spektre,
您的解决方案适用。对于Mtl文件,我们可以将一行一行的Mtl文件整合成一个唯一的Mtl文件,在每个人脸的记录前打印名字material。对于解析 Obj 文件,libobj may be a useful library. A suitable tutorial 还解释了解决方案的分步过程。
在 3D 网格上应用纹理后,会生成三个文件(包括 .obj、.mtl 和 atlas 文件)。我已经在 2 个对象上映射了纹理,现在我想将这些对象合并在一起,但我不知道如何合并它们的文件。有什么方法(不是非免费工具)?
单个对象波前 obj 文件的原始文件合并相对容易:
将第一个文件读入内存
记住每个条目的数量table
将第二个文件追加到内存中(人脸除外)
将第二个文件的人脸追加到内存中
这是唯一需要稍微更改的内容。所有索引都来自
1
,因此您需要将每个 table 的大小从上一个文件添加到它。例如,如果第一个 obj 有 10 行以v
开头,这意味着在附加第二个 obj 之后将开始从11
引用它的点。所以获取每个顶点索引并为其添加大小。同样适用于您获得的任何信息,例如法线、纹理坐标或其他信息。
将整个文件保存为单个 obj 文件
抱歉,我不使用 material 扩展,所以我不知道格式,也不知道 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
File1 有 8
个顶点,因此 File2 中 f
中的每个顶点索引增加 8
。我手动完成了整个示例(包括文件 1、2),所以希望我没有犯一些愚蠢的错误,但预览没问题,所以看起来不是这样。
如果你想消除重复的条目(为了 space 和速度),那么你需要为每个 table 重新索引 table 并使用它而不是仅仅添加...
非常感谢 Spektre, 您的解决方案适用。对于Mtl文件,我们可以将一行一行的Mtl文件整合成一个唯一的Mtl文件,在每个人脸的记录前打印名字material。对于解析 Obj 文件,libobj may be a useful library. A suitable tutorial 还解释了解决方案的分步过程。