[测试记录用,非技术分享文]
Asher说搞个shallow water作为测试题,这就来研究一下。未知结果如何(可能连效果都实现不出来.. but,always do it..)
看了下项目架构,好像内容并不算太多,无可演示的效果,so..造轮子?
没上cpp,有个别蓝图..hlsl不少,盲猜是搞算法为主..
先看SPH文件夹吧(量体较少,maybe比较简单容易入手)
(BasicSPHSystem内只有SPHEmitter一个发射器)
找个SPH的算法 https://blog.csdn.net/liuyunduo/article/details/84098884
分别是重力,压力梯度(高往低,哈密顿算子∇),粘度*粒子之间速度差
展开一下,得到对应每个粒子(ri点)的加速度(影响流体运动的计算方法):
然后考虑光滑核函数W + 考虑各点受力不均匀(用算术平均值) 的情况,展开得:
步骤应该是:
1.计算密度
2.计算压力
3.计算加速度
4.计算表面张力影响的加速度变化
5.计算粒子位置
6.渲染
-------------------------------------------------------------------------备注块start
备注部分知识点:
1.在流体模拟中,常用假设:流体是不可压缩的。表明流速场是无散的。也就是流体并不收缩或者扩散,在每一点处流入速率率等于流出速率。
但注意SPH算法方法违反了此项假设。因此SPH模拟的流体会表现出现实中很少见到的流体的“弹性”。(盲猜对比Asher那只史莱姆)
缓解办法:通过增大下方第4点中的k还有γ,使得流体坚硬。但需要更短的模拟时间步长(估计在这步上需考虑性能瓶颈了)
对于这个压缩性问题,并需要模拟复杂细节飞溅效果时,已有“预估纠正方法”来解决,拓展部分,书本没描述。但提供了参考文献名字。
2.纳维-斯托克斯方程。目前研究加速度场,故用单位为 每单位体积的质量的密度场来代替质量,用单位为 每单位体积上的力的力密度场来代替力。
3.密度、黏度、运动黏度(黏度系数/密度)数值参照表
4. 关于压强梯度部分的书本描述《基于物理的建模与动画》
图中14.6公式比计算所用的公式更为准确,记录,以备一用。
5.对于速度差(液体扩散),根据动量 ρu (密度&速度向量)的拉普拉斯项(二阶偏导)拆分化简可得。
6.对于表面张力,通过创造有限支撑区域(也就是ri离点r的距离)的颜色场,有粒子的位置值为1、之外的位置为0,可以得到光滑变化的颜色场c(x)。
因为场临近表面的地方很大,在其他地方几乎为零(也就是表面内外与表面边界的值区别很大)。
所以通过对矢量S进行阈值处理就可以定位流体表面。(轮廓检测)
且
因为表面场从无流体区域指向有流体区域,所以对负梯度归一化可以得到表面法线场