我正在尝试重新创建 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 .
非常感谢任何帮助!
最佳答案
首先,凭直觉,想象一下将一个 bean 袋扔到结冰的池塘里。它撞击,根本不弹跳(失去任何垂直速度),并以相同的横向速度滑动。这就是我们正在尝试的那种碰撞。
现在是物理学。移动引用系。一列北行的火车经过一个谷仓。在谷仓农民的引用系中,谷仓是静止的,火车以 10 m/s 的速度向北 (0°) 移动。在火车乘客的引用系中,火车是静止的,而谷仓以 10 m/s 的速度向南 (180˚) 移动。骑自行车的人以 5 m/s 的速度向东 (90˚) 骑行(在农民的引用系中);在骑自行车的人的框架中,自行车是静止的,谷仓以 5 m/s 的速度向西 (270˚) 移动,火车以 11.18 m/s 的速度移动,方位为 333.4˚。我们可以轻松地在不同的帧之间进行转换。
两件事正在发生冲突。我们感兴趣的框架是总动量为零的框架。这称为质心框架。如果两个质量是 m1 和 m2,速度是 v1 和 v 2,那么质心(在质心坐标系中静止的点,就像骑自行车的人坐标系中的自行车)的速度是 (m 1v1 + m2v2)/( m1 + m2)。我们计算该坐标系中两个物体的速度并继续。
物体发生碰撞。我们画了一个接触面——在这种情况下是一条在接触时刻与两个圆相切的线。这是一个瞬时构造,在所有引用系(不涉及旋转)中都相同。在质心坐标系中,每个物体的行为都好像这个边界是一个静止的固体表面——在这种情况下是一片冰,没有弹跳。因此,我们将速度矢量分为两个分量,一个平行于冰面,一个垂直于冰面;我们保留第一个并丢弃第二个。
然后我们转换回谷仓框架,我们就完成了。
关于javascript - Javascript 中的碰撞处理——粒子卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12850870/