CGAL - 网格碰撞 - 如何避免相邻三角形

时间:2014-04-07 17:46:15

标签: 3d collision-detection cgal

这是我previous question已解决的后续行动。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

在碰撞检查的回调函数中

  • 首先阅读三角形的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())

  • 如果最后一个命令返回true,则表示您有两个不相邻的三角形碰撞。恭喜:)

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

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

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