gpt4 book ai didi

javascript - 模拟两个圆圈相互弹跳

转载 作者:行者123 更新时间:2023-12-02 16:52:37 24 4
gpt4 key购买 nike

我有许多粒子四处移动并进行检测以查看它们何时接触。如果两个粒子接触,它们应该朝相反的方向反弹。

            particle.moveSelf = function() {
var radians = this.angle * Math.PI / 180;

var moveX = this.velocity * Math.sin(radians);
var moveY = this.velocity * Math.cos(radians);

for (var i = 0; i < particles.length; i++) {
var distance = this.position.getDistance(new Point(particles[i].position.x, particles[i].position.y));
//if distance < radius 1 + radius 2, bounce this circle away
if (distance < (this.radius + particles[i].radius) && this.id !== particles[i].id) {
this.velocity = -this.velocity;

}
}

this.position.x += moveX;
this.position.y += moveY;
};

当我运行此代码时,圆圈彼此卡住,每帧以 1* 速度来回移动。

关于如何计算弹跳的速度或 Angular 有很多问题,但我的问题只是它陷入了无限振荡。

最佳答案

我以前做过这个,所以这里有一些见解:

  1. 最安全的方法是为每个粒子添加碰撞列表

    • 在第一遍中,您只需检测碰撞
    • 并使用所有相互碰撞的粒子的索引清除/填充碰撞列表

      for (i=0;i<particles;i++) particle[i].collide.clear();
      for (i=0;i<particles;i++)
      for (j=i+1;j<particles;j++)
      if (colide(particle[i],particle[j]))
      {
      particle[i].collide.add(j);
      particle[j].collide.add(i);
      }
    • 您也可以使用 for (i=0;i<...) 循环内的一个列表来实现此目的

    • 但这并不那么精确
  2. 仅更新碰撞项目的位置和速度

    • 现在是棘手的部分
    • 我向每个粒子添加新的方向向量并将其设置为零
    • 然后在每次碰撞中添加一个反射(单位或速度或力脉冲)向量

      for (i=0;i<particles;i++) 
      for (j=0;j<particle[i].collides;j++)
      {
      // here compute reflected direction ,speed whatever of the bounce to vector dir
      particle[ i].reflect+=dir;
      particle[particle[i].collide[j]].reflect+=dir;
      }
    • 完成后只需更新位置/速度...

    • 但是您需要添加更新所需的内容,例如
    • 如果您使用单位向量,则标准化反射,并将其大小设置为新速度
    • 位移也是如此,因此粒子不会重叠
    • 您还可以计算所有反弹粒子的组合动能矢量,并通过质量能量分布计算出新的速度

      for (i=0;i<particles;i++) 
      {
      particle[i].speed=compute_speed_from(particle[i].reflect);
      }

[注释]

  • 最好是存储驱动反射力
  • 可以很容易地在其上正确实现弹跳物理模拟
  • 也可用于处理 Spring 和其他东西
  • 如果您有永久键,那么您可以在某些永久碰撞列表中预先计算它们一次
  • 提高性能
  • 项目符号 2 可以在没有碰撞列表的情况下使用,但对于一次多次反弹来说,它不太精确

关于javascript - 模拟两个圆圈相互弹跳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26455960/

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