如何使用Open3D绘制球体或在现有网格中标注?含三角形标注需求
Open3D 绘制球体、网格标注及指定三角形高亮方案
1. 绘制独立球体
用Open3D创建球体很直接,核心调用create_sphere方法,可自定义半径、中心位置和分辨率(分辨率越高球体越平滑)。代码示例:
import open3d as o3d # 创建球体:半径0.5,中心在(0,0,0),分辨率20 sphere = o3d.geometry.TriangleMesh.create_sphere(radius=0.5, center=[0,0,0], resolution=20) # 给球体设置颜色(可选) sphere.paint_uniform_color([1, 0, 0]) # 红色 # 启动可视化 o3d.visualization.draw_geometries([sphere])
2. 在已有网格上做标注(用球体标记关键点)
如果要在现有网格模型上标注特定位置(比如顶点、面中心),可以创建小球体作为标记,和原网格一同渲染。示例如下:
import open3d as o3d # 加载你的网格模型 mesh = o3d.io.read_triangle_mesh("your_mesh.ply") # 假设要标注网格的第0个顶点 target_vertex = mesh.vertices[0] # 创建小尺寸球体作为标记 marker = o3d.geometry.TriangleMesh.create_sphere(radius=0.1, center=target_vertex) marker.paint_uniform_color([0, 1, 0]) # 绿色标记 # 将原网格和标记一起可视化 o3d.visualization.draw_geometries([mesh, marker])
3. 基于已知三角形坐标高亮指定三角形
针对你提到的已知三角形XYZ坐标、要高亮两个绿色三角形的需求,有两种实用方案:
方案1:找到原网格中对应三角形,修改其颜色
如果目标三角形属于已加载的网格模型,可以通过顶点坐标匹配找到三角形索引,单独设置颜色:
import open3d as o3d import numpy as np # 加载原网格 mesh = o3d.io.read_triangle_mesh("your_mesh.ply") # 先给网格设置默认灰色 mesh.paint_uniform_color([0.5, 0.5, 0.5]) # 假设你已知两个目标三角形的顶点坐标 target_triangles = [ np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]), np.array([[10.0, 11.0, 12.0], [13.0, 14.0, 15.0], [16.0, 17.0, 18.0]]) ] # 遍历网格所有三角形,匹配坐标(注意浮点精度用np.allclose) for tri_idx in range(len(mesh.triangles)): tri_vertices = np.array([mesh.vertices[i] for i in mesh.triangles[tri_idx]]) for target_tri in target_triangles: if np.allclose(tri_vertices, target_tri, atol=1e-6): # 给匹配到的三角形设置绿色 mesh.vertex_colors[mesh.triangles[tri_idx]] = [0, 1, 0] break # 可视化修改后的网格 o3d.visualization.draw_geometries([mesh])
方案2:直接绘制独立的绿色三角形网格
如果不想修改原网格,或目标三角形不属于原网格,可以直接构造新的三角形网格,和原网格一同渲染:
import open3d as o3d import numpy as np # 加载原网格 mesh = o3d.io.read_triangle_mesh("your_mesh.ply") # 已知的两个三角形顶点坐标 tri1_verts = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]) tri2_verts = np.array([[10.0, 11.0, 12.0], [13.0, 14.0, 15.0], [16.0, 17.0, 18.0]]) # 创建第一个绿色三角形 green_tri1 = o3d.geometry.TriangleMesh() green_tri1.vertices = o3d.utility.Vector3dVector(tri1_verts) green_tri1.triangles = o3d.utility.Vector3iVector([[0, 1, 2]]) green_tri1.paint_uniform_color([0, 1, 0]) # 创建第二个绿色三角形 green_tri2 = o3d.geometry.TriangleMesh() green_tri2.vertices = o3d.utility.Vector3dVector(tri2_verts) green_tri2.triangles = o3d.utility.Vector3iVector([[0, 1, 2]]) green_tri2.paint_uniform_color([0, 1, 0]) # 一起可视化原网格和两个绿色三角形 o3d.visualization.draw_geometries([mesh, green_tri1, green_tri2])
注意:浮点坐标匹配时必须用np.allclose,避免精度误差导致匹配失败。
内容的提问来源于stack exchange,提问作者Ali Waqas
相关产品推荐
相关产品推荐

