【问题标题】:Collision of circular objects圆形物体碰撞
【发布时间】:2023-03-15 12:05:01
【问题描述】:

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

【问题讨论】:

  • 把答案一直读到最后。最后,三角函数抵消了。
  • 没关系,但是碰撞后的距离旅行,我们需要矢量物理。
  • 您在寻找什么?你有一个碰撞标准。您有碰撞点,它位于对象的两个中心点之间的线上。您在碰撞点的切平面上有法线,这只是碰撞点和中心点之间的差向量。都是矢量数学,不涉及三角函数。
  • 我投票结束这个问题,因为它是一个物理问题,而不是一个编程问题。 “给定两个以这些速度运动并在这一点发生碰撞的圆形物体,碰撞后它们的最终位置是什么?” (请注意,您的问题未详细说明。您不知道动量或弹性或摩擦系数。)一旦您从物理学家那里得到答案,如果您无法将其转换为程序,那么您可以在这里提问。
  • 如果一个圆以 A 为圆心,半径为 a,另一个圆以 B 为圆心,半径为 b,并且它们相互接触,则该点联系方式为 A +(B -A)a/(a+b)。现在,关于碰撞,你知道碎片的质量和速度吗?碰撞本身是否存在摩擦?我假设移动部件上的阻力是恒定的,并且与部件的质量成正比;你知道系数吗?

标签: algorithm collision-detection physics


【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多