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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。