Javascript中的冲突处理-粒子被卡住

Javascript中的冲突处理-粒子被卡住,javascript,collision-detection,physics,collision,momentum,Javascript,Collision Detection,Physics,Collision,Momentum,我正在尝试重新创造,我已经相当成功了。但我在碰撞处理方面有问题。虽然碰撞处理似乎有效,但其行为非常奇怪。这就是我目前所拥有的。这是处理冲突的代码: var dx = particle2.getX() - particle1.getX(); var dy = particle2.getY() - particle1.getY(); var angle = Math.atan2(dy, dx); var newP2X = particle1.getX() + (particle1.getRadiu

我正在尝试重新创造,我已经相当成功了。但我在碰撞处理方面有问题。虽然碰撞处理似乎有效,但其行为非常奇怪。这就是我目前所拥有的。这是处理冲突的代码:

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);
编辑:我尝试将其更改为建议的非弹性碰撞,但由于某些原因,球会不规则地碰撞。请查看。


非常感谢您的帮助

首先,凭直觉想象一下,把一个豆包扔到结冰的池塘上。它撞击,根本不反弹(失去它所拥有的任何垂直速度),并以它所拥有的相同横向速度滑动。这就是我们想要的那种碰撞

现在是物理学。移动参考帧。一列向北行驶的火车经过一个谷仓。在谷仓农民的参考坐标系中,谷仓处于静止状态,列车以10 m/s的速度向北移动(0˚)。在列车乘客的参考坐标系中,列车静止,谷仓以10 m/s的速度向南移动(180˚)。一名骑自行车的人以5米/秒的速度向东行驶(90˚)(在农民的参考坐标系中);在骑车人的框架内,自行车静止不动,谷仓以5米/秒的速度向西移动(270˚),火车以11.18米/秒的速度移动,方向为333.4˚。我们可以轻松地在不同的帧之间转换

两件事相互冲突。我们感兴趣的框架是总动量为零的框架。这就是所谓的重心框架。如果两个质量为m1和m2,速度为v1和v2,则质心(质心框架中静止的点,如自行车在自行车车架中)的速度为(m1v1+m2v2)/(m1+m2)。我们计算了这一帧中两个物体的速度,然后继续

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


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

猜测一下,您试图重建的模拟是使用非弹性(牛顿)碰撞;你的碰撞看起来不现实(非牛顿)。你想让它们变成牛顿的吗?是的,我试图制造弹性碰撞,但我想我需要按照你的建议去做。我已经考虑过了,如果不经过物理学,真的不可能解释这一点。你愿意吗?现在看起来球好像重叠了。你介意写一些伪代码吗?我理解你说的大部分内容,但我不知道如何实施。哪一部分?你能把一个矢量从“世界”帧转换成速度为v的帧吗?你能找到质心坐标系的速度吗(在“世界”坐标系中测量)?给定两个圆的位置,你能找到一个从一个中心到另一个中心的向量,以及另一个垂直于该向量的向量吗?你能在给定的基础上分解一个向量吗?我更新了代码,它更好,但并不完美。看一看。