CGAL Mesh(es)交叉/碰撞

时间:2014-04-06 22:43:17

标签: 3d collision-detection cgal

我希望在我的跟踪管道中有一个碰撞检测模块,检测两个不同的网格何时碰撞/穿透,或者是否存在铰接网格的自穿透。根据渗透的深度,应该有惩罚来对抗这种现象。我应该得到一个碰撞面/顶点的列表,以便这样做。

在检查了几个选项后,我决定开始使用CGAL

this link中,有一个有趣的答案指向了一些例子。 (thisthis)。这些示例使用AABB(轴对齐边界框),这是非刚性网格的建议方法,因为需要频繁更新它们。对于自相交案例,这些例子很清楚,但以下内容对我来说并不是很清楚:

  • 除了为每个三角形创建一个B.Box之外,我想在底层没有创建树结构来加速搜索过程。是这样吗?如果是的话,有任何提示吗?
  • 如果是2个单独的网格,我想在一个向量中合并所有三角形/框并且按照示例(虽然它被称为here作为解决方案,但它没有&#39)并不好听起来很优雅。任何暗示好的做法?是否应该通过创建三角形/方框树来混合these个例子?虽然对于AABB树,但提到:
  

请注意,此组件适合查找所有相交的对象对的问题。我们引用组件Intersecting Sequences of dD Iso-oriented Boxes,它可以找到所有相交的iso导向框对。

2 个答案:

答案 0 :(得分:3)

  1. 函数CGAL::box_intersection_d动态创建分段树,以加快交叉AA边界框对的计算速度。
  2. 据我所知,推荐的方法是在custom boxes的一个向量中合并两个表面,其中框有一个字段以指示三角形所属表面的标识符。这有助于从同一表面快速丢弃成对的盒子。

答案 1 :(得分:0)

我的回答实际上是对lrineau信息量丰富的答案的评论,但是它有点长,所以我将其发布为我自己的答案。 CGAL的Polygon Mesh Processing软件包具有一个名为CGAL::Polygon_mesh_processing::do_intersect()的函数,该函数接受两个三角形网格作为输入,并返回一个布尔值,该布尔值描述网格是否相交。不幸的是,它并没有告诉您那双相交的面孔。

但是,do_intersect()内部调用了一个未记录的函数CGAL::Polygon_mesh_processing::internal::compute_face_face_intersection()(又调用了CGAL::box_intersection_d()),该函数将成对的相交面返回为向量。这是一些示例代码,展示了如何调用它:

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Surface_mesh<K::Point_3> Mesh;
typedef boost::graph_traits<Mesh>::face_descriptor face_descriptor;
typedef std::pair<face_descriptor, face_descriptor> face_descriptor_pair;
namespace PMP = CGAL::Polygon_mesh_processing;

Mesh mesh_a, mesh_b;
std::vector<face_descriptor_pair> tri_pairs;
PMP::internal::compute_face_face_intersection(
    mesh_a,
    mesh_b,
    std::back_inserter(tri_pairs),
    PMP::parameters::vertex_point_map(get(CGAL::vertex_point, mesh_a)),
    PMP::parameters::vertex_point_map(get(CGAL::vertex_point, mesh_b))
);