Python 将两个三维模型(obj)合成一个三维模型(obj)

本文主要针对想要将两个obj保存的三维模型合成一个三维模型即obj文件保存。这样就可以同时观察并对比两个三维模型。Trimesh是对三维网格模型处理十分好用的库,本次代码即基于此库!

######################
#同时将两个模型显示在一起,也可以将两个模型拼接成为一个模型
######################


from cv2 import scaleAdd
import trimesh
import argparse
import numpy as np
import os 
import scipy.io as scio
import math

# 根据输入的旋转度数生成相应的旋转矩阵
def make_rotate(rx, ry, rz):
    sinX = np.sin(rx)
    sinY = np.sin(ry)
    sinZ = np.sin(rz)

    cosX = np.cos(rx)
    cosY = np.cos(ry)
    cosZ = np.cos(rz)

    Rx = np.zeros((3, 3))
    Rx[0, 0] = 1.0
    Rx[1, 1] = cosX
    Rx[1, 2] = -sinX
    Rx[2, 1] = sinX
    Rx[2, 2] = cosX

    Ry = np.zeros((3, 3))
    Ry[0, 0] = cosY
    Ry[0, 2] = sinY
    Ry[1, 1] = 1.0
    Ry[2, 0] = -sinY
    Ry[2, 2] = cosY

    Rz = np.zeros((3, 3))
    Rz[0, 0] = cosZ
    Rz[0, 1] = -sinZ
    Rz[1, 0] = sinZ
    Rz[1, 1] = cosZ
    Rz[2, 2] = 1.0

    R = np.matmul(np.matmul(Rz, Ry), Rx)
    return R

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--obj1_path", type=str, default="对象1路径.obj")
    parser.add_argument("--obj2_path", type=str, default="对象2路径.obj")
    parser.add_argument("--out_path", type=str, default="./")
    parser.add_argument("--save_obj", action="store_true")
    args = parser.parse_args()
    
    #Load model
    mesh1 = trimesh.load(args.obj1_path)
    
    #To get vertices and faces for next steps
    v1 = mesh1.vertices #这样得到的v,f格式是trimesh 内置的格式,不能直接用于其它计算,需要转换为numpy
    f1 = mesh1.faces
    v1 = np.array(v1)
    f1 = np.array(f1)

    # #rotate(optional)
    # R = make_rotate(0, math.radians(-50), 0)
    # v1 = np.dot(v1, R)

    mesh2 = trimesh.load(args.obj2_path)
    v2 = mesh2.vertices #这样得到的v,f格式是trimesh 内置的格式,不能直接用于其它计算,需要转换为numpy
    f2 = mesh2.faces
    v2 = np.array(v2)
    f2 = np.array(f2)
    
    # ################other steps#################
    # #registration(optional)
    # mesh2t= trimesh.Trimesh(vertices = v2, faces = f2)
    # mesh_to_other = trimesh.registration.mesh_other(mesh1, mesh2t, samples=500, scale=False, icp_first=10, icp_final=50)
    
    #matching
    f2 = np.array(f2)+np.shape(v1)[0]
    v=np.concatenate((v1,v2),axis=0)
    f=np.concatenate((f1,f2),axis=0)

    # ############################################
    #Transfer result to mesh 
    obj = trimesh.Trimesh(vertices = v, faces = f)
    #To imshow
    # obj.show()
    if args.save_obj:
        #To save
        base=os.path.basename(args.out_path)
        name=os.path.splitext(base)[0]
        obj.export(f"{args.out_path}/{name}.obj") #保存为obj

运行

python show_two_model.py --save_obj (optional)

示例展示

可以通过给顶点统一增加偏移量使模型散开!

Python 将两个三维模型(obj)合成一个三维模型(obj)
Python 将两个三维模型(obj)合成一个三维模型(obj)
Python 将两个三维模型(obj)合成一个三维模型(obj)

在这里插入图片描述

Python 将两个三维模型(obj)合成一个三维模型(obj)
Python 将两个三维模型(obj)合成一个三维模型(obj)
Python 将两个三维模型(obj)合成一个三维模型(obj)

v2 = np.array(v2)+0.5
在这里插入图片描述

Python 将两个三维模型(obj)合成一个三维模型(obj)
Python 将两个三维模型(obj)合成一个三维模型(obj)
Python 将两个三维模型(obj)合成一个三维模型(obj)

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
要用Python加载OBJ格式的三维模型,可以使用PyWavefront库。PyWavefront是一个可以读取OBJ文件和MTL文件的Python模块,可以通过pip安装。 首先,需要导入PyWavefront库: ```python from pywavefront import Wavefront ``` 然后,需要使用Wavefront函数加载OBJ文件,例如: ```python model = Wavefront('model.obj') ``` 如果OBJ文件和MTL文件在同一目录下,PyWavefront库会自动加载MTL文件,并将贴图应用到模型上。如果MTL文件不在同一目录下,可以指定MTL文件路径: ```python model = Wavefront('model.obj', mtllib='model.mtl') ``` 加载完成后,可以通过以下代码访问模型的顶点、法向量、纹理坐标等信息: ```python for name, material in model.materials.items(): # 材质名称 print(name) # 材质颜色 print(material.diffuse) # 材质贴图 print(material.texturename) # 访问模型顶点信息 for mesh in model.meshes: for face in mesh.faces: for vertex_i in face: vertex = mesh.vertices[vertex_i] # 顶点坐标 print(vertex) # 顶点法向量 print(mesh.normals[vertex.normal_index]) # 顶点纹理坐标 print(mesh.texcoords[vertex.texcoord_index]) ``` 在完成操作后,可以通过以下代码释放模型资源: ```python model.release() ``` 总之,使用PyWavefront库加载OBJ格式三维模型并应用MTL贴图是非常容易的,只需要几行代码就可以完成。同时,PyWavefront库还支持读取模型的多个子网格、读取MTL文件的材质属性等高级功能,可以方便地扩展更多的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BTWBB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值