动态球体碰撞检测
出处:Dynamic Circle/Circle Collision Detection in ActionScript 3
demo:collision detection demo 【点击并拖动球,观察速度矢量变化】source:source
介绍:
两球的碰撞是碰撞检测中最普遍的一种。你可以简单比较两球的半径之和与它们圆心距离进行比较,如果它们的之和大于距离,那么球将发生碰撞。在模拟的每一个时间点里做这样的运算就可以了。在大多的情况下会做一定的优化,比如先判断两个球所在的矩形是否有发生碰撞(矩形碰撞略),这样能避免不断的进行开方运算,因为开方运算的开销是非常昂贵的。
问题:
但是如果我们的球运行的速度非常快呢?在速度的开始和结束时间都没发生碰撞;但是在两个时间点之间却发生了碰撞的。(这就是通常所说的穿透现象,就是速度过快,碰撞检测失效了……)
解决办法:
我们计算两次可能的碰撞(给定固定的速度)-它们的开始碰撞时它们是非常临近的(如果它们彼此穿过并且不影响彼此的移动)。这里有两种非必然的情况;且第二种情况无论如何对我们是没有半点好处的,因此我们需要避免:(A)如果球在间隔点上发生碰撞
(B)发生的碰撞是在间隔点之间
这个解决办法的提出在 Christer Ericson 的 Real-Time Collision Detection。他在这方面做了大量的工作,我只是在这里进行解释而已,让我们开始吧。
起源:
首先我们假设一个变量0≤t≤1来表示规定速度内的间隔,这样球的位置遍是:
这里 X 表示初始位置,v 表示速度。因此在开始的时候,球的位置应该是 X+v*0=X, 如果 t 大于 0 的时候,就是 X+v 的一部分。我们需要一个关于 t 的一个方程,根据这个参数用来计算两个球之间的距离变化。
其中
and
当 f 等于两球的半径之和时,这两球发生碰撞:
这里的 r 表示半径。计算距离意味着我们需要做开发运算,之前也提到,这是非常不值得的。所以我们在等式的两边同时进行平方。
矢量之和再平方,进行分解后,类似标量的乘法的多项式运算
将所有项移至等式的左边,转换成以 t 为未知数的一元二次方程,等式格式如下:
其中
根据一元二次方程的求根公式的它两个根:
性能考虑:
所有的运算都需要处理器当然ActionScript也不能避免!我们能组织我们的检测方法实现:
PS:这里略了,因为已经有源码了,自己看,哈哈……
反弹作用:
PS:这里也略了,这里主要是涉及到一些动量守恒的原理,看代码一般能理解的,还有作者还加了弹性和刚体属性。