Javascript 如何实现二维圆之间的排斥(paperjs)

Javascript 如何实现二维圆之间的排斥(paperjs),javascript,collision-detection,paperjs,Javascript,Collision Detection,Paperjs,我正在制作一个paperjs应用程序,其中你有圆圈,每个圆圈都可以自由移动。一些圆通过直线相互连接,这会使圆彼此更接近-即直线模拟圆之间的弹性带。但是这些圆不允许重叠,所以我想做一些碰撞排斥。目前,我已经将其作为圆之间的排斥力来实现。对于每个圆,我检查所有其他圆的位置,每个圆的速度向量在靠近它的圆的相反方向上增加,与它离这个圆的距离成比例。所以实际上类似于velocityvector+=-(从这里到这里的向量/10) 然而,这样做的效果是,在连接的圆之间的吸引力和所有圆之间的斥力之间,你最终会持

我正在制作一个paperjs应用程序,其中你有圆圈,每个圆圈都可以自由移动。一些圆通过直线相互连接,这会使圆彼此更接近-即直线模拟圆之间的弹性带。但是这些圆不允许重叠,所以我想做一些碰撞排斥。目前,我已经将其作为圆之间的排斥力来实现。对于每个圆,我检查所有其他圆的位置,每个圆的速度向量在靠近它的圆的相反方向上增加,与它离这个圆的距离成比例。所以实际上类似于
velocityvector+=-(从这里到这里的向量/10)

然而,这样做的效果是,在连接的圆之间的吸引力和所有圆之间的斥力之间,你最终会持续地来回抖动

那么,在圆之间实现某种排斥的最佳方式是什么?这种排斥不会导致任何抖动,但只会让圆的边缘彼此接触,而不会靠得更近?实际上,我希望这些圆只是相互碰撞,不允许彼此滑动,但允许它们沿着彼此的外缘无摩擦地滑动,以到达动量携带它们的位置。

您可以执行一个步骤,然后执行一个位置固定步骤。这个想法是在物体上施加一个与撞击法线方向一致的脉冲

// vx: velocity vector of object x
// ux: velocity vector of object x after impact
// mx: mass of the object x (1 if all objects are the same size)
// n: normal of impact (i.e.: p1-p2 in the case of circles)
// I: the coefficient of the impulse

// Equation of an inelastic collision
u1 * n = u2 * n
// Equations of the velocities after the impact
u1 = v1 + I * n / m1
u2 = v2 - I * n / m2

// solved for I:
I = (v1 - v2) * n / ((n*n)*(1/m1 + 1/m2))
当你有
I
时,你只需要应用速度变化。在应用脉冲之前,最好检查
I>0
,以防止形状粘在一起。让我们看看它是如何工作的,如果在所有这些之后球开始缓慢重叠,那么添加位置迭代


PS:您也可以在一个时间范围内重复整个碰撞步骤,以便在对象涉及多个碰撞时获得更好的结果(因为它们被粘在一起形成一个大球)

您可以提供一个简单的示例作为代码片段或JSFIDLE吗?对非弹性碰撞的引用非常有用,非常有帮助