如何从 3D 曲面网格中删除自相交三角形?

How do I remove self-intersecting triangles from a 3D surface mesh?

本文关键字:删除 自相交 三角形 网格 3D 曲面      更新时间:2023-10-16

我有一个三角形的CGAL surface_mesh,上面有一些自相交的三角形,我试图将其删除以创建一个连续的2流形壳,最终用于打印。

我试图从这个答案中使用remove_self_intersection((和autorefine_and_remove_self_intersections((。第一个只删除了一些自相交点,而第二个完全删除了我的网格。

所以,我正在尝试自己的方法 - 我找到自交集,然后尝试删除它们。我尝试使用低级remove_face但之后无法检测到边界,因此我无法填充生成的孔。这个答案指的是使用更高级别的欧拉remove_face但这种方法,make_hole似乎完全丢弃了我的网格。

这是一个摘录(我正在使用break来查看是否可以删除至少一个三角形,我只是尝试使用第一个三角形(:

vector<pair<face_descriptor, face_descriptor> > intersected_tris;
PMP::self_intersections(mesh, back_inserter(intersected_tris));
for (pair<face_descriptor, face_descriptor> &p : intersected_tris) {
CGAL::Euler::remove_face(mesh.halfedge(get<0>(p)), mesh);
break;
}

我删除自相交三角形的方法是积极删除相交面以及附近的面并填充生成的孔。多亏了@sloriot的评论,我意识到欧拉::remove_face函数失败了,因为集合中的重复面从self_intersections和expand_face_selection函数返回。

从这两个函数的矢量结果中删除重复人脸的快速方法是:

std::set<face_descriptor> s(selected_faces.begin(), selected_faces.end());
selected_faces.assign(s.begin(), s.end());

此代码将人脸向量转换为集合(集合不包含重复项(,然后再次转换回集合。

删除重复项后,Euler::remove_face 函数正常工作,包括更新边界,以便 triangulate_hole 函数可用于生成没有自相交的最终曲面的结果。