Math 二维圆间碰撞响应
我试图计算两个碰撞球的新速度,但在我解决另一个问题之前,我真的不能这样做 因为在数字世界中,几乎从未发生过真正的碰撞,所以我们总是会遇到“碰撞”球重叠的情况 假设有100个球随机移动,如果我理解正确,程序如下:Math 二维圆间碰撞响应,math,physics,collision-detection,Math,Physics,Collision Detection,我试图计算两个碰撞球的新速度,但在我解决另一个问题之前,我真的不能这样做 因为在数字世界中,几乎从未发生过真正的碰撞,所以我们总是会遇到“碰撞”球重叠的情况 假设有100个球随机移动,如果我理解正确,程序如下: 移动球(x+=vx;y+=vy;) 获得最小重叠(或完全碰撞)的球 将球“及时”移到那个时刻 执行碰撞计算 如果以上所述是正确的,那么,我如何将球“及时”移动到第一次碰撞的点?已知数据: 球的所有坐标(b[i].x,b[i].y) 球X和Y速度(b[i].vx,b[i].vy) 重
- 移动球(
;x+=vx
;)y+=vy
- 获得最小重叠(或完全碰撞)的球
- 将球“及时”移到那个时刻
- 执行碰撞计算
- 球的所有坐标(
,b[i].x
)b[i].y
- 球
和X
速度(Y
,b[i].vx
)b[i].vy
- 重叠球之间的距离(
)dist
我应该只计算距离与碰撞完美距离的百分比,然后简单地向后移动x和y坐标,移动相同的vx和vy百分比吗?编辑:不管怎样,我找到碰撞点的算法是错误的。我会再考虑一下 伊迪丝2:好的,很抱歉。试试这个:
回到碰撞时间后,你可以很容易地用初等物理计算出它们的新速度。请参见考虑这样一种情况:一个圆以原点为中心,静止不动,另一个朝着原点移动,比如-x方向。(您可以使用一些简单的向量代数将任何碰撞情况转换为这种情况。)
所以第二个圆的中心位置是(x,y),其中y是常数,x是递减的。当x2+y2=(r1+r2)2调用该xcrit时发生冲突。但是在模拟中,我们已经超过了这个范围,到了某个x
在这些问题很重要的应用中,最好在移动球之前确定碰撞点。请参阅,了解此碰撞-然后移动方法的基本介绍。对于此类碰撞,通常最容易从其中一个球的参考坐标系中查看 假设您有
ball1
和ball2
。这些球的位置分别为p1
和p2
,速度分别为v1
和v2
。让ball1
相对于ball2
的相对速度为v1-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)
现在既然| a | | 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 | r1 |=1
和|r1 | r1 |=2
和v1=(1,2)
然后v=(3,4)
。碰撞发生在:
t = (||(3,4)|| - 3)/||(3,4)||
t = (5-3)/(5) = 2/5 = 0.4
现在你有了碰撞的时间,计算球在哪里很容易:-)
编辑以将矢量路径放入伪代码:
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)
哇,这么晚了,数学太多了。谢谢你,在理解这些之前,我必须记住向量数学。如果出现严重问题,我会带着问题回来;]好的,我添加了伪代码,这样你就不用太担心向量数学了!谢谢你,我会尽快尝试的。谢谢,我已经设法适应了你的数学,但不幸的是,正如其他海报所说,这并不容易。我想我可以用低速来限制自己,这样球就不会在一个画面中飞过对方,但似乎不行。然而,你的等式回答了我原来的问题,所以谢谢你。图形不正确,因为上面的球