Python如何將兩個(gè)三維模型(obj)合成一個(gè)三維模型(obj)
Python將兩個(gè)三維模型合成一個(gè)三維模型
本文主要針對(duì)想要將兩個(gè)obj保存的三維模型合成一個(gè)三維模型即obj文件保存。
這樣就可以同時(shí)觀察并對(duì)比兩個(gè)三維模型。
Trimesh是對(duì)三維網(wǎng)格模型處理十分好用的庫,本次代碼即基于此庫!
###################### #同時(shí)將兩個(gè)模型顯示在一起,也可以將兩個(gè)模型拼接成為一個(gè)模型 ###################### from cv2 import scaleAdd import trimesh import argparse import numpy as np import os import scipy.io as scio import math # 根據(jù)輸入的旋轉(zhuǎn)度數(shù)生成相應(yīng)的旋轉(zhuǎn)矩陣 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="對(duì)象1路徑.obj") parser.add_argument("--obj2_path", type=str, default="對(duì)象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 內(nèi)置的格式,不能直接用于其它計(jì)算,需要轉(zhuǎn)換為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 內(nèi)置的格式,不能直接用于其它計(jì)算,需要轉(zhuǎn)換為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
運(yùn)行
python show_two_model.py --save_obj (optional)
示例展示
可以通過給頂點(diǎn)統(tǒng)一增加偏移量使模型散開!
v2 = np.array(v2)+0.5
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 遞歸調(diào)用返回None的問題及解決方法
這篇文章主要介紹了python 遞歸調(diào)用返回None的問題,本文通過實(shí)例代碼給大家記錄了解決方案,代碼簡(jiǎn)單易懂,非常不錯(cuò)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03pytest多進(jìn)程或多線程執(zhí)行測(cè)試實(shí)例
這篇文章介紹了pytest多進(jìn)程或多線程執(zhí)行測(cè)試的實(shí)例,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07

如何通過python代碼根據(jù)模板修改變量生成新yaml文件

Python對(duì)小數(shù)進(jìn)行除法運(yùn)算的正確方法示例