Python实现管线建模 || 1.圆直管、方管

        在Python 中可以使用开源的三维库(例如 trimesh)来创建简单的管线模型,并将其导出为多种 3D 模型格式。本文为大家介绍如何使用 trimesh 创建圆直管并导出为 .obj 等通用三维格式模型。

pip安装trimesh

pip install trimesh

支持的文件格式

trimesh 支持多种文件格式的导出,包括:

• .obj(Wavefront OBJ) 

• .stl(Stereolithography) 

• .glb/.gltf(glTF 2.0) 

• .ply(Polygon File Format) 

• .off(Object File Format)

你可以使用以下代码列出所有支持的文件格式: 

import trimesh# 列出支持的文件格式
formats = trimesh.available_formats()
print("支持的导出格式:", formats)

 圆直管

下面的代码示例展示了如何用 trimesh 创建一个圆柱体模型,并导出为 .obj 文件:

import trimesh
创建圆柱体模型 半径为1 高度为2
cylinder = trimesh.creation.cylinder(radius=1.0, height=2.0)# 导出为 .obj 文件
output_path = "cylinder.obj"
cylinder.export(output_path)print(f"模型成功导出至 {output_path}")

        你可以使用 trimesh 库围绕一条指定的线(由线的两端点坐标确定)创建圆柱体。可以使用变换矩阵将基本几何体变换到你想要的位置和方向。下面是一个指定线的两个端点坐标并创建圆柱体的案例。 

创建围绕指定两点坐标的圆柱体

import trimesh
import numpy as npdef create_cylinder_along_line(point1, point2, radius=1.0):direction = np.array(point2) - np.array(point1)height = np.linalg.norm(direction)unit_direction = direction / heightz_axis = np.array([0, 0, 1])  # The cylinder is initially aligned with the z-axisaxis = np.cross(z_axis, unit_direction)angle = np.arccos(np.dot(z_axis, unit_direction))if np.linalg.norm(axis) == 0:rotation_matrix = np.eye(3)  # Identity matrix if vectors are parallelelse:axis = axis / np.linalg.norm(axis)K = np.array([[0, -axis[2], axis[1]],[axis[2], 0, -axis[0]],[-axis[1], axis[0], 0]])rotation_matrix = np.eye(3) + np.sin(angle) * K + (1 - np.cos(angle)) * np.dot(K, K)midpoint = (np.array(point1) + np.array(point2)) / 2translation_matrix = np.eye(4)translation_matrix[:3, 3] = midpointtransform = np.eye(4)transform[:3, :3] = rotation_matrixtransform = np.dot(translation_matrix, transform)cylinder = trimesh.creation.cylinder(radius=radius, height=height)cylinder.apply_transform(transform)return cylinder# 用法示例
point1 = [0, 0, 0]  # 管线起点坐标
point2 = [1, 20, 3]  # 管线终点坐标
radius = 0.5        # 管直径cylinder = create_cylinder_along_line(point1, point2, radius)
output_path = "cylinder_along_line.obj"
cylinder.export(output_path)print(f"模型导出至 {output_path}")

代码解释

1.方向向量计算:direction = np.array(point2) - np.array(point1),计算由两个端点坐标定义的方向向量。

2.标准化方向向量:unit_direction = direction / height,得到标准化的方向向量。

3.计算旋转矩阵:通过方向向量和单位 z 轴之间的夹角计算旋转矩阵,将圆柱体从 z 轴方向旋转到目标方向。

4.平移矩阵:平移到两个端点的中点。

5.组合变换矩阵:旋转和平移矩阵组合,应用到圆柱体上。

可以为管线添加指定的颜色.

import trimesh# 创建圆柱体
cylinder = trimesh.creation.cylinder(radius=1.0, height=4.0)# 为网格的每个面指定颜色
cylinder.visual.face_colors = [255, 0, 0, 255]  # 红色,RGBA 格式# 导出
cylinder.export("colored_cylinder.obj")

此外,你还可以将模型导出成其他通用的三维格式.


# 导出为 .stl 文件
cylinder.export("cylinder_along_line.stl")
# 导出为 .gltf 文件
cylinder.export("cylinder_along_line.gltf")

方管

        下面的代码示例展示了如何用 trimesh根据直线的两点坐标实现方管建模,并导出为 .obj 文件:

import trimesh
import numpy as npdef create_rectangular_pipe_along_line(point1, point2, width=1.0, height=1.0):# 计算两点间的方向向量和长度direction = np.array(point2) - np.array(point1)length = np.linalg.norm(direction)# 计算单位方向向量unit_direction = direction / length# 创建基础方管box = trimesh.creation.box(extents=[width, height, length])# 计算旋转矩阵,将方管从 Z 轴方向旋转到目标方向z_axis = np.array([0, 0, 1])  # 方管初始方向为 Z 轴axis = np.cross(z_axis, unit_direction)angle = np.arccos(np.dot(z_axis, unit_direction))if np.linalg.norm(axis) == 0:rotation_matrix = np.eye(3)  # 如果方向相同或相反,则使用单位矩阵else:axis = axis / np.linalg.norm(axis)K = np.array([[0, -axis[2], axis[1]],[axis[2], 0, -axis[0]],[-axis[1], axis[0], 0]])rotation_matrix = np.eye(3) + np.sin(angle) * K + (1 - np.cos(angle)) * np.dot(K, K)# 创建旋转和平移矩阵translation_matrix = np.eye(4)translation_matrix[:3, 3] = (np.array(point1) + np.array(point2)) / 2  # 平移到两点的中间transform = np.eye(4)transform[:3, :3] = rotation_matrixtransform = np.dot(translation_matrix, transform)# 应用旋转和平移矩阵box.apply_transform(transform)return box# 示例:沿着一条线创建方管
point1 = [0, 0, 0]  # 线的起点
point2 = [20, 30, 1]  # 线的终点
width = 0.5         # 方管的宽度
height = 0.5        # 方管的高度rectangular_pipe = create_rectangular_pipe_along_line(point1, point2, width=width, height=height)
rectangular_pipe.export(r"E:\rectangular_pipe1.obj")

还可以添加赋色代码,为模型赋予颜色


box.visual.face_colors = (0, 255, 0, 255) # RGBA 绿色

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1424352.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

easyx快速入门1

1.基本说明 EasyX 是针对 C 的图形库,可以帮助 C/C 初学者快速上手图形和游戏编程。 比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练…

战网国际服加速器用哪个好 暴雪战网好用加速器介绍

战网国际版,又称Battle.net环球版,是暴雪娱乐操盘的全球性游戏互动平台,它跨越地理界限,服务于全球游戏爱好者。与地区限定版本相异,国际版赋予玩家自由进入暴雪旗下众多经典游戏的权利,无论身处何方&#…

【LabVIEW FPGA入门】NI 环境安装教程

注意:安装软件之前关闭杀毒软件,避免安装时损坏,安装完成在使用杀毒软件。 步骤1:判断自己是否需要LabVIEW 编程。 下面这几种情况可以调过安装LabVIEW: 不需要LabVIEW或其他语言编程,直接在MAX或仪器软面板…

java医院信息系统HIS源码SaaS模式Java版云HIS系统 接口技术RESTful API + WebSocket + WebService

java医院信息系统HIS源码SaaS模式Java版云HIS系统 接口技术RESTful API WebSocket WebService 云HIS是基于云计算的医疗卫生信息系统(Cloud-Based Healthcare Information System),它运用云计算、大数据、物联网等新兴信息技术,…

英语学习笔记14——What color‘s your ... ?

What color’s your … ? 你的 …… 是什么颜色的? 词汇 Vocabulary case n. 箱子【封闭的】 相关:box n. 箱子【开口的】    bookcase n. 书架 补充:case n. 案件,案例 口语:It’s a small case.    小意思&…

C语言之旅:自定义类型(联合和枚举)

目录 一.联合体 1.1 联合体的声明 1.2 联合体的使用 1.3 为什么输出 4呢? 1.4 相同成员的结构体和联合体对比 1.5 联合体大小对比 1.6使用联合体判断大小端 二.枚举类型 2.1枚举类型的例举: 2.2枚举类型的优点 2.3 枚举类型的使用 在上篇文章中…

项目管理—需求管理规程(软件研发过程标准,管理标准,标书技术编写,资质评审,安全管理体系,项目交付,实施运维,各类建设方案)

软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单,用户需求说明书,概要设计说明书,技术解…

[智能AI摄像头]RV1126适配3inch mipi屏幕

3寸屏幕 硬件平台 3寸屏:ST7701S驱动芯片,mipi接口,2lane rv1126:易佰纳38板、正点原子rv1126开发板 所需资料 《屏幕规格书》、《开发板原理图》、《屏幕初始化序列》、《ST7701S数据手册》《rk屏幕相关文档》 驱动板绘制 …

大佬复活,暴打空头,两天拉升 180%

GME 暴打空头 大家还记得 2021 年,美国散户大战华尔街的新闻吗? 当时在推特上,几位大佬进行号召,吸引了大量散户往里冲,短短一个月,把一家业绩平平的美股公司「游戏驿站(GME)」拉升了…

[ROS 系列学习教程] 建模与仿真 - URDF 建模实践

ROS 系列学习教程(总目录) 本文目录 一、机器人结构组成二、新建功能包三、编写launch文件四、创建底盘五、添加轮子六、添加其他部件七、解决部分实体位于地面以下的问题 前文介绍了URDF建模与URDF语法,接下来介绍怎么使用URDF从零构建一个机器人模型并在rviz中显示…

半小时搞懂STM32知识点——UART

1.UART 1.1为什么要使用UART这种协议?介绍一下UART及其特点 成本低,硬件简单,数据格式灵活; 低速全双工异步串行通信 1.2 UART数据帧格式? 起始位(1)+数据位(5-8) 校验位…

Sketch总结

sketch禁用了lineGap https://www.sketch.com/docs/designing/text/ http://www.sketchcn.com/sketch-chinese-user-manual.html https://github.com/sketch-hq/sketch-document https://developer.sketch.com/file-format/ https://animaapp.github.io/sketch-web-viewer/ htt…

JAVA云his医院管理系统源码 SaaS模式+融合B/S版电子病历 基于云计算技术开发的云his医院管理系统

JAVA云his医院管理系统源码 SaaS模式融合B/S版电子病历 基于云计算技术开发的云his医院管理系统 定义 美国著名教授Morris.Collen于1988年曾著文为医院信息系统下了如下定义:利用电子计算机和通讯设备,为医院所属各部门提供病人诊疗信息和行政管理信息…

C++二叉搜索树搜索二叉树二叉排序树

C二叉搜索树 1. 二叉搜索树的概念 二叉搜索树(BST,Binary Search Tree),也称为二叉排序树或二叉查找树。它与一般二叉树的区别在于:每个结点必须满足“左孩子大于自己,右孩子小于自己”的规则。在这种规则的约束下,二…

echarts的柱状图使用

1. 柱状图&#xff08;柱体顶部使用外部图片 相关代码 <template><div class"out-bg"><div class"container" ref"warnChartRef"></div></div> </template><script> import * as echarts from echar…

Go微服务: 日志系统ELK核心架构设计

微服务日志系统建设 1 &#xff09;为什么需要日志系统 业务发展越来越庞大&#xff0c;服务器越来越多各种访问日志&#xff0c;应用日志&#xff0c;错误日志量越来越多&#xff0c;无法管理开发人员排查问题&#xff0c;需要到服务器上查日志 2 &#xff09;Elastic Stack…

2024年第十届中西部外语翻译大赛(1)

2024年第十届中西部外语翻译大赛 竞赛信息 “由中西部翻译协会共同体指导发起&#xff0c;各省市译协共建学术指导委员会&#xff0c;2024年第十届中西部外语翻译大赛由中西部翻译协会共同体秘书处&#xff08;武汉公仪网络科技有限公司&#xff09;承办。” - 获奖证书样图 -…

MT3038 植发

思路&#xff1a; 有两个点可以取头发&#xff0c;每个头发寿命不同。 先看点(0,0)&#xff0c;按寿命由小到大排序&#xff08;先考虑寿命短的可以移植到哪里&#xff09;。 (0,0)点头发放置的位置应该让(0,m)点的头发可以尽可能多的放置&#xff08;例如(0,0)点有一根头发…

cmu15445 2023fall project3 详细过程(下)QUERY EXECUTION

QUERY EXECUTION task3/task4 Task #3 - HashJoin Executor and Optimization1、HashJoin1.1 思路1.2 代码 2 NestedLoopJoin优化为HashJoin2.1 思路2.2 代码 Task #4 Sort Limit Executors Top-N Optimization Window Functions1、Sort1.1 思路1.2 代码 2、Limit Executors2…

100m/s高速轧制钢材 八轴测径仪检测毫无压力

关键词&#xff1a;八轴测径仪,在线测径仪,钢材测径仪,高速轧制 随着技术的提升&#xff0c;钢材的生产速度越来越快&#xff0c;一些高速生产的钢材&#xff0c;生产速度甚至达到了100m/s&#xff0c;这是一个非常快的速度。 如果汽车以120公里/小时的速度行驶&#xff0c;那么…