这是我previous question已解决的后续行动。
我正在尝试开发一种网格碰撞方法,以惩罚内部穿透。 出于这个原因,我开始使用CGAL,我通过密切关注this示例(“查找相交3D三角形的示例”)进行了第一次尝试。
然而,似乎它将所有相邻的三角形情况都检测为碰撞(现在看来这个方法很明显会这样做)。
有没有办法只检测非相邻三角形的实际碰撞? 理想情况下,碰撞检测方法应该在创建输出之前处理这个问题,从而避免过滤掉碰撞三角形的最终矢量以及随之产生的计算负担。
我的三角形的结构是三角形汤,即。存储在没有特定排序的向量中。
答案 0 :(得分:0)
我发现的解决方案如下(虽然不确定这是否是最佳解决方案):
在碰撞检查的回调函数中
id1 = a.handle() - coll_Triangles.begin();
id2 = b.handle() - coll_Triangles.begin();
a.handle() - > is_degenerate()
这很明显,这里不是伪代码:)
CGAL :: do_intersect(*(a.handle()),*(b.handle())
do_intersect必须在所有其他测试之后作为最后一步发生,否则计算负荷相当大并且徒劳无功。
另一种可能的加速是使用半开而不是关闭的盒子。我发现在所有三角形对之间的贪婪检查中,这会导致加速(~50%),但我认为这可能导致错过一些碰撞(例如在触摸的情况下)。
CGAL::Box_intersection_d::HALF_OPEN
CGAL::Box_intersection_d::CLOSED