Ale*_*lex 25 javascript simulation fluid-dynamics
我正在尝试实现用于在JavaScript中模拟流体的Clavet方法,因此调试是一个噩梦,这就是为什么我在这里问,希望有人经历过同样的事情会告诉我我做错了什么.
到目前为止,我有工作OKAY:
但我有两个问题:
1)因为在这种方法中,所有东西都被"偏移"了半步,我不确定如何正确地将粒子从墙上弹开.现在我取出粒子的位置和先前的位置并将它们绕过交叉的墙壁,然后通过反弹因子围绕交叉点进行缩放.
我的逻辑告诉我这应该有效.算法的下一步是更新粒子速度,所以我也反映了之前的位置.但在实践中,这给了我一个我不明白的结果:
这显示了粒子上的"力".墙壁反射过多的力量,使一切都保持永久运动.
公式4.58在本文中 明显显示了一种方法,以防止这一点,但我一直没能得到它的工作.
还有我没有得到的论文中的内容,例如"我们只想反映碰撞中省略的速度"的意思.为什么?请问ELI5这个东西给我好吗?
2)即使不涉及墙壁,模拟也会定期"爆炸".更高的压力会发生这种情况:
这是 JavaScript,所以就是这样,但是我已经完成了代码,并且没有任何划分零或者我可以想象NaN正在发生的情况.
我在论文中看到过关于SIM卡不稳定性的一些话题,我想知道是不是这样.这篇文献中的大部分内容都超出了我的范围.
根据我的理解(我认为),消除不稳定性的方法之一是粘度,但我添加它并且它对爆炸没有帮助:
我可以发布代码,但是在开始工作的第一阶段,它现在很难阅读.
最后一个问题:我如何弄清楚如何将此方法中的伪常量转换为物理单位?
编辑:我发现SIM卡偶尔会冻结,看起来它确实在某个地方产生了NaN,但是Chrome却抓得太晚了.
假设这是一个cg项目,没有严格的物理意义......
首先,您应该真正考虑为您的模拟代码使用固定的时间步长,否则您会因为 dt (和 error )抖动而得到不稳定(且视觉上令人不安)的行为。如果您无法根据最终要求获得一致的帧速率,则应对位置进行插值,而不是在非固定时间点进行模拟。
关于你的墙计算,这显然取决于你最终想要达到的效果;因此,如果您应用或多或少的动量保持镜像条件(就像您现在所做的那样),即使应用了阻尼,粒子也会继续“循环”。如果您希望流体以某种方式“粘”在壁上,则需要引入壁力或其他更强的耗散效应。
我运行了你的代码,在设置一致的 dt 和调整粘度并将壁计算简化为更简单的“if (p.px < left) p.px = left + (left - p.px)*canvas.wallBounce; else if ()...”条件我得到了一个很好的“放松”行为(如果这就是您正在寻找的)。更新以前的位置也会适得其反,因为它会增加墙壁的“反射度”。
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |