Open3D Mesh读写可视化

一、函数解析

1、mesh = o3d.io.read_triangle_mesh("UV.ply")从ply中读取mesh
2、mesh.vertices获取顶点
3、mesh.triangles获取三角面片
4、o3d.visualization.draw_geometries([mesh])可视化mesh
5、mesh.paint_uniform_color([1, 0.076, 0])mesh渲染颜色,颜色在RGB空间[0,1]范围内。
6、mesh.compute_vertex_normals()计算mesh的法线

二、示例代码

1、mesh
Open3D有一个用于三维三角形网格的数据结构,称为TriangleMesh。下面的代码显示如何从ply文件中读取并打印其顶点和三角形

1
2
3
4
5
6
7
print("Testing mesh in Open3D...")
mesh = o3dtut.get_knot_mesh()
print(mesh)
print('Vertices:')
print(np.asarray(mesh.vertices))# 每个点的坐标xyz
print('Triangles:')
print(np.asarray(mesh.triangles))# 每个面的三个点的索引

这个TriangleMesh类有一些数据字段,如verticestriangles。Open3D通过numpy提供了对这些字段的直接内存访问。
2、可视化mesh

1
2
3
4
5
print("Try to render a mesh with normals (exist: " +
      str(mesh.has_vertex_normals()) + ") and colors (exist: " +
      str(mesh.has_vertex_colors()) + ")")
o3d.visualization.draw_geometries([mesh])
print("A mesh with no normals and no colors does not look good.")

在这里插入图片描述

可以旋转和移动网格,但是网格被涂成均匀的灰色,看起来不像“ 3d”。原因是当前网格没有顶点或面的法线。因此,使用统一的颜色底纹代替更复杂的Phong底纹。
3、计算法线

1
2
3
4
print("Computing normal and rendering it.")
mesh.compute_vertex_normals()
print(np.asarray(mesh.triangle_normals))
o3d.visualization.draw_geometries([mesh])

4、mesh上色

1
2
3
print("Painting the mesh")
mesh.paint_uniform_color([1, 0.706, 0])
o3d.visualization.draw_geometries([mesh])

三、完整代码展示

实现mesh的读写颜色渲染等操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import open3d as o3d
import numpy as np
print("Testing mesh in Open3D...")
mesh = o3d.io.read_triangle_mesh("UV.ply")
print(mesh) # 打印点数和三角面数
print('Vertices:')
print(np.asarray(mesh.vertices))# 输出每个顶点的坐标xyz
print('Triangles:')
print(np.asarray(mesh.triangles))# 每个面的三个点的索引
#o3d.io.write_triangle_mesh("copy_of_knot.ply", mesh) # 保存mesh
print("Computing normal and rendering it.")
mesh.compute_vertex_normals()
print(np.asarray(mesh.triangle_normals))
mesh.paint_uniform_color([1, 0.7, 0])
o3d.visualization.draw_geometries([mesh])

四、结果展示

在这里插入图片描述

五、官网链接:mesh