【发布时间】:2018-02-17 21:35:10
【问题描述】:
我正在尝试实现Clavet method 以在 JavaScript 中模拟流体,所以调试是一场噩梦,这就是我在这里问的原因,希望经历过同样事情的人能告诉我我是什么做错了。
到目前为止,我的工作正常:
但是我有两个问题:
1) 由于在这种方法中,所有东西都会“偏移”半步,所以我不确定如何正确地将粒子从墙上反弹。现在,我获取粒子的位置和之前的位置,并将它们围绕交叉的墙壁翻转,然后通过反弹因子围绕交叉点进行缩放。
我的逻辑告诉我这应该可行。算法的下一步是更新粒子速度,所以我也反映了之前的位置。但在实践中,这给了我一个我不明白的结果:
这显示了粒子上的“力”。墙壁反射了太多的力量,这让一切都保持在永恒的运动中。
this paper 中的公式 4.58 显然显示了一种防止这种情况发生的方法,但我无法让它发挥作用。
论文中还有一些我不明白的东西,比如“我们只想反映在碰撞中被忽略的速度”的意思。为什么?请问有人可以把这些东西给我吗?
2) 即使不涉及墙壁,模拟也会周期性地“爆炸”。压力越大,这种情况就越多:
这个是 JavaScript,所以有那个,但是我已经检查了代码并且没有被零除或我可以想象发生NaN的情况。
我在报纸上看到过一些关于 sim 不稳定的讨论,我想知道是不是这样。这些文献中的大部分内容都超出了我的理解范围。
据我所知(我认为),消除不稳定性的方法之一是粘度,但我添加了它,但对爆炸没有帮助:
我可以发布代码,但在开始工作的第一阶段,现在有点难以阅读。
最后一个问题:我如何弄清楚如何将这种方法中的伪常数转换为物理单位?
编辑:我发现 sim 卡偶尔会死机,似乎它确实在某处产生了 NaN,但 Chrome 捕捉到它为时已晚。
【问题讨论】:
-
作为对他人的灵感,用你的代码切入要点,我们将挖掘gist.github.com
-
“永动机中的一切”不就是现实生活吗?我原以为要获得稳定性,您需要阻尼,一旦达到某个最小值,就会将运动减少到零。虽然这是一个非常有趣的演示,但我认为它不是这里的主题。如果您有特定的编程问题,那很好。但这似乎更多地是关于一般的流体动力学算法。
-
对不起,我尝试在计算机图形论坛上提问,但我没有足够的声誉来添加所有图片。 :(也许模组可以把这个问题移到那里?
-
我有兴趣尝试看看出了什么问题,但我想运行您的模拟,而不仅仅是阅读它。您发布的代码不会自行初始化,并且至少缺少一个函数
getAngle。您能否发布一个可以粘贴到.html文件并在浏览器中运行的完整示例? (即使将它放在问题末尾的代码块中也可以。)
标签: javascript simulation fluid-dynamics