GAMES201学习笔记
第零章 课程数学基础
第一章 Lecture 2 拉格朗日视角(1)
第二章 Lecture 2 拉格朗日视角(2)
文章目录
前言:Lagrangian v.s. Eulerian: Two Views of Continuums
拉格朗日视角 vs. 欧拉视角
Lagrangian View: Sensors that move passively with the simulated material.
拉格朗日视角:想象在需要模拟的介质中加入很多随波逐流的“小船”,“小纸船”会跟随介质一起移动。采用拉格朗日粒子、三角网格。每个Sensor不断的检测自己的位置、速度等。
Eulerian View: Still sensors never moves.
欧拉视角:想象在介质中打了很多木桩,木桩不断的检测流过自己的介质的速度等物理量。
对比如下图。
欧拉视角一般不记录位置,拉格朗日需要记录质点自己的位置。
本系列第一章、第二章都会介绍拉格朗日视角下常用的物理模拟。
一、Mass-Spring System (弹簧质点模型)
拉格朗日视角的一个非常有用的模型:弹簧质点模型。
1.1 Mass-spring system的数学模型
本质上就是胡克定律 + 牛顿第二定律
1.2 Time integration (时间积分)
1.2.1 什么是时间积分
计算机中的模拟都是离散的,也因此出现FPS的概念,即帧每秒。
因此一般会取一个极短的时间 Δ t \Delta t Δt作为自变量,根据系统当前时刻 t t t,对系统的下一时刻 t + 1 t+1 t+1进行求解,即所谓的对时间积分(离散的积分可以理解为 Σ \Sigma Σ求和)。
1.2.2 实现时间积分的方法
- 前向欧拉:根据现有状态推测以后的状态。
- Symplectic Euler法:把速度换成 v t + 1 v_{t+1} vt+1,要比前向欧拉法要准确,常用。
- 后向欧拉,通常搭配牛顿方法进行求解。
1.3 用Symplectic Euler实现弹簧质点模型
三步:
- 计算新的速度
- 与地面进行碰撞
- 计算新的位置
为什么在中间第2步做碰撞?避免计算新位置导致陷入地底。
1.4 显示时间积分 v.s. 隐式时间积分
1.4.1 显示时间积分
前向欧拉、Symplectic欧拉、RK,RK2,RK3,RK4,etc…
- 未来仅由过去决定
- 实现简单
- 容易爆炸
- 对于硬(stiff)的材料不友好
关于爆炸, Δ t \Delta t Δt需要满足下面公式:
Δ t ≤ c m k ( c 1 ) \Delta t \leq c \sqrt {\frac{m}{k}} \quad (c ~ 1) Δt≤ckm(c 1)
粒子质量大的时候,允许的 Δ t \Delta t Δt较大; k k k较大的时候,允许的 Δ t \Delta t Δt较小。
1.3.2 隐式时间积分
后向欧拉,中点法,etc…
- 未来同时依赖于过去的状态和未来的状态
- 需要求解一个线性系统
- 实现复杂
- 每一步计算非常消耗且难以优化
- Numerical damping and locking,理解为系统锁住了,不更新了
1.4 Backward Eular (后向欧拉)
(4)抄过来变成(5)
在计算机图形学物理模拟中,有很多方法解线性系统(线性方程组),例如:
- Jacobi iterations, Jacobi迭代
- Gauss-Seidel iterations
- Conjugate gradients, 混合梯度
课程后续会介绍
整理&抽象
这就是一个完美的线性方程组了,本节课先介绍下Jacobi迭代。
1.5 Jacobi迭代
每次都更新一下x,使得每一次都满足矩阵的一行(即满足一个方程)。
并不是每次都会收敛。
详见第零章。
1.6 拓展:统一显隐表达
更快的方法。
二、Lagrangian fluid simulation: Smoothed particle hydrodynamics
拉格朗日流体模拟,SPH。
2.1 基础SPH公式
上述公式类似加权平均的过程。
- 原本提出用于天体物理
- 没有mesh,适合自由表面模拟:一盆水,水和空气接触的部分为自由表面。
- 非常直观,容易理解,理解成一小包的水。
2.2 WCSPH
接下来介绍一种常用的实现SPH的方法,WCSPH。
上述公式的解释:
- 公式右边:压强的梯度比上密度作为内力,重力作为外力;公式左边:速度对于时间的材料导数
- 压强用Bulk Modulus(体积模量)描述,当前的密度比上理想密度的gama次方减1
- EOS指的是压强和密度的关系
M. Becker, M Teschner (2007): “Weakly compressible SPH for free surface flows”
梯度的公式有些奇怪
注意:无法从上面的公式准确推出来,但一般都这么用。
2.3 编程
下面如何在计算机中进行模拟:3步
- 对每个粒子,计算它的密度;密度实际上是用粒子的每个质量估计出来的
- 对每个粒子,用刚刚梯度的公式,算下压强的梯度
- 然后更新速度、位置
可以想象每个粒子和周围的粒子之间有一个隐形的弹簧,这个弹簧不满足胡克定律,满足的是由SPH推出的一系列公式。
2.4 SPH的变种
- PBF在实时渲染里经常使用
M. Macklin and M. Muller (2013). “Position based fluids”
M. Ihmsen et al. (2014). “SPH fluids in computer graphics”
2.5 CFL Condition
在SPH中,显示时间积分也需要一个限制,用如下公式
2.6 加速SPH
介绍一个简单地、最有效的。
2.7 其他基于粒子的模拟方法
助教实现的C++的SPH
https://github.com/TroyZhai/CPP-Fluid-Particles
2.8 后续
如何从粒子生成想要的渲染效果?
一个经典方法:marching cubes,14中情况,实现比较复杂。
OpenVDB中有很多方法。
光栅化到背景网格,转换成SDF,然后做各种其他操作。