news 2026/3/11 9:07:03

第四课Open3D点云数据处理:读写网格模型(mesh)与格式转换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第四课Open3D点云数据处理:读写网格模型(mesh)与格式转换

1 mesh 加载函数

1.1 函数原型

1.2 参数说明

1.3代码展示

​编辑

1.4 判断mesh文件是否读取成功

2 mesh 保存函数

2.1 函数原型

2.2 参数说明

2.3 代码示例

2.4 Open3D支持的mesh类型

3 mesh 格式转换

3.1 ply 转 obj

3.2 ply 转 stl

3.3 ply 转 off

3.4 ply 转 gltf

1 mesh 加载函数

1.1 函数原型

read_triangle_mesh(filename: str, enable_post_processing: bool = False, print_progress: bool = False)

1.2 参数说明

  • filename,要可视化mesh的的路径和文件名。必选参数

当调用read_triangle_mesh函数时,需要将要读取的文件的路径和文件名作为filename参数传递给该函数。函数将解析该文件并将其转换为Open3D中的三角网格数据结构,该数据结构包含三角形的顶点和面片信息。通过这种方式,可以方便地使用Open3D库对三角网格进行可视化、处理、分析等操作。

  • enable_post_processing参数是用于控制是否启用后处理的选项。可选参数

在读取三角网格时,Open3D会对其进行一些后处理操作,包括去除重复的顶点和边缘,移除无用的顶点和边缘,以及重新计算法线等。这些后处理操作可以优化三角网格,使其更加紧凑和高效。当 enable_post_processing 参数设置为 True 时,将启用这些后处理操作;当设置为 False 时,则不启用。默认情况下,该参数被设置为 False。

  • print_progress参数用于控制是否在读取模型时输出读取进度信息。可选参数

默认情况下,该参数为False,不会在读取过程中输出进度信息,如果将其设置为True,则会输出进度信息。
如果读取的模型较大,可能需要一些时间来完成读取,因此在读取过程中输出进度信息对于了解读取进展情况非常有用。但是,在某些情况下,例如只需要读取一个非常小的模型时,输出进度信息可能会显得多余,所以可以通过设置该参数来控制输出行为。

1.3代码展示

import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) o3d.visualization.draw_geometries([mesh],window_name='把门开开',mesh_show_wireframe=False)

1.4 判断mesh文件是否读取成功

使用is_empty()函数判断

  • True:未读取到mesh文件
  • False:成功读取mesh文件
import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) o3d.visualization.draw_geometries([mesh],window_name='把门开开',mesh_show_wireframe=False)

2 mesh 保存函数

2.1 函数原型

write_triangle_mesh(filename:str,mesh:open3d.cpu.pybind.geometry.TriangleMesh,write_ascii:bool=False,compressed:bool=False,write_vertex_normals:bool=True,write_vertex_colors:bool=True,write_triangle_uvs:bool=True,print_progress:bool=False)

2.2 参数说明

  • filename必选参数,要保存的文件的路径和名称。
  • mesh必选参数,要保存的 TriangleMesh 对象。
  • write_ascii可选参数,默认为 False,表示是否将数据以 ASCII 格式写入文件。如果设置为 True,则数据将以可读的文本形式写入文件,否则以二进制形式(binary)写入文件。
  • compressed可选参数,默认为 False,表示是否将数据压缩写入文件。如果设置为 True,则写入的数据将会被压缩,否则不会。
  • write_vertex_normals可选参数,默认为 True,表示是否要写入顶点法线数据。
  • write_vertex_colors可选参数,默认为 True,表示是否要写入顶点颜色数据。
  • write_triangle_uvs可选参数,默认为 True,表示是否要写入三角形 UV 数据。
  • print_progress可选参数,默认为 False,表示是否要在控制台打印写入进度。

需要注意的是,这些参数并不是全部必须要传入的,只需要传入需要的参数即可。

2.3 代码示例

# mesh 保存函数 import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) print("->保存ply...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.ply",mesh) # 读取保存的文件重新展示 print("->重新加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.ply") o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True)

2.4Open3D支持的mesh类型

格式描述
ply一种通用的3D模型文件格式,可以存储点云、网格和曲面等各种类型的3D数据。通常包含顶点信息、面信息、法线信息、纹理坐标信息和颜色信息等。
stl一种简单的3D模型文件格式,通常用于存储三角形网格数据。STL文件包含了每个三角形的三个顶点坐标和法线向量信息。
obj一种通用的3D模型文件格式,它可以存储多边形网格、曲面和点云等各种类型的3D数据。OBJ文件通常包含顶点信息、面信息、纹理坐标信息和法线信息等。
off一种简单的3D模型文件格式,通常用于存储多边形网格数据。OFF文件包含了每个顶点的坐标信息和每个面的顶点索引信息。
gltf一种新兴的3D模型文件格式,它使用JSON作为数据格式,可以存储多种类型的3D数据,例如网格、材质、动画和场景等。
glb一种二进制的gltf格式,它将gltf文件打包成一个二进制文件,可以更快地加载和渲染3D模型。

3 mesh 格式转换

以ply转换为Open3D支持的其他mesh格式为例。

3.1 ply 转 obj

# mesh 保存函数 import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) # 保存为obj print("->保存obj...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.obj",mesh) # 计算mesh顶点法线 mesh.compute_vertex_normals() # 可视化计算顶点法线后的mesh o3d.visualization.draw_geometries([mesh]) # ply 转 stl print("->保存stl...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.stl",mesh) # ply 转 off print("->保存off...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.off",mesh) # ply 转 gltf print("->保存gltf...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.gltf",mesh)

3.2 ply 转 stl

转换之前要确保 ply格式的mesh含有法线,否则需要计算法线后才能执行ply 转 stl操作。

# mesh 保存函数 import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) # 保存为obj print("->保存obj...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.obj",mesh) # 计算mesh顶点法线 mesh.compute_vertex_normals() # 可视化计算顶点法线后的mesh o3d.visualization.draw_geometries([mesh]) # ply 转 stl print("->保存stl...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.stl",mesh) # ply 转 off print("->保存off...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.off",mesh) # ply 转 gltf print("->保存gltf...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.gltf",mesh)

3.3 ply 转 off

# mesh 保存函数 import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) # 保存为obj print("->保存obj...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.obj",mesh) # 计算mesh顶点法线 mesh.compute_vertex_normals() # 可视化计算顶点法线后的mesh o3d.visualization.draw_geometries([mesh]) # ply 转 stl print("->保存stl...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.stl",mesh) # ply 转 off print("->保存off...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.off",mesh) # ply 转 gltf print("->保存gltf...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.gltf",mesh)

3.4 ply 转 gltf

# mesh 保存函数 import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) # 保存为obj print("->保存obj...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.obj",mesh) # 计算mesh顶点法线 mesh.compute_vertex_normals() # 可视化计算顶点法线后的mesh o3d.visualization.draw_geometries([mesh]) # ply 转 stl print("->保存stl...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.stl",mesh) # ply 转 off print("->保存off...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.off",mesh) # ply 转 gltf print("->保存gltf...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.gltf",mesh)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/8 0:17:33

第六课Open3D点云数据处理:点云、mesh可视化(Visualizer类)

1 Visualizer类 2 参数详解 2.1 常用参数 2.2 渲染参数 RenderOption 详解 3 点云可视化 3.1 最简单的点云可视化 3.2 可视化多个点云 3.3 可视化点云法线 3.4 其他参数 4 mesh可视化 4.1 最简单的mesh可视化 4.2 可视化三角网格和模型内表面 4.3 可视化多个mesh 1…

作者头像 李华
网站建设 2026/3/10 6:25:24

深度解析大模型微调技术:LoRA、QLoRA、DPO全对比,建议收藏!

深度解析2025年大模型微调技术:LoRA、QLoRA、DPO全对比,建议收藏! 文章系统介绍了大语言模型微调技术的演进与现状,重点分析了参数高效微调(PEFT)的革命性技术,包括LoRA及其改进版QLoRA、VeRA、DoRA和AdaLoRA&#xff…

作者头像 李华
网站建设 2026/3/5 3:49:11

为什么越来越多开发者选择PyTorch-CUDA预装镜像?

为什么越来越多开发者选择PyTorch-CUDA预装镜像? 在深度学习项目启动的前48小时里,你更愿意把时间花在模型设计上,还是反复折腾CUDA版本和驱动兼容性?这几乎是每个AI工程师都经历过的灵魂拷问。而如今,越来越多团队正在…

作者头像 李华
网站建设 2026/3/6 5:04:25

GPU算力租赁新趋势:结合PyTorch镜像实现按需付费模式

GPU算力租赁新趋势:结合PyTorch镜像实现按需付费模式 在AI模型越来越“大”、训练任务越来越复杂的今天,一个开发者最怕听到的提示是什么? 不是“代码有bug”,而是——“CUDA out of memory”。 这句报错背后,往往意味…

作者头像 李华
网站建设 2026/3/8 2:34:53

AI Agent与RAG技术:开发者进阶的核心竞争力

今年,AI 技术栈的迭代速度,已经超过了大多数程序员的学习速度。 当你的同事还在讨论如何写 Prompt 时,DeepSeek R1、Gemini 3 等新一代推理模型,已经重新定义了人机交互的边界。当你的团队还在为 RAG 的准确率头疼时,L…

作者头像 李华