我有以下问题,请与下面的图片最好的描述。
我在3D表面上,所以它可以具有垂直重叠和是一个非封闭网格。 我有我想从中减去的对象。 绿色+黄色区域是原始表面,红色线勾勒出一个球(如三角网格,而不是原始的)。 黄色区域是表面的相交需要被从原件表面除去球体的部分。 绿色区域是减法的结果:所需要的表面。
我已经使用了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));
}