1

我正在尝试重新创建,并且我已经相当成功。不过,我在碰撞处理方面遇到了问题。尽管碰撞处理似乎有效,但它的行为非常奇怪。是我到目前为止所拥有的。这是处理冲突的代码:

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

编辑:我试图将其更改为建议的非弹性碰撞,但由于某种原因,球碰撞不规律。在这里查看。

任何帮助深表感谢!

4

1 回答 1

2

首先,直观地想象一下将一个豆袋扔到结冰的池塘上。它击中,根本不反弹(失去它所拥有的任何垂直速度),并以与它相同的横向速度滑动。这就是我们正在尝试的那种碰撞。

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

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

物体发生碰撞。我们画了一个接触平面——在这种情况下,一条在接触时与两个圆相切的线。这是一个瞬时构造,在所有参考系中都相同(不涉及旋转)。在质心框架中,每个物体的行为就像这个边界是一个静止的固体表面——在这种情况下是一块冰,没有反弹。所以我们把速度矢量分成两个分量,一个平行于冰的表面,一个垂直(垂直)它;我们保留第一个并丢弃第二个。

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

于 2012-10-14T15:44:53.860 回答