考虑一个 3D 太阳系模拟。
我的模拟循环:
[Calculate new positions]->[Render]->[Calculate new positions]->[Render] etc....
这个循环以 25FPS 的速度运行。
在我的模拟中,一颗行星正以非常快的速度向太阳移动(在碰撞过程中)。让我们看一下模拟循环:
- 计算行星和太阳的位置(它们尚未碰撞,但彼此非常接近)。
- 场景被渲染。
- 由于 FPS 不是无限的,因此在下一次迭代之前会有一个小的停顿。
- 计算行星和太阳的位置——这是我的问题的症结所在——它们没有发生碰撞,因为在“小暂停”期间,行星已经“穿过”太阳,它们的位置现在相距很远。碰撞检测算法不检测任何碰撞。
我在这里能看到的唯一解决方案是:
- 提高FPS
- 降低我的行星的速度(降低引力常数??)
- 有一个单独的模拟循环,而不是在渲染循环旁边运行,但速度更快
对于任何感兴趣的人,我正在使用three.js。