【问题标题】:Why does my water explode?为什么我的水会爆炸?
【发布时间】: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


【解决方案1】:

假设这是一个没有严格物理意义的 cg 项目...

首先,您应该真正考虑为您的模拟代码使用一个固定的时间步长,否则您会得到不稳定的(和视觉上令人不安的)行为,因为 dt (和 error )抖动。 如果您无法根据最终要求获得一致的帧速率,则应在非固定时间点内插而不是模拟位置。

关于你的墙计算,显然取决于你最终想要达到的效果;因此,如果您应用或多或少的动量保持镜像条件(就像您现在所做的那样) 即使应用了阻尼,粒子也会继续“循环”。如果您希望流体以某种方式“粘”在墙壁上,则需要引入墙壁力或其他更强的耗散效应。

我运行了您的代码,并在设置一致的 dt 和调整粘度并将壁计算简化为更简单“if (p.px

【讨论】:

  • 抱歉这些愚蠢的问题,我显然没有接受过任何正规教育。 :) 我是否正确理解我现在将粒子从地板上反弹回来的方式,水的所有集体重量都被反射回来,这就是为什么底部粒子如此充满活力的原因?如果是这样,那不就是现实生活中发生的事情吗?
  • 如果你所说的“如此有活力”是指为什么你的模拟中的粒子在墙壁附近显得更密集和更快,我认为原因有两个:首先,正如 Davis Herring 所指出的,负表面张力会增加它们在壁边界处的数量密度,从而排斥散装中的粒子(这就是为什么你会在壁边界处看到“间隙”);其次,如上所述,除非您添加壁力,否则粒子将倾向于保持其能量/动量,从而导致始终“旋转”的流体......由于时间步长抖动和数值错误,这种情况会进一步恶化
  • 关于现实生活中发生的事情,这不是一件小事,即使确定“流体元素”真正是什么也需要有关该主题的非平凡知识(流体元素是不是流体微观成分,如分子等......)。无论如何,真正的流体(不包括超流体)会以“零”距离粘附在墙壁上(然后要么进入静止的层流运动,要么进入分离流,然后是湍流)......
  • 在平衡状态下,您应该在边界粒子上观察到的唯一额外能量应该是表面张力和(向地面增加)重力引起的静水压力......(忽略热量等......当然)
  • 我在这个线程中实现了所有建议,到目前为止我有这个:bourt.com/particles.html。如果我减少时间步长或静止密度,我可以让疯狂的舞蹈力量消失,但这似乎不是我应该这样做的大量粒子。 .我错过了什么?这是静息密度与细胞大小的问题吗?另外,在数学上添加热量(或类似热量的东西)的最简单方法是什么?
【解决方案2】:

显然这里有很多。我确定我不能全部回答,但这里有一些重要的观点:

关于墙:您实施的称为momentum mirror。在压力下的流体中,动量镜用于吸引具有某种负表面张力的粒子(因为没有粒子超出它来排斥靠近边界的粒子)。那里堆积得越紧密的粒子会产生更大的力,并且更有可能导致数值问题(特别是因为它们的隐形传态往往会赋予它们潜在的能量)。

关于恢复系数:碰撞周围的简单线性缩放会在撞击时产生切向力,这对于动量镜来说并不典型,但确实倾向于产生物理上逼真的无滑移条件。

关于您链接的第二篇论文:我认为他们正在尝试根据他们的点投影做一些智能的事情。但是,我不知道为什么它们只是投射回表面(而不是计算碰撞时间,然后根据之后(降低的)新速度计算新位置)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2011-04-21
    相关资源
    最近更新 更多