我要开发 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/