3d CGAL网格相交/碰撞

3d CGAL网格相交/碰撞,3d,collision-detection,cgal,3d,Collision Detection,Cgal,我希望在我的跟踪管道中有一个碰撞检测模块,检测两个不同的网格何时碰撞/穿透,或者是否有铰接网格的自穿透。根据渗透深度,应对这种现象进行处罚。为了做到这一点,我应该得到一个碰撞面/顶点的列表 在检查了几个选项后,我决定开始使用 在本文中,有一个有趣的答案指向一些例子。(和)。示例使用AABBs(轴对齐边界框),这是针对非刚性网格提出的方法,因为需要频繁更新它们。对于自相交的情况,示例很清楚,但我不太清楚以下内容: 除了为每个三角形创建一个B.框之外,我想在引擎盖下没有创建树结构来加快搜索过程。是

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

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

在本文中,有一个有趣的答案指向一些例子。(和)。示例使用AABBs(轴对齐边界框),这是针对非刚性网格提出的方法,因为需要频繁更新它们。对于自相交的情况,示例很清楚,但我不太清楚以下内容:

  • 除了为每个三角形创建一个B.框之外,我想在引擎盖下没有创建树结构来加快搜索过程。是这样吗?如有,有何提示
  • 对于两个单独的网格,我想将所有三角形/长方体合并到一个向量中并遵循示例是不好的(尽管它是作为一种解决方案提到的,但听起来并不那么优雅)。有什么好的练习提示吗?是否应该通过创建三角形/长方体树来混合示例?尽管提到AABB树:
请注意,此组件不适用于查找所有相交对象对的问题。我们指的是可以找到所有iso方向框相交对的组件

  • 该函数动态创建分段树,以加快相交AA边界框对的计算
  • 据我所知,推荐的方法是将两个曲面合并到一个向量中,其中框有一个字段来指示三角形所属曲面的标识符。这有助于快速丢弃同一表面上的成对盒子

  • 我的回答实际上是对勒里诺信息丰富的回答的评论,但有点长,所以我把它作为我自己的答案发布。CGAL的包有一个名为的函数,该函数接受两个三角形网格作为输入,并返回一个描述网格是否相交的布尔值。不幸的是,它没有告诉您相交的面对

    但是,
    do\u intersect()
    在内部调用一个未记录的函数(该函数依次调用
    CGAL::box\u intersection\u 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))
    );
    
    typedef CGAL::精确谓词\不精确构造\内核K;
    typedef CGAL::表面网格;
    typedef boost::graph_traits::face_descriptor face_descriptor;
    typedef std::对面\描述符\对;
    名称空间PMP=CGAL::多边形网格处理;
    网格a、网格b;
    std::向量三对;
    PMP::内部::计算面相交(
    网格(a),
    网布,
    标准:背面插入器(三对),
    PMP::parameters::vertex_point_map(get(CGAL::vertex_point,mesh_a)),
    PMP::parameters::vertex_point_map(get(CGAL::vertex_point,mesh_b))
    );
    
    谢谢你,伊里诺!第一个问题/答案应该是您提到的方式,否则事情会变得非常缓慢,但是文档中没有明确提到引擎盖下树的创建,因此感谢您提供了一些信息!关于第二个问题/答案,你所说的肯定是我唯一能想象的,但我想知道它是否是最优的,从这个意义上说:树状结构是必要的,以避免检查距离较远且在当前时间范围内没有任何碰撞机会的对象,因此,将所有对象的三角形放在一个向量中可能会导致一些加速(仍然使用树),但可能不是最佳方式(顶层树节点包括特定对象/对象组的三角形)。你知道这件事吗?再次感谢!实际上,bbox交集包已经有一个函数可以处理两个bbox向量。我在回答中使用的链接指向该版本。我的建议是针对有两套以上的BBox的情况。的确,对于实际应用程序来说,有两套BBox有点有限(?),其中一套通常有n个BBox。所以我同意你的建议可能更一般。我可以知道我们如何将这些面输出到obj吗?