基于GJK的Convex Cast存在的Numerical问题

    这几天碰巧看到Gino 的 ppt<<Continuous Collision Detection: Progress and Challenges>>,里面讲了使用GJK方法来实现两个Convex的Cast方法,一开始以为很简单,而且正好在做车辆的模拟仿真,正好用这种方法来做车轮和地面的Cast,可是我想简单了,刚把自己写好的方法运用上去以后发现车身抖个不停,轮子还不停穿入地面有时候明明该轮子从Cast的起始位置到结束位置会和地面接触,该算法就是返回一个异常的情况,一开始以为自己写错了,去看了下Bullet的代码,发现一样,而且也存在这个问题,主要在于和使用GJK检测碰撞时会遇到的数值误差问题一样,有时候新取得的Minkwoski和的Support Point会已经存在当前的单纯型体中了,但是convex cast的算法没有对这个处理,后来加了处理,本来以为很强壮了可是后来发现还是不行,虽然不会出现穿地面返回无效状态的问题了,可是轮子还是频繁的小幅度抖动,找了很久发现原应在于我使用的Cylindershape模拟轮子和使用一个很大的box模拟地面,这2个尺寸差太多了,导致GJK这类迭代算法的数值不稳定,改小尺寸后一切正常,轮子非常平稳。这也让我总结出了点经验,由于数值问题尽量要使用尺寸相近的东西来进行碰撞检测或者Convexcast运算,实在有大物体,比如一个很大的地面就是用层级Mesh把它划分成多个小的部分,这样可以保证碰撞算法的数值强壮性

 

你可能感兴趣的:(cast)