【问题标题】:CGAL Mesh(es) intersection/collisionCGAL Mesh(es) 相交/碰撞
【发布时间】:2014-04-06 22:43:16
【问题描述】:

我想在我的跟踪管道中有一个碰撞检测模块,检测两个不同的网格何时发生碰撞/相互穿透,或者是否存在关节网格的自穿透。根据渗透的深度,应该对这种现象进行惩罚。为了这样做,我应该得到一个碰撞面/顶点的列表。

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

this link 中有一个有趣的答案指向一些示例。 (thisthis)。这些示例使用 AABB(Axis-Aligned Bounding Boxes),这是针对非刚性网格的建议方法,因为需要频繁更新它们。对于自相交情况,这些示例很清楚,但以下对我来说不是很清楚:

  • 除了为每个三角形创建一个 B.Box 之外,我想没有在后台创建树结构来加快搜索过程。是这样吗?如果是,有什么提示吗?
  • 如果有 2 个单独的网格,我想将所有三角形/框合并到一个向量中并遵循示例并不好(尽管提到了 here 作为解决方案,但听起来并不那么优雅)。有什么好的练习提示吗?是否应该通过创建三角形/框树来混合these 示例?虽然对于 AABB 树有提到:

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

【问题讨论】:

    标签: 3d collision-detection cgal


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

    【讨论】:

    • 谢谢伊里诺!第一个问题/答案应该按照您提到的方式进行,否则事情会变得非常缓慢,但是文档中没有明确提到引擎盖下的树的创建,所以感谢您在那里提供一些启示!
    • 关于第二个问题/答案,你说的肯定是我能想象的唯一事情,但我想知道它是否是最优的,从这个意义上说:需要树结构以避免检查距离较远且在当前时间范围内没有任何碰撞机会的对象,因此将所有对象的三角形扔到一个向量中可能会导致一些加速(仍然使用树)但可能不是最佳的方式(顶部树节点包括特定对象/对象组的三角形)。你对此有什么想法吗?再次感谢!
    • 其实bbox交集包已经有一个函数可以处理bbox的两个向量。我在答案中使用的链接指向该版本。我提出的建议是针对您拥有两组以上 bbox 的情况。
    • 没错,对于实际应用来说,拥有两组 bbox 有点受限(?),通常一个有 n 个 bbox。所以我同意你的建议可能更笼统。
    【解决方案2】:

    我的回复实际上是对 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))
    );
    

    【讨论】:

    • 请问如何将这些人脸输出到 obj 中?
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2010-09-28
    • 2023-03-11
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    相关资源
    最近更新 更多