algorithm - 圆形物体的碰撞

标签 algorithm collision-detection physics

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

最佳答案

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

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;
    }
}

关于algorithm - 圆形物体的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28122594/

相关文章:

java - 使用数据结构在 O(n) 中解决这个问题

c - 操作系统中的循环调度算法

algorithm - 具有虚拟内存和写入组合的并行基数排序

swift - 我怎样才能让我的球随着时间的推移逐渐增加速度?

python - Python 中的重叠积分 - 将结果存储在数组中

python - 在尽可能短的时间内重复字符串中 k 长度子字符串的最佳算法是什么?

python - 检测矩形与圆的碰撞

javascript - 文本冲突检测

collision-detection - 如何检测 Godot 中的碰撞?

c# - Unity 为什么 WheelCollider 扭矩这么慢?