当前位置: 代码网 > it编程>前端脚本>Python > Python如何将两个三维模型(obj)合成一个三维模型(obj)

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

2024年07月06日 Python 我要评论
python将两个三维模型合成一个三维模型本文主要针对想要将两个obj保存的三维模型合成一个三维模型即obj文件保存。这样就可以同时观察并对比两个三维模型。trimesh是对三维网格模型处理十分好用的

python将两个三维模型合成一个三维模型

本文主要针对想要将两个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)

示例展示

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

v2 = np.array(v2)+0.5

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com