Javascript中的碰撞处理 - 粒子陷入困境

时间:2012-10-12 01:08:23

标签: javascript collision-detection physics collision momentum

我正在尝试重新创建this,而且我已经相当成功了。我遇到了碰撞处理的问题。虽然碰撞处理似乎有效,但它的行为却很奇怪。 Here是我到目前为止所拥有的。这是处理冲突的代码:

var dx = particle2.getX() - particle1.getX();
var dy = particle2.getY() - particle1.getY();
var angle = Math.atan2(dy, dx);

var newP2X = particle1.getX() + (particle1.getRadius() + particle2.getRadius()) * Math.cos(angle);
var newP2Y = particle1.getY() + (particle1.getRadius() + particle2.getRadius()) * Math.sin(angle);

particle2.setX(newP2X);
particle2.setY(newP2Y);     

var p1Vxi = particle1.getVx();
var p1Vyi = particle1.getVy();
var p1Mass = particle1.getMass();

var p2Vxi = particle2.getVx();
var p2Vyi = particle2.getVy();
var p2Mass = particle2.getMass();

var vxf = (p1Mass * p1Vxi + p2Mass * p2Vxi) / (p1Mass + p2Mass);
var vyf = (p1Mass * p1Vyi + p2Mass * p2Vyi) / (p1Mass + p2Mass);

particle1.setVx(vxf);
particle1.setVy(vyf);
particle2.setVx(vxf);
particle2.setVy(vyf);

编辑:我试图将其改为像建议的非弹性碰撞,但由于某种原因,球碰撞不稳定。请查看here

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

首先,直观地说,想象一下把豆袋扔到冰冻的池塘上。它击中,根本不弹跳(失去它所具有的垂直速度),并且以相同的横向速度滑动。这就是我们正在努力的那种碰撞。

现在是物理学。移动参考帧。北部的火车经过一个谷仓。在谷仓农民的参考框架中,谷仓是静止的,火车以10米/秒的速度向北移动(0°)。在列车中乘客的参考系中,列车静止不动,谷仓以10米/秒的速度向南移动(180度)。骑自行车的人以5米/秒的速度向东(90˚)(在农民的参考框架中);在自行车车架上,自行车静止,谷仓以5米/秒的速度向西(270˚)移动,列车以11.18米/秒的速度移动,达到333.4˚。我们可以轻松地在不同的帧之间进行转换。

两件事正在发生碰撞。我们感兴趣的框架是总动量为零的框架。这称为质心框架。如果两个质量是m 1 且m 2 ,并且速度 v 1 v 2 ,然后质量中心的速度(在质心框架中静止的点,就像骑自行车车架中的自行车一样)是(m 1 v 1 + m 2 v 2 )/( m 1 + m 2 )。我们计算这个框架中两个物体的速度并继续。

物体碰撞。我们绘制一个接触平面 - 在这种情况下是在接触时与两个圆相切的线。这是一个瞬时构造,在所有参考框架中都是相同的(不涉及旋转)。在质心框架中,每个物体的行为就好像这个边界是固定的固体表面 - 在这种情况下是一片冰,没有弹跳。因此,我们将速度矢量分为两个部分,一个平行于冰面,另一个垂直于(垂直)冰面;我们保留第一个并丢弃第二个。

然后我们转换回谷仓框架,我们就完成了。