前言
再来整一整另一种3d数据。接着上一节的点云2
1. open3d.geometry.TriangleMesh
和点云一样,三角网格也是3d数据的一种表示open3d.geometry.TriangleMesh实现了三角网格的数据结构,三角形网格包含顶点和由顶点索引表示的三角形。网格也可以包含三角形法线、顶点法线和顶点颜色。
我们再来看一看三角网格对象的一些静态字段:
(1)adjacency_list:顶点的邻接表,adjacency_lis[i]表示与顶点i相邻顶点的索引。
(2)textures:纹理图像
(3)vertices:三角网格的顶点,可以转换为numpy数组访问,shape为(num_vertices,3)
(4)vertex_normals:顶点法线,可以转换为numpy数组访问,shape为(num_vertices,3)
(5)vertex_colors:顶点的rgb颜色,可以转换为numpy数组访问,shape为(num_vertices,3),rgb值范围在[0-1]
(6)triangle_uvs:由构成三角形的点的索引表示的UV列表,可以转换为numpy数组访问,shape为(3 * num_triangles, 2)
(7)triangles:可以转换为numpy数组访问,shape为(num_triangles,3),简答来说每一个其中每一行数据就是一个三角形,如triangles[i]表示一个三角形,其中保存的是三个顶点对应的索引
(8)triangle_normals:三角形法线,可以转换为numpy数组访问,shape为(num_triangles,3)
2.例子
如下代码,我们创建一个球体网格,计算顶点法线:
import open3d as o3d
import numpy as np
mesh = o3d.geometry.TriangleMesh.create_sphere()
mesh.compute_vertex_normals()
print(mesh)
print("顶点:",np.asarray(mesh.vertices))
print("三角形",np.asarray(mesh.triangles))
print("顶点法线:",np.asarray(mesh.vertex_normals))
o3d.visualization.draw_geometries([mesh])
打印结果如下:
可视化结果如下:
下面我们将代码改进一下,将x值大于0顶点渲染成红色,小于0的渲染成蓝色:
import open3d as o3d
import numpy as np
mesh = o3d.geometry.TriangleMesh.create_sphere()
mesh.compute_vertex_normals()
num_vertices=np.asarray(mesh.vertices).shape[0]
print(mesh)
print("顶点:",np.asarray(mesh.vertices))
print("三角形",np.asarray(mesh.triangles))
print("顶点法线:",np.asarray(mesh.vertex_normals))
color=np.zeros((num_vertices,3))
for i in range(num_vertices):
if np.asarray(mesh.vertices[i])[0]>0:
color[i,0]=1
else:
color[i,2]=1
mesh.vertex_colors=o3d.utility.Vector3dVector(color)
o3d.visualization.draw_geometries([mesh])
其中o3d.utility.Vector3dVector是用于将numpy数组转换成open3d的数据格式。
可视化结果如下: