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

时间:2016-06-13 08:40:19

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

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

2 个答案:

答案 0 :(得分:5)

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

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

    记住每个表的条目数

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

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

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

    对于你得到的任何信息,例如法线,纹理坐标或者其他任何信息都是如此。

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

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

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

    只是为了确定这个小例子......

    <强> File1中:

    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。我手动完成了整个示例(包括File1,2),所以希望我没有犯一些愚蠢的错误,但预览是好的,所以看起来并非如此。

    preview

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

答案 1 :(得分:0)

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