LibGDX使用for循环实现N体模拟时行星无法渲染问题
N体模拟for循环版本行星无法渲染问题解决
核心原因
两种写法的本质差异是你的双层for循环多了行星对自身计算引力的无效逻辑,直接把物理计算算崩了:
- 你手动逐行调用move方法时,从来没写过行星自己作为引力源作用于自身的逻辑,所有计算都是其他行星对当前行星的引力,物理状态正常
- 双层循环执行时,当
i == j,你传入的引力源就是当前行星本身:两个物体坐标完全重合,距离为0,万有引力公式中引力大小和距离平方成反比,直接触发除零错误,计算出的加速度、速度、位置坐标都会变成NaN(无效浮点值)。后续渲染逻辑拿到无效的坐标参数自然无法正常绘制行星,调试时看到属性值全是无效值,很容易误以为是行星对象没有有效内存地址。
修复方案
只需要在内层循环加一个判断,跳过索引相等(即行星自身)的情况即可,修正后的循环代码如下:
for(int i = 0; i < planets.size(); i++) { for(int j = 0; j < planets.size(); j++) { if (i == j) { continue; } planets.get(i).move(Gdx.graphics.getDeltaTime(), planets.get(j)); } }
额外优化提示
当前修复后的逻辑会重复计算每对行星之间的引力(比如行星A对B的力和B对A的力会分开算两次),3个天体测试时性能损耗可以忽略,后续如果要模拟更多天体,可以改成成对遍历的逻辑,把计算量降低一半。
内容的提问来源于stack exchange,提问作者eisa.exe
相关产品推荐
相关产品推荐

