【问题标题】:CGAL - Mesh Collision - How to avoid Adjacent TrianglesCGAL - 网格碰撞 - 如何避免相邻三角形
【发布时间】:2014-04-07 17:46:14
【问题描述】:

这是我的previous question 的后续处理,已解决。

我正在尝试开发一种网格碰撞方法来惩罚相互渗透。 出于这个原因,我开始使用 CGAL,并且通过密切关注 this 示例(“查找相交 3D 三角形的示例”)进行了第一次尝试。

但是,它似乎将所有相邻三角形的情况都检测为碰撞(现在很明显该方法会这样做)。

有没有办法仅检测非相邻三角形的实际碰撞? 理想情况下,碰撞检测方法应该在创建输出之前处理好这一点,从而避免过滤掉碰撞三角形的最终向量以及随之而来的计算负担。

我的三角形的结构是三角形汤,即。存储在没有特定顺序的向量中。

【问题讨论】:

    标签: 3d collision-detection cgal


    【解决方案1】:

    我找到的解决方案如下(虽然不确定这是否是最佳解决方案):

    在碰撞检查的回调函数中

    • 首先读取三角形的 ID

    id1 = a.handle() - coll_Triangles.begin();

    id2 = b.handle() - coll_Triangles.begin();

    • 检查三角形是否退化(如果为真,则返回)

    a.handle()->is_degenerate()

    • 检查三角形的顶点 ID。如果它们共享一个顶点 ID,则返回

    这很明显,这里不是伪代码:)

    • 仅当上述条件成立时,才进行三角形之间的实际相交测试

    CGAL::do_intersect( *(a.handle()), *(b.handle())

    • 如果最后一个命令返回真,那么你有两个不相邻的三角形碰撞。恭喜:)

    do_intersect 必须作为最后一步发生,在所有其他测试之后,否则计算负载非常大而且徒劳无功。

    另一个可能的加速是使用半开而不是封闭的盒子。我发现在所有三角形对之间的贪婪检查期间,这会导致加速(~50%),但我认为这可能会导致丢失一些碰撞(例如在触摸的情况下)。

    CGAL::Box_intersection_d::HALF_OPEN
    CGAL::Box_intersection_d::CLOSED
    

    【讨论】:

      猜你喜欢
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      相关资源
      最近更新 更多