我有以下问题,最好用下图描述。从表面抽象封闭网格(CGAL?)
我有一个三维表面,所以它可以有垂直重叠,是一个非封闭的网格。我有一个我想从中减去的对象。绿色+黄色区域是原始表面,红色线条表示一个球体(如三角网格,而不是原始图形)。黄色区域是与需要从原始表面移除的球体相交的表面的一部分。绿色区域是减法的结果:需要的表面。
我已经在使用CGAL库,但它仍然是新的,所以使用CGAL的解决方案将是最受欢迎的。但是,如果有人有一个没有CGAL的解决方案,也会受到欢迎。
我能看到的最好方法是给表面稍微厚一点(保持当前表面为底部)。然后使用Nef_polyhedron_3减去另一个对象,然后转换为Polyhedron_3并仅保留底面。但是这看起来有点像黑客。
编辑: 使用建议的解决方案我挨得很近,但我无法使用反转法线的建议,使用下面的代码夹到正确的一边。 我也尝试看看脸部顶点顺序(顺时针/逆时针)是否有任何效果,但它似乎没有任何效果。
typedef CGAL::Simple_cartesian<double> SC;
typedef CGAL::Surface_mesh<SC::Point_3> SurfaceMesh;
typedef SurfaceMesh::Property_map<SM_fid, SC::Vector_3> SM_fnormals;
typedef SurfaceMesh::Vertex_index SM_vid;
typedef SurfaceMesh::Face_index SM_fid;
namespace PMP = CGAL::Polygon_mesh_processing;
namespace params = PMP::parameters;
void clip(SurfaceMesh P&, SurfaceMesh& Q) {
SM_fnormals fnormals = CGALobstacle->add_property_map<SM_fid, SC::Vector_3>
("f:normals", CGAL::NULL_VECTOR).first;
PMP::compute_face_normals(Q, fnormals);
PMP::clip(P, Q, false, params::all_default(), params::face_normal_map(fnormals));
}
谢谢你的回答。表面网格确实更适合我的使用范围。 – Aedoro
然而,我却无法将其夹到修剪的障碍物的正确一侧。我编辑了我的问题,是否有明显的错误可以看到? – Aedoro
删除有关正常计算的所有内容,并在裁剪网格上调用函数['reverse_face_orientations()'](http://doc.cgal.org/latest/Polygon_mesh_processing/group__PMP__orientation__grp.html#gad8a3439883e3e76651f96d15ba58b2bc)。 – sloriot