Chango的数学Shader世界(九)流体模拟-散度,梯度,二阶导与拉普拉斯
目的:
参考《GPU Gems》,在UE4中尝试重现2D流体模拟。
本节试图结合场论知识粗略理解Navier–Stokes equations。
参考:
《GPU Gems》
观察:
水中染料
流体制作MV
(《花样年华》 梁朝伟)
《GPU Gems》中的Navier–Stokes equations描述了一个流体的4部分运动:
平流项:烟随着速度场向上升
压力项:烟碰到顶灯受到顶部压力,离压力源近的烟分子被碰撞,并将这个压力传播出去。
扩散项:在烟上升的过程中,其分子会扩散,整个烟的形状不会保持不变地向上。
外力项:随意。如手挥过,烟受外力影响变化。
分析:
1.数学前提:
矢量微积分/场论,推荐IEEE成员-梁昌洪老师的公开课。b站上3Blue1Brown也有若干相关视频。
2.《GPU Gems》希望在2维平面进行水流流体模拟。
公式:
方程一:
方程二:
(注意:为方便,改写符号)
其中,u是x,y方向速度矢量场,t是时间,是流体密度(常数),P是压力数值场,k是动力粘度,F是外力。
在二维平面上,方程1可拆解为(x,y)两方向的速度(u1,u2)
方程二告诉我们,模拟的是一个无源场。
在我看来,方程一的核心思想,就是热传导。
方程一分4部分拆解:
平流项:
展开:
也就是说,u1,u2的加速度平流部分为:
注意,这里的速度符号u1,u2和位置符号x,y不能搞混。
对于像我这样的新手,算子的运算规则也要十分小心。
这里处于位置的算子又被称为平流算子(advection operator)。
那为什么这个方程就是平流呢?什么是平流?
我一开始也被搞糊涂了,直到看到实现的时候这个项的变化。
举个实在例子,设d为染料浓度,在这里我们假设d是一个属于(0,1)的数量场,0为纯白流体,1为黑色染料。水体在流动时,一些染料被跟着带走。那么就有
令d有x,y轴分量场d=d1+d2,则有
我们令速度场不随时间变化。
如果u1还不随x变化,那么u1就是一个常数,此时就是一个标准的一维平流方程(Advecation Equation)。
为了看出此方程对染料干了什么,我还是让u1随空间变化。
我尝试解这个偏微分方程,但失败了,转看wiki:
“The advection equation is not simple to solve numerically: the system is a hyperbolic partial differential equation, and interest typically centers on discontinuous "shock" solutions (which are notoriously difficult for numerical schemes to handle).
Even with one space dimension and a constant velocity field, the system remains difficult to simulate. ”
看来照目前情况咱没能力解方程。
但通过搜索可知,一种解是:
阿,尼马。绕了半天你就为得到这么一个结果,即当前帧的某位置p1浓度就是前一帧的在位置的浓度。
也就是速度场带着浓度平移(流动),看下图一眼便知:
那为什么你这个要用速度场带动速度场呢?这又是个什么玩意呢?你实现里也没有,我也不懂,wdnmd我被搞了。
由此,我们再次体会到平流算子这种叫法的正确性。平流只是连接速度场与被平流场的一个算子。
压力项:
一目了然,向着压力场(数值场)的负梯度方向调整。其压力场概念图类似这样:
扩散项:
。
拉普拉斯算子,是各轴二阶导数之和。离散地来看,二阶导数反应了该点与附近两点相差的平衡。
而加上二阶导数这一行为,从微观上表现了该点试图与周围点保持平衡。
热传导中的拉普拉斯方程就可以这样理解,3B1B在此视频的10分钟讲得很清楚。
像烟雾因为热力学原因要往周围扩散,或者是水流因为其他原因要扩散,用速度场希望“热传导平衡”来模拟,问题也不大。
外力项:
略。
结语
本篇参考《GPU Gems》,对书中采用的Navier–Stokes equations进行了粗略地分析,有了直观上的感受。接下来继续结合理论知识,最终推导出能适用于GPU编程的离散形式。
Chango的数学Shader世界(九)流体模拟-散度,梯度,二阶导与拉普拉斯相关推荐
- Chango的数学Shader世界(八)光盘模拟-各向异性,光栅衍射
目的: 参考<GPU Gems>,在UE4中尝试以重现光盘Shader,并对书中的方法进行解析,改进,批评. 参考: <GPU Gems> 观察: 我越来越意识到观察现实的重要 ...
- Chango的数学Shader世界(七)水波模拟-透明水面,菲涅尔(Fresnel)效应
目的: 解析,改进,批评一个国外免费透明水面Shader,进一步了解Shader背后的物理原理. 参考: 菲涅尔反射 分析: 我将原水面Shader一再简化,从中抽取最主要的部分,忽略细枝末节,并改掉 ...
- Chango的数学Shader世界(十四)细线间断,发光闪烁,TAA削弱处理
目的: 减少游戏中的细线因屏幕分辨率不足和算法采样不足问题,导致的间断,以及相对的自发光闪烁.解决了此问题也附带解决了因TAA导致的细线自发光微弱的问题. 对比视频:https://www.bilib ...
- Chango的数学Shader世界(十五)油画Shader-技术分析,教程纠错
目的: 实现油画后期Shader,探究教程中技术细节,指出错误. 参考: 搜索ue4 paint filter. UE4.21后整合自定义usf 观察: 油画的特点:成块的色块,但又保持清晰的边缘. ...
- SPH(光滑粒子流体动力学)流体模拟实现二:SPH算法(1)-数学原理
流体模拟(二) SPH算法的数学原理: 标量场和矢量场 如果空间区域内任意一点P,都有一个确定的数f(P),则称这个空间区域内确定了一个标量场,如果空间区域内任意一点P,都有一个确定的向量vF(P), ...
- 流体模拟引擎splishsplash 数学方法
参考资料: RWTH Aachen university(亚坦工业大学)的sph教程 文章目录 前言 粒子系统 基础数学 狄拉克函数 狄拉克恒等式 核函数W(x)的性质 通过核函数逼近(泰勒展开式) ...
- SPH(光滑粒子流体动力学)流体模拟实现七:屏幕空间流体渲染(SSF)
SPH(光滑粒子流体动力学)流体模拟实现七:屏幕空间流体渲染(SSF) 之前都是用的Marching Cube重建流体表面的方法.近来为了做对比实验,尝试了屏幕空间流体渲染的方法.发现屏幕空间的方法不 ...
- DirectX11进阶8_计算着色器(入门、流体模拟)
一.计算着色器:入门 GPU通常被设计为从一个位置或连续的位置读取并处理大量的内存数据(即流操作),而CPU则被设计为专门处理随机内存的访问. 由于顶点数据和像素数据可以分开处理,GPU架构使得它能够 ...
- 九年级数学解方程50道_初中数学公式中考知识点总结,初三数学上册,九年级数学上册...
初中数学公式中考知识点总结,初三数学上册,九年级数学上册 第二十一章 一元二次方程 知识点: 一元二次方程的解法 1.直接开平方法 利用平方根的定义直接开平方求一元二次方程的解的方法叫做直接开平方法, ...
最新文章
- 哈工大c语言编程题中国大学mooc第四周,中国大学MOOC哈工大C语言程序设计精髓第六周编程题答案.doc...
- R语言对用电负荷时间序列数据进行K-medoids聚类建模和GAM回归
- 设置防火墙规则,防止因为TCP第三次握手,系统自动返回包
- Java异步编程——深入源码分析FutureTask
- 修复Ubuntu 14.04中Chromium的Adobe Flash Player的问题
- 基于邮件推拉技术的数据库远程数据同步解决方案
- 补助系统C语言,领钱了!全国各省信息系统项目管理师证书技能提升补贴说明...
- 主动微波遥感和被动微波遥感
- python访问陌生人qq空间_自己的QQ空间怎么不让陌生人进入—设置访问权限
- 关于微信小程序认证问题
- matlab 大学物理,Matlab在大学物理课程教学中的应用
- easyx的使用(3)
- php7.1 phpize编译gd,centos 7 下用 phpize安装GD扩展库
- 江苏2020高中计算机学业水平,2020江苏高中学业水平测试时间安排表
- WLAN@Wi-Fi
- 基于Java的人员信息管理系统
- 金融数据分析(八)计算股票的超额收益率
- ipad投屏到海信电视通用方法分享
- U盘数据丢失怎么办?U盘数据丢失恢复方法?
- php实现excel表格下载