圆形物体的碰撞

时间:2015-01-24 05:26:27

标签: algorithm collision-detection physics

我要开发carom棋盘游戏。我遇到了两件碰撞的问题。如何找到两件碰撞点。然后如何找到碰撞后碎片行进的角度和距离。我在circle-circle collision处找到了碰撞点的解。这里的解决方案用三角法描述,但我想用矢量数学解决方案。碰撞后覆盖的距离问题也很容易解决。

1 个答案:

答案 0 :(得分:1)

您无需为碰撞计算本身找到碰撞点。要检测碰撞事件,您只需要比较中心距离和半径之和

sqrt(sqr(x2-x1)+sqr(y2-y1))<=r1+r2

dx*dx+dy*dy <= (r1+r2)*(r1+r2)

其中(x1,y1)(x2,y2)是磁盘1的位置(质量m1,半径r1和速度(vx1,vy1))和2.差异总是2减1,dx=x2-x1等。


你几乎永远不会在离散时间的样本时间发生碰撞。使用上面的公式,圆圈已经重叠。根据时间步长和一般速度,这可能是微不足道的,或者可能导致严重的过度射击。以下简单计算假设慢速运动,即在最后一个时间步骤期间非常小的重叠。


在非旋转磁盘的完全弹性碰撞中发生的唯一事情是速度的变化。当进一步移动将进一步减小距离时,即,如果

,这种变化必须只发生一次
dx*dvx+dy*dvy < 0

其中dvx=vx2-vx1等。

使用这些想法,计算如下所示(有关详细信息,请参阅https://stackoverflow.com/a/23193044/3088138

dx = x2-x1; dy = y2-y1;
dist2 = dx*dx + dy*dy;
R = r1+r2;

if ( dist2 <= R*R )
{
    dvx=vx2-vx1; dvy=vy2-vy1;
    dot = dx*dvx + dy*dvy;

    if ( dot < 0 )
    {
        factor = 2/(m1+m2)*dot/dist2;
        vx1 += m2*factor*dx;
        vy1 += m2*factor*dy;
        vx2 -= m1*factor*dx;
        vy2 -= m1*factor*dy;
    }
}
相关问题