Javascript 物理模拟基础

Javascript 物理模拟基础,javascript,three.js,simulation,physics,game-physics,Javascript,Three.js,Simulation,Physics,Game Physics,考虑三维太阳系模拟 我的模拟循环: [Calculate new positions]->[Render]->[Calculate new positions]->[Render] etc.... 这个循环以,比如说,25FPS的速度运行 在我的模拟中,一颗行星正以非常快的速度朝着太阳运行(在碰撞过程中)。让我们看看模拟循环: [Calculate new positions]->[Render]->[Calculate new positions]->[R

考虑三维太阳系模拟

我的模拟循环:

[Calculate new positions]->[Render]->[Calculate new positions]->[Render] etc....
这个循环以,比如说,25FPS的速度运行

在我的模拟中,一颗行星正以非常快的速度朝着太阳运行(在碰撞过程中)。让我们看看模拟循环:

[Calculate new positions]->[Render]->[Calculate new positions]->[Render] etc....
  • 位置是为行星和太阳计算的(它们还没有碰撞,但彼此非常接近)
  • 场景被渲染
  • 因为FPS不是无限的,所以在下一次迭代之前会有一个小的暂停
  • 位置是为行星和太阳计算的——这是我问题的症结所在——它们没有碰撞,因为在“小停顿”期间,行星“穿过”太阳,它们的位置现在相距很远。碰撞检测算法不检测任何碰撞
  • 我在这里看到的唯一解决方案是:

    • 提高FPS
    • 降低行星的速度(降低引力常数??)
    • 与沿渲染循环运行相比,具有单独的模拟循环,但速度更快

    对于任何感兴趣的人,我都在使用。

    在射击游戏中使用射弹。一种解决方案是让你的运动台沿前进路径拍摄一段线段,看看它是否会在下一帧之前击中任何物体。假设只有一个物体在快速移动。我想你也可以在上一个职位和新职位之间做一段,尽管我自己没有这样做过。我还成功地将我的碰撞器定义向前扩展为一个覆盖未检查区域的椭圆。

    您可以查看两个对象之间角度的变化,如果接近180度或π弧度,则它们很可能发生碰撞。 可以使用一点线性代数(使用以下公式)计算两个对象之间的角度变化:

    您不必采用圆弧余弦,因为对于接近180度的悬挂,cos(悬挂)将接近-1

    我不确定你应该在哪个范围内成功检测碰撞,在这一部分进行一些尝试和错误。我认为这不是碰撞检测的唯一步骤,在检查了碰撞时间后,假设两个物体在这一时间段内以直线和恒定速度运动,它们会发生碰撞。
    要求解的方程将是一个二次方程,它可以有两个可能的答案(其中一个答案是,如果它们彼此发生故障并在另一侧发生碰撞)。但是,如果您对它们碰撞的确切时间不感兴趣,您仍然可以使用判别法来确定是否会发生碰撞。

    很高兴听到我不是一个人。谢谢刚果民主共和国。我会把你的解决办法弄得一团糟。对手头的问题来说似乎太复杂了。