我想知道我在粒子碰撞模拟中是否犯了数学错误,发现 here .
在碰撞解决过程中,粒子似乎没有正确分离。以下是分离粒子并改变其速度的函数的代码片段:
//particle 1
var pi = particles[i];
//particle 2
var pj = particles[j];
//particle 1 to particle 2
var pimpj = pi.mesh.position.clone().sub(pj.mesh.position);
//particle 2 to particle 1
var pjmpi = pj.mesh.position.clone().sub(pi.mesh.position);
//if colliding (radius is 20)
if(pimpj.length() < 20 && pimpj.length() != 0)
{
//reflect velocity off of 1->2
pi.velocity = pi.velocity.reflect(pimpj.clone().normalize()).multiplyScalar(restitution);
//reflect velocity off of 2->1
pj.velocity = pj.velocity.reflect(pjmpi.clone().normalize()).multiplyScalar(restitution);
//move particle 1 to appropiate location based off of distance in between
var pip = pi.velocity.clone().normalize().multiplyScalar(20-pimpj.length());
//move particle 2
var pjp = pj.velocity.clone().normalize().multiplyScalar(20-pimpj.length());
pi.mesh.position.add(pip);
pj.mesh.position.add(pjp);
}
我尝试在更改 pi.velocity 时使用 pjmpi 反转 pimpj,但没有效果。
注意:我正在使用 Three.js
最佳答案
首先,您似乎正在寻找的粒子碰撞是 Elastic collisions ,其中有涵盖碰撞后速度计算的数学。
碰撞在动量坐标系中心最简单,因此如果您首先计算该坐标系 V = (m1v1子> + m2v2)/(m1+m2 ),然后您可以从两个粒子中减去它,进行简单的对称碰撞,然后重新添加帧速度。
从那里,使用公式 in the 2 & 3d section 计算速度该页面的。
代码的具体要点:
-
pimpj
= -pjmpi
,所以你不需要两者都需要 - 当最后一帧和当前帧之间的路径太接近时,就会发生碰撞;如果您只检查每一帧的距离,则会遇到粒子高速相互飞行的问题,并且您必须不断移动它们的位置,因为当您检测到碰撞时它们已经重叠。
- 理想情况下,计算影响位置并使用这些位置来重定向它们。
- 对于速度,只计算
pimpj.clone().normalize()
一次,然后存储它 - 稍后您不会更改此方向单位向量,因此您不需要继续重新计算它,或计算 pjmpi 派生的等价物(请参阅#1)
关于javascript - 粒子碰撞矢量反射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29382782/