javascript - 粒子碰撞矢量反射问题

标签 javascript html math three.js

我想知道我在粒子碰撞模拟中是否犯了数学错误,发现 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 计算速度该页面的。

代码的具体要点:

  1. pimpj = - pjmpi ,所以你不需要两者都需要
  2. 当最后一帧和当前帧之间的路径太接近时,就会发生碰撞;如果您只检查每一帧的距离,则会遇到粒子高速相互飞行的问题,并且您必须不断移动它们的位置,因为当您检测到碰撞时它们已经重叠。
  3. 理想情况下,计算影响位置并使用这些位置来重定向它们。
  4. 对于速度,只计算pimpj.clone().normalize()一次,然后存储它 - 稍后您不会更改此方向单位向量,因此您不需要继续重新计算它,或计算 pjmpi 派生的等价物(请参阅#1)

关于javascript - 粒子碰撞矢量反射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29382782/

相关文章:

javascript - 将 PHP 数组传递给 HTML 页面。

javascript - 在此示例中如何在 Javascript 中添加分隔千位的空格

javascript - Node js如何每2秒运行一次axios.get?

python - 如何将积分放入 python/matplotlib 的函数中

java - 简单的 GUI 计算器应用程序 java

javascript - amcharts 中文本重叠时的偏移指南标签

php - 一个接一个发短信

html - 100% 宽度/100% 高度着陆页内的元素

html - 滚动闪烁问题 - 使用带有滚动捕捉类型的 cdk-virtual-scroll

java - Scala 和 Java BigDecimal