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

标签 c++ image-processing 3d computer-vision

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

最佳答案

单个对象波前 obj 文件的原始文件合并相对容易:

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

    记住每个表的条目数

  2. 将第二个文件追加到内存中(人脸除外)

  3. 将第二个文件的人脸追加到内存中

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

    这同样适用于您获得的任何信息,例如法线、纹理坐标或其他任何信息。

  4. 将整个事情保存为单个 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

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

preview

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

关于c++ - 如何在纹理映射过程后合并两个 .obj 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37785215/

相关文章:

c++ - 将 vector 的 vector 打印到 ostream

image-processing - 对图像(或BLOB)使用CombineFileInputFormat吗?

ruby - 选择边循环

3d - 四元数旋转导致场景拉伸(stretch)

c++ - constexpr 和 std::cout 处理函数但不处理 lambda

c++ - 我应该学习使用 C++ STL 容器而不是构建它们吗?

c++ - OpenCV C++ 中的孔填充滤波器

javascript - Three.js 带摄像头选择对象,无鼠标

c++ - 计算从 L 到 R 的乘积除数

C 中的卷积边缘检测