圆之间的2d碰撞响应

| 我正在尝试计算2个碰撞球的新速度,但是在解决另一个问题之前,我无法做到这一点。 由于在数字世界中几乎不会发生真正的碰撞,因此我们总是会遇到“碰撞”球重叠的情况。 想象一下,有100个球随机运动,因此,如果我理解正确,程序应如下所示: 移动球(
x += vx
;
y+= vy
;) 避免重叠(或完全碰撞)的球 将球“倒退”到那一刻 执行碰撞计算 如果以上正确,那么如何将“倒退”的球移动到第一次碰撞的位置?已知数据: 球的所有坐标(
b[i].x
b[i].y
X
Y
球的速度(
b[i].vx
b[i].vy
) 避免重叠的球之间的距离(
dist
) 我是否应该算出
dist
到碰撞的最佳距离的百分比,然后简单地将
x
y
的坐标后移相同的百分比
vx
vy?
的百分比     
已邀请:
        对于此类碰撞,通常最容易从其中一个球的参考系看它。 假设您有
ball1
ball2
。这些球的位置分别为
p1
p2
,速度为
v1
v2
。令ѭ14相对于ѭ15的相对速度为
v1-v2=v
。 我们想知道
||p1-p2||
小于
||r1||+||r2||
的情况,其中with25ѭ是矢量,它的矢量是第一个球的半径沿朝向第二个球的方向,而
r2
则相反。 从ѭ15的角度来看,
ball1
以velocity29的速度运动。在时间
t
,位置
ball2
在位置
p2+(v1+v2)*t
。 在以下情况下,球发生碰撞:
(p1-(p2+vt)) = (r1+r2)
-(p2+vt) = (r1+r2)-p1
-p2-vt = (r1+r2)-p1
-vt = (r1+r2)-p1+p2
vt = (p1-p2)-(r1+r2)
现在,从
||a|| = ||b||+||c||
a = b+c
,我们知道
||v||t = ||p1-p2|| - ||r1+r2||
t = (||p1-p2|| - ||r1+r2||)/||v||
例如:
p1 = (7,5)
p2=(4,1)
||r1||=1
||r1||=2
,以及
v1=(1,2)
v2=(-2,-2)
然后
v=(3,4)
。碰撞发生在:
t = (||(3,4)|| - 3)/||(3,4)||
t = (5-3)/(5) = 2/5 = 0.4
现在您有了碰撞的时间,弄清楚球在哪里很容易:-) 编辑以将vectormath放入伪代码中:
p = p1-p2
v = v1-v2
t = (sqrt(p.x*p.x + p.y*p.y) - (r1+r2)) / sqrt(v.x*v.x + v.y*v.y)
    
        您的“先走后撞”策略是否有意义取决于您要模拟的事物以及精度和速度之间的权衡。例如,如果您正在编写一个斯诺克台球模拟器或“超级猴子球”,那么“移动然后碰撞”可能不够好,原因有三点。 首先,球在碰撞后将具有错误的速度。差异将是细微的,但对玩家而言将是错误的:     左侧是在检测到碰撞之前允许球相交的时间步长结束时的速度。右边:碰撞后立即在正确的时间和地点的速度。 其次,运动足够快的物体可能会相互穿过而不会发生碰撞。或者即使检测到碰撞,也可能以错误的方式弹出对象,从而导致某种非法运动。 (请参阅tasvideos.org,以了解由这种“先走后弹出”策略引起的Super Mario Bros游戏中的碰撞错误。) 第三,对象可能会在您的时间步长结尾时相交,没有空间将它们分开(因为其他对象会挡住)。因此,您最终不得不在相交的位置绘制对象,这看起来是错误的。 在这些问题很重要的应用中,最好在移动球之前确定碰撞点。请参阅我的这篇文章,以获取有关这种“碰撞后移动”方法的基本介绍。     
        考虑一个圆以原点为中心且静止的圆,另一个圆以-x方向向其移动的情况。 (您可以使用一些简单的矢量代数将任何碰撞情况转化为这种情况。) 因此,第二个圆心的位置为(x,y),其中y为常数,x为递减。当x2 + y2 =(r1 + r2)2时发生冲突,将其称为xcrit。但是在模拟中,我们已经超过了x
编辑:没关系,我发现碰撞点的算法不正确。我会再考虑一下。 EDIT2:好的,对此感到抱歉。尝试这个: 找出它们何时发生碰撞。让我们在T秒前称呼它。这将是T,以使两个球之间的距离等于它们的半径之和。等式为((x1-v_x1 * T)-(x2-v_x2 * T))^ 2 = r1 + r2 将球移回时间T 继续碰撞 抱歉,我不知道如何在SO上格式化数学方程式。 :S 回到碰撞时,您可以使用基本物理学轻松地计算出它们的新速度。参见http://en.wikipedia.org/wiki/Elastic_collision#Two-_and_three-Dimension     

要回复问题请先登录注册