python:trimesh 用于 STL 文件解析和 3D 操作

python:trimesh 是一个用于处理三维模型的库,支持多种格式的导入导出,比如STL、OBJ等,还包含网格操作、几何计算等功能。

Python Trimesh 库使用指南

安装依赖库

pip install trimesh

Downloading trimesh-4.6.8-py3-none-any.whl (709 kB)

pip install pyglet==1.5.27

Downloading pyglet-1.5.27-py3-none-any.whl (1.1 MB)

pip show trimesh

Summary: Import, export, process, analyze and view triangular meshes. (三角网格)

Home-page: https://github.com/mikedh/trimesh

pip show pyglet

Summary: Cross-platform windowing and multimedia library

Home-page: http://pyglet.readthedocs.org/en/latest/

加载三维模型并显示

通过 trimesh 可以轻松加载和显示三维模型文件。以下是实现这一功能的示例代码:

python 复制代码
import trimesh

# 加载一个 STL 文件作为示例
mesh = trimesh.load('example_model.stl')

# 显示模型
mesh.show()

此代码片段展示了如何加载 .stl 格式的三维模型,并调用其内置方法来可视化它。


输出顶点 (Vertices) 和面片 (Faces)

为了获取模型的几何数据,可以访问 verticesfaces 属性。这些属性分别表示模型的所有顶点坐标以及定义三角形面片的索引列表。

python 复制代码
import trimesh

# 加载模型
mesh = trimesh.load('example_model.obj', process=False)

# 获取 vertices 和 faces 数据
print("Vertices:", mesh.vertices[:5])  # 打印前五个顶点
print("Faces:", mesh.faces[:5])        # 打印前五个面片

这段代码演示了如何读取模型中的顶点和面片信息。


将 Vertices 和 Faces 转化为模型

如果已经拥有了顶点和面片的数据,则可以通过它们创建一个新的网格对象。

python 复制代码
import trimesh

# 定义一些简单的顶点和面片
vertices = [
    [0, 0, 0],
    [1, 0, 0],
    [1, 1, 0],
    [0, 1, 0]
]

faces = [
    [0, 1, 2],
    [2, 3, 0]
]

# 创建新的 Mesh 对象
new_mesh = trimesh.Trimesh(vertices=vertices, faces=faces)

# 显示新生成的模型
new_mesh.show()

以上代码说明了如何手动构建一个由指定顶点和面片组成的简单平面矩形网格。


表面采样与计算最近点

对于某些应用来说,可能需要从现有模型表面上随机抽取样本或者找到某个空间位置最接近的点。

python 复制代码
import trimesh

# 加载模型
mesh = trimesh.load('example_model.ply')

# 随机采样表面点
samples, face_indices = mesh.sample(1000, return_index=True)

# 计算给定点到模型的距离及其对应的最近点
point_to_check = np.array([0.5, 0.5, 0])
nearest_distance, nearest_point, _ = mesh.nearest.on_surface(point_to_check)

print(f"Nearest Point: {nearest_point}")
print(f"Distance to Nearest Point: {nearest_distance:.4f}")

这里提供了两种常用的操作:一是基于数量参数对目标物体进行均匀分布抽样;二是查询任意一点相对于整个形状的位置关系。


使用齐次变换矩阵修改网格姿态

当涉及到旋转、平移或其他仿射变化时,可以直接利用四维形式表达出来的转换矩阵作用于原始结构之上完成调整动作。

python 复制代码
import trimesh
from scipy.spatial.transform import Rotation as R

# 初始化一个单位立方体
cube = trimesh.creation.box()

# 构造一个绕 Z 轴转 90° 的旋转实例
rotation_vector = [0, 0, np.pi / 2]
rot_matrix = R.from_rotvec(rotation_vector).as_matrix()

# 添加额外的一列零向量构成完整的齐次变换阵列
transform_matrix = np.eye(4)
transform_matrix[:3, :3] = rot_matrix

# 施加变换至原图元上
transformed_cube = cube.copy().apply_transform(transform_matrix)

# 渲染结果对比查看效果差异
scene = trimesh.Scene([cube, transformed_cube])
scene.show()

上述脚本实现了围绕特定轴线执行角度偏移的功能,并且能够直观地观察前后状态之间的区别。


相关推荐
郝学胜-神的一滴1 天前
Effective STL 第5条:区间成员函数优先于单元素成员函数
开发语言·c++·程序人生·stl·软件工程
江太翁1 天前
Kotlin 与 Java 互操作中常用注解
java·python·kotlin
星期天要睡觉1 天前
深度学习——基于ResNet18迁移学习的图像分类模型
人工智能·python·分类·迁移学习
小钱c71 天前
Python使用 pandas操作Excel文件并新增列数据
python·excel·pandas
AI数据皮皮侠1 天前
中国博物馆数据
大数据·人工智能·python·深度学习·机器学习
wu_jing_sheng01 天前
Python中使用HTTP 206状态码实现大文件下载的完整指南
开发语言·前端·python
程序员大雄学编程1 天前
「用Python来学微积分」2. 函数图像的变换
python·数学·微积分
xingxing_F1 天前
Rhino 8 for Mac 犀牛3D建模软件
macos·3d
Q26433650231 天前
【有源码】基于Python与Spark的火锅店数据可视化分析系统-基于机器学习的火锅店综合竞争力评估与可视化分析-基于用户画像聚类的火锅店市场细分与可视化研究
大数据·hadoop·python·机器学习·数据分析·spark·毕业设计
unicrom_深圳市由你创科技1 天前
工业上位机,用Python+Qt还是C#+WPF?
python·qt·c#