首先需要从mesh中创建一个o3d.geometry.HalfEdgeTriangleMesh import open3d as o3d mesh_temp = o3d.geometry.TriangleMesh() mesh_temp.vertices = o3d.utility.Vector3dVector(mesh.vertices) mesh_temp.triangles = o3d.utility.Vector3iVector(mesh.vertex_indices) half_edge_mesh = o3d.geometry.HalfEdgeTriangleMesh.create_from_triangle_mesh(mesh_temp) 其次从half_edge_mesh中获取边缘列表: boundary_list = half_edge_mesh.get_boundaries()
但是该库对于halfedge的定义是比较严格的,如果有非流形面,或者一边被三个以上的面共享,则该mesh无法建立半边结构mesh,会有形如下列的问题告警:
RuntimeError: [Open3D Error] (class std::shared_ptr<class open3d::geometry::HalfEdgeTriangleMesh> __cdecl open3d::geometry::HalfEdgeTriangleMesh::CreateFromTriangleMesh(const class open3d::geometry::TriangleMesh &)) D:\a\Open3D\Open3D\cpp\open3d\geometry\HalfEdgeTriangleMesh.cpp:202: ComputeHalfEdges failed. Duplicated half-edges.
此时也不要慌,可以采用igl库来做边界的查找,具体代码如下:
如果想查找最长边界:
bourdary_vert_id = igl.boundary_loop(mesh_c.vertex_indices)
如果想找到全部边界Edge:
b_edgess = igl.boundary_facets(mesh_c.vertex_indices)
扫描二维码关注公众号,回复:
14616391 查看本文章