Math 二维圆间碰撞响应

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) 重

我试图计算两个碰撞球的新速度,但在我解决另一个问题之前,我真的不能这样做

因为在数字世界中,几乎从未发生过真正的碰撞,所以我们总是会遇到“碰撞”球重叠的情况

假设有100个球随机移动,如果我理解正确,程序如下:

  • 移动球(
    x+=vx
    y+=vy
    ;)
  • 获得最小重叠(或完全碰撞)的球
  • 将球“及时”移到那个时刻
  • 执行碰撞计算
如果以上所述是正确的,那么,我如何将球“及时”移动到第一次碰撞的点?已知数据:

  • 球的所有坐标(
    b[i].x
    b[i].y
  • X
    Y
    速度(
    b[i].vx
    b[i].vy
  • 重叠球之间的距离(
    dist

我应该只计算距离与碰撞完美距离的百分比,然后简单地向后移动x和y坐标,移动相同的vx和vy百分比吗?编辑:不管怎样,我找到碰撞点的算法是错误的。我会再考虑一下

伊迪丝2:好的,很抱歉。试试这个:

  • 看看他们是什么时候相撞的。让我们在几秒钟前打电话。这将使得两个球之间的距离等于它们的半径之和。方程是((x1-v_x1*T)-(x2-v_x2*T))^2=r1+r2
  • 把球移回时间T
  • 继续你们的碰撞
  • 对不起,我不知道如何在计算机上格式化数学方程


    回到碰撞时间后,你可以很容易地用初等物理计算出它们的新速度。请参见

    考虑这样一种情况:一个圆以原点为中心,静止不动,另一个朝着原点移动,比如-x方向。(您可以使用一些简单的向量代数将任何碰撞情况转换为这种情况。)


    所以第二个圆的中心位置是(x,y),其中y是常数,x是递减的。当x2+y2=(r1+r2)2调用该xcrit时发生冲突。但是在模拟中,我们已经超过了这个范围,到了某个x移动然后碰撞的策略是否有意义取决于您尝试模拟的对象类型,以及精度和速度之间的权衡。比如说,如果你正在写一个斯诺克模拟器,或者超级猴子球,那么移动然后碰撞可能不够好,原因有三

    首先,碰撞后球的速度会错误。这些差异将是微妙的,但对玩家来说是错误的:

    在左侧,当检测到碰撞之前允许球相交时,时间步长结束时的速度。右侧:碰撞后在正确的时间和地点的速度

    第二,移动速度足够快的物体可以相互穿过而不发生碰撞。或者,即使检测到碰撞,也可能以错误的方式弹出对象,导致某种非法运动。(参见tasvideos.org了解超级马里奥兄弟(Super Mario Bros)游戏中由这一移动引起的一个问题,然后是弹出策略。)

    第三,对象可能在时间步结束时相交,没有空间将它们分开(因为其他对象会挡住)。因此,您必须在相交位置绘制对象,这看起来是错误的


    在这些问题很重要的应用中,最好在移动球之前确定碰撞点。请参阅,了解此碰撞-然后移动方法的基本介绍。

    对于此类碰撞,通常最容易从其中一个球的参考坐标系中查看

    假设您有
    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)
    

    哇,这么晚了,数学太多了。谢谢你,在理解这些之前,我必须记住向量数学。如果出现严重问题,我会带着问题回来;]好的,我添加了伪代码,这样你就不用太担心向量数学了!谢谢你,我会尽快尝试的。谢谢,我已经设法适应了你的数学,但不幸的是,正如其他海报所说,这并不容易。我想我可以用低速来限制自己,这样球就不会在一个画面中飞过对方,但似乎不行。然而,你的等式回答了我原来的问题,所以谢谢你。图形不正确,因为上面的球