Games201学习笔记3:欧拉视角
学习教程来自:GAMES201:高级物理引擎实战指南2020
以下大部分图片来自教程PPT,仅作为笔记用于学习和分享,侵删
笔记内容大多为课程内容的翻译和转述,外加一些自己的理解,若有不正确的地方恳请大家交流和指正
笔记
1. 欧拉视角的计算方法概述
1.1 材料导数 Material Derivatives
物理量的变化 = 时间上的变化(欧拉视角下?) + 由于移动的变化
1.2 N-S方程 Navier–Stokes equations
速度的变化 = 压强 + 粘度(一般遗弃) + 重力
由于不可压缩性 速度的散度为0
1.3 求解
使用Operator splitting方法拆分
- 不考虑压强的重力的作用,先计算速度场的变化(欧拉空间下,每个节点固定不动,故每个time step后要重新计算当前节点的速度)
- 施加重力加速度(或其他外力)的作用,加速度为g
- 施加压强产生的加速度,并使得累加后,速度散度为0
2. Grid 网格方法计算
2.1 均匀网格下的存储
- cell-centered grids:都存在网格中心
- staggered grids:在不同的位置存x方向速度、y方向速度、压强,有利于计算有限元差分
2.2 网格中的插值
双线性插值 Bilinear interpolation:每个顶点的值x如图对应颜色的面积 累加
3. Advection 平流/对流阶段
3.1 Advection schemes
不同的方法在数值粘性viscosity、稳定性、性能、复杂程度做了取舍
Semi-Lagrangian advection:稳定,数值粘性高
MacCormack/BFECC:上边的升级版
BiMocq2
Particle advection (PIC/FLIP/APIC/PolyPIC):在欧拉网格的速度场中,把物理量记录在例子上
3.2 Semi-Lagrangian advection
假设速度场不变(之前提到advection阶段的先不考虑压强的重力的作用,所以速度场没有变化,这也是平移的含义),则当前位置x的速度 = 沿速度场到上一时间步的位置(backtrace),速度场中插值求得速度
沿直线回溯Forward Euler (“RK1”):
p -= dt * velocity(p) # 直接回溯
但假设会导致误差,因为速度场实际是会变化的,所以沿直线回溯不一定能回到之前的位置
显式中点法Explicit Midpoint (“RK2”):
p_mid = p - 0.5 * dt * velocity(p) # 先回溯一半,得到中点
p -= dt * velocity(p_mid) # 在中点的位置执行回溯
RK3:比RK2更加精确,但是差别不大
v1 = velocity(p) # 取得一系列速度
p1 = p - 0.5 * dt * v1
v2 = velocity(p1)
p2 = p - 0.75 * dt * v2
v3 = velocity(p2)
p -= dt * (2 / 9 * v1 + 1 / 3 * v2 + 4 / 9 * v3) # 加权平均
以上方法会在一段时间的运算后慢慢模糊,作为速度场可视作能量的衰减,流体变粘
下面这个方法会改善这种情况
3.3 MacCormack/BFECC
BFECC: Back and Forth Error Compensation and Correction
分别使用3.2的方法先后向前或则x*和x**,x error取1/2(x** - x),x final = x* + x error
其次,需要视情况裁剪掉一些错误值避免overshooting
source_pos = backtrace(I, dt)
min_val = sample_min(x, source_pos)
max_val = sample_max(x, source_pos)if new_x[I] < min_val or new_x[I] > max_val:new_x[I] = sample_bilinear(x, source_pos) # 遗弃之前得到的x final,重新赋值
4. Projection
求出一个标量场p,使速度场散度为0
4.1 求解过程(2维)
拉普拉斯算子(Laplace operator)
中心差分法近似拉普拉斯(这里使用了2维的five point stencil?)先求梯度再求散度
近似u的散度(流入和流出)
整个线性系统(线性方程组),其中A是稀疏矩阵
4.2 Solving large-scale linear systems 解大规模线性方程组
解Ax=b 将速度场迭代到无散度
4.2.1 一些解法
Direct solvers(直接求解,如PARDISO):适用于scaler不是特别大的
Iterative solvers(迭代求解):Gauss-Seidel、(Damped) Jacobi、(Preconditioned) Krylov-subspace solvers (e.g., conjugate gradients)
以上solver可以进行组合使用
4.2.2 A(如何存储)
稀疏的(sparse)、对称正定(SPD symmetric & positive-definite)的
存储方法:
- dense matrix:直接存,规模不大时
- sparse matrix:用稀疏矩阵的方式存,CSR、COO等
- Matrix-free:不存,究极解法
4.2.3 Krylov-subspace solvers
其中一个变形为共轭梯度法 conjugate gradients (CG)
一些其他在图形学中不常用的方法:CR、GMRES、BiCGStab等
一本关于共轭梯度教程的书:An Introduction to the Conjugate Gradient Method Without the Agonizing Pain5 by Jonathan Richard Shewchuk.
conjugate gradients算法过程:迭代更新x直到r足够小
4.2.4 Preconditioning 使解更快
condition number κ:一个评价收敛速度的值,越小收敛越快,等于SPD的最大特征值(max eigenvalue)/最小特征值
如何使得condition number变小:找到一个近似的矩阵M与A相近,且容易求逆(对角阵)。左右同乘M逆,此时condition number可能会变小
4.2.5 Multigrid methods
Multigrid preconditioned conjugate gradients (MGPCG)求解Poisson’s equation
5. 一些改进的Paper
- Restoring the missing vorticity inadvection-projection fluid solvers:修正速度场在经过advection和projection之后能量的损失,降低了流体的数值粘性
- An advection-reflection solver for detail-preserving fluid simulation:另一种降低能量损失的方法
5.1 一些扩展方向
- 从2D到3D模拟
- 精确的边界以及流体固体的耦合
- Two phase fluid simulation
- 处理自由表面,level sets方法
- 处理涡量守恒
Games201学习笔记3:欧拉视角相关推荐
- 【学习笔记】欧拉函数
0.概述 一个函数.只有毒瘤出题人会用到它. 1.定义 φ(n)=∑x=1n[gcd(x,n)=1]\varphi(n)=\sum_{x=1}^{n}\big[\gcd(x,n)=1\big] φ( ...
- Games201学习笔记2:拉格朗日视角2
学习教程来自:GAMES201:高级物理引擎实战指南2020 以下大部分图片来自教程PPT,仅作为笔记用于学习和分享,侵删 笔记内容大多为课程内容的翻译和转述,外加一些自己的理解,若有不正确的地方恳请 ...
- 对物质导数与拉格朗日视角、欧拉视角之间的关系的粗浅理解
之前有一个没怎么注意到的疑问,在拉格朗日视角和欧拉视角中,分别有不同形式的N-S方程(或者叫动量方程),拉格朗日视角中是这样的: DuDt=−1ρ∇+ν∇⋅∇u+g(1)\frac{\mathrm{D ...
- Polyworks脚本开发学习笔记(二二)-调取视角用脚本自动生成报告
Polyworks脚本开发学习笔记(二二)-调取视角用脚本自动生成报告 Polyworks中,3D场景的视图可用标准视角及等轴侧视角.项目视角等方式调用,也可以用txt格式保存下来调用,如果以脚本的形 ...
- Unity 布料仿真笔记2 欧拉积分 Verlet积分分析
前言 An object at rest remains at rest, unless acted upon by an exterior force. An object in motion re ...
- 小程序轻量级开发框架Flask-SQLalchemy 学习笔记(贼拉好用)
Flask-SQLalchemy 学习笔记 sqlalchemy带条件查询 查询关键词: 查询范围: all()查询所有 first()返回第一个 one()查询唯一一个 slice(1,5)切片 o ...
- 【GAMES201学习笔记】MLS-MPM公式基础
1. 符号记法 1.1 标量 标量 用非加粗的小写字母或者大写字母表示. 符 号 含 义 mim_imi 第 iii 个网格的质量 Vp0V^0_pVp0 第 ppp 个粒子在第 000 个时间步 ...
- Games201学习笔记5:线性弹性有限元
学习教程来自:GAMES201:高级物理引擎实战指南2020 以下大部分图片来自教程PPT,仅作为笔记用于学习和分享,侵删 笔记内容大多为课程内容的翻译和转述,外加一些自己的理解,若有不正确的地方恳请 ...
- 【GAMES201学习笔记】00 - Taichi三维可视化 - Taichi_THREE
1. 开始之前 1.1 学习资源链接 Taichi_THREE 原作者的教程视频: https://www.bilibili.com/video/av628129594 github 链接: http ...
最新文章
- iOS微信支付集成 SDK1 7 5
- Python 之 matplotlib (十六)Animation动画
- 视频监控行业解决方案
- VC++下Window剪贴板的操作
- Java Mail+Thymeleaf模板引擎实现发送HTML格式邮件
- 瑞芯微RK2918、全志A10和AML8726-M3方案ICS系统运行效果对比
- Ubuntu 18.04 软件源修改成国内源
- FastReport.Net使用:[17]线(Line)控件使用
- 风云2号卫星云图_世界气象日话说54所与风云气象卫星的“不解之缘”
- 计算机三级网络技术 = =
- 硬核 | 用Python给女朋友送一颗彩蛋
- 1977-1998全国历年高考状元现状
- 1192: 删除记录(结构体专题)
- springboot2+shiro 重写filter接口来调用自定义ream的登录校验方式
- 我看三十而立的80后
- 开发简单 web 服务程序 cloudgo
- private和protected的区别_学习笔记
- AI开放平台-科大讯飞
- ROS入门七 机器人建模——URDF
- ‘蓝桥杯’ | 篮球队组队问题 | 组合排序实现
热门文章
- OSChina 周六乱弹 —— 女友是啥子哟?生命的最大负载?
- 计算机课的教学点评,计算机基础学科的教学评价有效方法
- 第2关:求2个数的和
- HTML页面下雪特效
- 鸿蒙开发起步系列 | 环境搭建、HarmonyOS应用开发及智能硬件开发
- 数学建模笔记(十五):多元统计分析及R语言建模(判别分析、聚类分析、主成分分析、因子分析,含数据代码注释,均可供运行)
- svg+js浴火凤凰js特效
- 《趣弹幕-滚动LED显示屏-隐私协议》
- Maven打包跳过单元测试
- P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows