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

 更新时间:2024年06月24日 14:53:40   作者:BTWBB  
这篇文章主要介绍了Python如何将两个三维模型(obj)合成一个三维模型(obj)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python中plot函数语法示例详解

    Python中plot函数语法示例详解

    这篇文章主要介绍了Python中plot函数语法的相关资料,文章详细介绍了MATLAB中的plot()函数,包括其语法、如何绘制二维线图、设置线型、标记符号和颜色以及如何绘制多组二维线图等,需要的朋友可以参考下
    2024-11-11
  • Python中的各种装饰器详解

    Python中的各种装饰器详解

    这篇文章主要介绍了Python中的各种装饰器详解,Python装饰器分两部分,一是装饰器本身的定义,一是被装饰器对象的定义,本文分别讲解了各种情况下的装饰器,需要的朋友可以参考下
    2015-04-04
  • 10分钟快速入门Pandas库

    10分钟快速入门Pandas库

    pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的,这篇文章主要介绍了10分钟快速入门Pandas库,重点介绍pandas常见使用方法,结合实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 详解Python中xlsxwriter库的基本操作

    详解Python中xlsxwriter库的基本操作

    xlsxwriter是一个用于创建和修改Excel文件(.xlsx)的Python库,它提供了丰富的功能,可以创建复杂的Excel工作簿,本文为大家介绍了它的一些基本操作,希望对大家有所帮助
    2023-11-11
  • python 递归调用返回None的问题及解决方法

    python 递归调用返回None的问题及解决方法

    这篇文章主要介绍了python 递归调用返回None的问题,本文通过实例代码给大家记录了解决方案,代码简单易懂,非常不错对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • pytest多进程或多线程执行测试实例

    pytest多进程或多线程执行测试实例

    这篇文章介绍了pytest多进程或多线程执行测试的实例,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 使用pdb模块调试Python程序实例

    使用pdb模块调试Python程序实例

    这篇文章主要介绍了使用pdb模块调试Python程序实例,本文着重讲解了pdb.run()函数、pdb.runeval()函数、pdb.runcall()函数、pdb.set_trace()函数的使用以及pdb调试命令等内容,需要的朋友可以参考下
    2015-06-06
  • python数字类型math库原理解析

    python数字类型math库原理解析

    这篇文章主要介绍了python数字类型math库原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 如何通过python代码根据模板修改变量生成新yaml文件

    如何通过python代码根据模板修改变量生成新yaml文件

    有些时候,需要根据一个yaml模板创建多个yaml文件实例,我们先写一个yaml文件模板,然后通过python代码修改模板中的变量,存储为一个新的yaml文件,需要配合python的库Template及ymal使用,本文给大家讲解的非常详细,需要的朋友跟随小编一起看看吧
    2023-11-11
  • Python对小数进行除法运算的正确方法示例

    Python对小数进行除法运算的正确方法示例

    这篇文章主要介绍了Python对小数进行除法运算的正确方法示例,正确的方法是需要转换成浮点数,否则永远不会得到正确结果,需要的朋友可以参考下
    2014-08-08

最新评论