Python如何將兩個三維模型(obj)合成一個三維模型(obj)
更新時間:2024年06月24日 14:53:40 作者:BTWBB
這篇文章主要介紹了Python如何將兩個三維模型(obj)合成一個三維模型(obj)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
Python將兩個三維模型合成一個三維模型
本文主要針對想要將兩個obj保存的三維模型合成一個三維模型即obj文件保存。
這樣就可以同時觀察并對比兩個三維模型。
Trimesh是對三維網(wǎng)格模型處理十分好用的庫,本次代碼即基于此庫!
######################
#同時將兩個模型顯示在一起,也可以將兩個模型拼接成為一個模型
######################
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="對象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 內(nèi)置的格式,不能直接用于其它計算,需要轉(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)置的格式,不能直接用于其它計算,需要轉(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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 遞歸調(diào)用返回None的問題及解決方法
這篇文章主要介紹了python 遞歸調(diào)用返回None的問題,本文通過實(shí)例代碼給大家記錄了解決方案,代碼簡單易懂,非常不錯對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
pytest多進(jìn)程或多線程執(zhí)行測試實(shí)例
這篇文章介紹了pytest多進(jìn)程或多線程執(zhí)行測試的實(shí)例,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
如何通過python代碼根據(jù)模板修改變量生成新yaml文件
有些時候,需要根據(jù)一個yaml模板創(chuàng)建多個yaml文件實(shí)例,我們先寫一個yaml文件模板,然后通過python代碼修改模板中的變量,存儲為一個新的yaml文件,需要配合python的庫Template及ymal使用,本文給大家講解的非常詳細(xì),需要的朋友跟隨小編一起看看吧
2023-11-11
Python對小數(shù)進(jìn)行除法運(yùn)算的正確方法示例
這篇文章主要介紹了Python對小數(shù)進(jìn)行除法運(yùn)算的正確方法示例,正確的方法是需要轉(zhuǎn)換成浮點(diǎn)數(shù),否則永遠(yuǎn)不會得到正確結(jié)果,需要的朋友可以參考下
2014-08-08 
