gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:26:31 25 4
gpt4 key购买 nike

我想知道我在粒子碰撞模拟中是否犯了数学错误,发现 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com