首先,我们看看如何判断2个球发生碰撞。然后,再思考碰撞发生之后,球该怎么运动。

图中有球1(红色)和球2(蓝色)。2个球的球心之间的向量为v(绿色)。只有当v的长度小于两个球的半径只和时,两个球才发生了碰撞。我们需要做的是让2个球刚刚紧挨着,为了达到这个目的,我们需要将球1向v的方向移动一段距离:
pen=v.len-(b1.r+b2.r)
现在,2个球刚好紧贴,我们需要研究下运动向量如何变化。想象一下在两个球之间有一个无形的墙壁,墙壁的方式和球心连线向量的法线方向相同。

图中,黑色向量是向量v的法线,将它作为墙壁向量,用之前的方法计算球1的反弹运动向量。
以下是一个例子,一个球在舞台上移动,另外有几个静态的球。
尝试拖动那些静态的球。
你可以下载fla源文件。
把它装起来
你可能想让一个球在另外一个球里面。
假设,b2是大球,b1是小球。判断小球是否移出的条件是:
b2.r<(b1.r+v.len)
当这种情况发生的时候,我们需要将它移动回去,移动多少呢:
var pen=b2.r-(b1.r+v.len)
另外,要注意,计算反弹的时候,我们使用左法线(而不再是右法线):
var vbounce={dx:-v.dy, dy:v.dx, lx:-v.dx, ly:-v.dy};
你可以下载fla源文件。

Post a Comment