如何解决圆之间的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 版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。