Mar*_*ius 7 math physics collision-detection
我正在尝试计算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。令 的相对速度ball1为 。ball2v1-v2=v
我们想知道什么时候||p1-p2||小于||r1||+||r2||,其中r1是第一个球的半径长度在朝向第二个球的方向上的向量,r2反之亦然。
从ball2角度来看,ball1是在高速移动v1+v2。时间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)
Run Code Online (Sandbox Code Playgroud)
从什么||a|| = ||b||+||c||时候开始a = b+c,我们知道
||v||t = ||p1-p2|| - ||r1+r2||
t = (||p1-p2|| - ||r1+r2||)/||v||
Run Code Online (Sandbox Code Playgroud)
例如: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
Run Code Online (Sandbox Code Playgroud)
现在您已经了解了碰撞的时间,找出球在哪里就很容易了:-)
编辑将向量数学放入伪代码中:
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)
Run Code Online (Sandbox Code Playgroud)