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)