Skip to content

Flash向量-11-两个高速运动的球

运动的球心情肯定不错吧,因为它能动并且还能游览这个世界。但是,如果另外一个球决定不再原地不动,而也运动起来,那么会发生什么事情呢?我们很有必要研究一下这个。在这种情况下,我们之前介绍的碰撞检测方法可能会失败。让我们看看相同的例子:

球1按照红色运动向量来运动,球2按照蓝色运动向量来运动。如果要正确的进行碰撞检测的话,我们需要把每个球的运动向量考虑在内。

图中,当两球相撞时,球1到达了p2,而球2到达了p3。幸亏我们用了向量,我们可以非常容易的将2个向量相加。这样,我们就不用考虑2个运动的球,我们用球1的运动向量减去球2的运动向量,然后我们可以用不记得的话,可以看看学过的“一个运动的球和一个静态的球”的模型。【as4game注:这一段说的就是初中学的相对运动,把2个球的运动转化成1个球的运动】

用球1的运动向量减去球2的运动向量,就得到了向量v3:

v3={};
v3.p0=ball1.p0;
v3.vx=ball1.vx-ball2.vx;
v3.vy=ball1.vy-ball2.vy;

现在,我们可以使用上一章学习的方法来进行碰撞检测,假设球1要移动v3这么多,而v2原地不动。如果球1在p4这一点碰到球2。我们计算出新的向量v4,它是球1碰到球2时,自己的运动向量。

game.v4={p0:ball1.p0, p1:p4};

因为我们知道2个球都在运动,我们可以找到变量“t”,它的值为v4的长度除以v3的长度。

t=v4.len/v3.len;

变量“t”的值在0到1之间。当它等于1,碰撞发生在球的运动向量的终点,当它等于0,碰撞发生在球的运动向量的起点。为了计算2个球发生碰撞时的位置,我们需要将将它们的运动向量乘以t:

ball1.p1.x=ball1.p0.x+t*ball1.vx;
ball1.p1.y=ball1.p0.y+t*ball1.vy;
ball2.p1.x=ball2.p0.x+t*ball2.vx;
ball2.p1.y=ball2.p0.y+t*ball2.vy;

我制作了2个运动的球的例子:

你可以拖动球的运动向量的终点。

你可以下载fla源文件

2个球的弹性

在找到了碰撞点之后,我们可以改变球的运动向量,可以参考章节球和球章节。但是到目前为止,我们只学过一个球运动时的反弹。当2个球都在运动,它们的运动会相互影响,使得他们的运动向量都需要重新计算。
弹性取决于2个球的质量。为了简化问题,我们假设2个球的质量相等【as4game注:如果要考虑质量不相等的情况,可以用动量守恒定理和能量守恒定律2个方程来计算】。在这种情况下,他们中心连线方向的速度会交换:

vc是球心连线向量,vcn是它的法线。现在我们将运动向量v1和v2在vc和vcn上进行投影:

v1被分解成v1a和v1b,同样v2被分解成v2a和v2b。然后v1a和v2a会交换,然后用v1b和v2a来计算球1的新运动向量,用v1a和v2b来计算球2的新运动向量。

下面的例子中,一些球在运动,他们彼此反弹:

你可以下载fla源文件

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*