微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

圆之间的2d碰撞响应

如何解决圆之间的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 举报,一经查实,本站将立刻删除。