2017-08-02 45 views
0

我有以下问题,最好用下图描述。从表面抽象封闭网格(CGAL?)

我有一个三维表面,所以它可以有垂直重叠,是一个非封闭的网格。我有一个我想从中减去的对象。绿色+黄色区域是原始表面,红色线条表示一个球体(如三角网格,而不是原始图形)。黄色区域是与需要从原始表面移除的球体相交的表面的一部分。绿色区域是减法的结果:需要的表面。

我已经在使用CGAL库,但它仍然是新的,所以使用CGAL的解决方案将是最受欢迎的。但是,如果有人有一个没有CGAL的解决方案,也会受到欢迎。

我能看到的最好方法是给表面稍微厚一点(保持当前表面为底部)。然后使用Nef_polyhedron_3减去另一个对象,然后转换为Polyhedron_3并仅保留底面。但是这看起来有点像黑客。

Intersection


编辑: 使用建议的解决方案我挨得很近,但我无法使用反转法线的建议,使用下面的代码夹到正确的一边。 我也尝试看看脸部顶点顺序(顺时针/逆时针)是否有任何效果,但它似乎没有任何效果。

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)); 
} 

回答

1

从CGAL 4.10开始,在Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/clip.h中有一个未公开的功能。功能签名是:

/// requires face_index_map, vertex_index_map for np_tm 
/// requires face_index_map for np_c 
/// if edge_is_constrained_map is not provided in np_tm a default one is 
/// provided using boost::unordered_set<edge_descriptor> 
template <class TriangleMesh, 
      class NamedParameters1, 
      class NamedParameters2> 
bool 
clip(  TriangleMesh& tm, 
/*const*/ TriangleMesh& clipper, 
      bool close, 
    const NamedParameters1& np_tm, 
    const NamedParameters2& np_c) 

第二个参数是您的球体和第一个曲面。第三个表示您是否希望关闭输出表面(在您的情况下如此错误)。请注意,该功能是剪裁,所以如果你想要球体的外部部分,你需要扭转球体的方向(内部法线)。

有一个使用示例here

我推荐使用Surface_mesh而不是Polyhedron_3

请注意,该函数没有记录,并且标题可能会在即将发布的版本中消失(如果它确实表示它已正式记录)。

+0

谢谢你的回答。表面网格确实更适合我的使用范围。 – Aedoro

+0

然而,我却无法将其夹到修剪的障碍物的正确一侧。我编辑了我的问题,是否有明显的错误可以看到? – Aedoro

+0

删除有关正常计算的所有内容,并在裁剪网格上调用函数['reverse_face_orientations()'](http://doc.cgal.org/latest/Polygon_mesh_processing/group__PMP__orientation__grp.html#gad8a3439883e3e76651f96d15ba58b2bc)。 – sloriot