粒子系统 Particle System [49:38]

基于粒子系统的动画的主要过程:

  • 创建粒子
  • (难点)计算每个粒子受到的力
  • (难点)更新粒子的位置和速度
  • 移除不需要的粒子
  • 渲染粒子

粒子建模要考虑的力有:

  • 动力:重力、吸引力、电磁力、斥力
  • 阻力:摩擦力、粘滞力
  • 碰撞

✅ 模拟和渲染是两个独立的步骤[56:31]

粒子系统的更多应用场景:水、星系、鸟群、分子结构

📌 具体内容在Lecture 22

单个粒子系统

要解决的问题

  • 场景一:

已知:初始的 position x0,任意时刻的速度
求:某个时间刻的 position

  • 场景二:

已知:初始的 position X0,速度场,即在任意 position 上的速度 [06:40]
求:某时刻的 position

常微分方程

ODE = Ordinary Differential Equation

$$ \frac{dx}{dt} = \dot x = v(x, t) $$

已知\(\dot x\),求x

一阶常微分方程的特点:

  • 只涉及一阶微分
  • 不存在对其它变量的微分

欧拉方法

显式欧拉方法

根据上一时刻的位置、速度、加速度,根据定义求这一时刻的位置、速度、加速度。

$$ x^{t+\Delta t} = x^t + \Delta t \dot x^t \\
\dot x^{t+\Delta t} = \dot x^t + \Delta t \ddot x^t $$

❗ =右边的都是上一时刻的量。=左边的都是当前时刻的量。

💡 连续问题离散化,这种思想在课程中大量运用

❓ 问:为什么有第二个公式?如果是问题一,\(\dot x^t\)已知。如果是问题二,\(\dot x^t\)跟\(x^t\)有关,应该用不到\(\ddot x^t\)。而且\(\ddot x^t\)未知,用到了也没法算
答:因为问题描述那里说的不准确。已知的是点在某个时刻/位置上受到的力。力->加速度->速度->位置。

特点:

  • 简单,直观迭代。
  • 误差:用不同大小的步长\(\Delta t\)会得到不同的结果。步长越小越精确。
  • [1:18:54] 不稳定,且不稳定性与步长无关

👆 不管取多大的步长,最后一定会离开这个螺旋形的速度场。

✅ 误差不是严重的问题,因为可以通过减小步长来降低误差。但不稳定性是严重的问题,因为不管取什么步长,最后结果一定会离真实情况越来越远。
✅ 误差是一阶,步长再小也是一阶。
❓ 为什么有些情况下一定会不稳定,不稳定的本质原因是什么?

数值方法解微分方程的共性问题:

  1. 误差 VS 精度
  2. 不稳定, divergence

❓ 所以不稳定的来源是数值方法而不是微分方程?

💡 我的思考:
有点像花书里的"病态问题'。输入的微小改变导到输出的巨大变化。
也可以理解为函数在不同方向上的敏感度差别很大.

后面介绍的这些方法都是在对抗前面提到的不稳定性。

中点法 Midpoint Method

  1. 当前点为\(x(t)\),用欧拉方法计算下一个时间步的位置,称为a点

$$ x_a = x(t+\Delta t) = x(t) + \Delta t\cdot \dot x(t) $$

  1. 取\(x(t)\)与a的中点,称为b点或mid点

$$ x_{mid} = \frac{x(t) + x(t+\Delta t)}{2} \\ = x(t) + \frac{\Delta t}{2}\cdot \dot x(t) $$

  1. 取mid点位置的速度作为x(t)点的速度

$$ \dot x'(t) = \dot x_{mid}(t) $$

  1. 用\(\dot x'(t)\)再算一次欧拉,得到c点

$$ x_c = x(t+\Delta t) = x(t) + \Delta t\cdot \dot x'(t) $$

直观上看,很奇怪中点法更准确。展开后发现,中点法比原方法多了二次项函

$$ x(t+\Delta t) = x(t) + \Delta t\cdot \dot x(t) + \frac{(\Delta t)^2}{2}\ddot x(t) $$

Adaptive Step Size 自适应步长

  1. 定义初始的\(\Delta t\)为\(\Delta_0\)
  2. 用欧拉方法计算\(x^{t+\Delta_0}\)。即用\(\Delta_0\)算一遍欧拉方法

$$ X_T = x(t) + \Delta_0\cdot \dot x(t) $$ 3. 用欧拉方计算\(x^{t+2*\frac{1}{2}\Delta_0}\)。 即用\(2*\frac{1}{2}\Delta_0\)算两遍欧拉方法

$$ X_{mid} = x(t) + \frac{\Delta_0}{2} \cdot \dot x(t) \\ X_{T/2} = x_{mid} + \frac{\Delta_0}{2} \cdot \dot x_{mid} $$

  1. 比较\(X_T\)和\(X_{T/2}\),如果两者差别比较大,取后者,且将\(delta_0\)更新为\(\frac{1}{2}delta_0\)。

Implicit (隐式的) Euler Method

原问题:已知\(x^t\)和\(\dot x^t\),求 \(x^{t+\Delta t}\)和\(dot x^{t+\Delta t}\)

$$ x^{t+\Delta t} = x^t + \Delta t \dot x^t \\
\dot x^{t+\Delta t} = \dot x^t + \Delta t \ddot x^t $$

转化为新问题:

$$ x^{t+\Delta t} = x^t + \Delta t \dot x^{t+\Delta t} \\
\dot x^{t+\Delta t} = \dot x^t + \Delta t \ddot x^{t+\Delta t} $$

部分已知,部分未知,变成了一个优化问题。

我的思考:
显式和隐式,有种FK和IK的感觉。利用被依赖项计算依赖项,用数学公式。利用依赖项计算被依赖项,用优化问题近似。

优点:稳定。

❓ 隐式也是一阶,为什么比显式的稳定?

衡量各种欧拉方法的稳定性

指标:

  • 局部截断误差:每一步会产生多少误差
  • 全局积累误差

重要的不是指标的数值,而是这些指标与\(\Delta t\)的关系。

例如 Implicit Euler Method方法的稳定性为1阶。因为的它的局部截断误差是\(O(h^2)\),全局累积误差是O(h)。

O(h)的意思是,当步长减小到一半,那它的误差的期望也会减小到一半。
\(O(h^2)\)的意思是,当步长减小到一半,那它的误差的期望也会减小到1/4。

阶数越高越好。

Runge-kutta 方法

这是一类方法。
欧拉方法用于解线性ODE(常微分方程),而此类方法能够解非线性的ODE。

❓ 线性ODE和非线性的ODE什么区别?

其中Rk 4方法应用最广泛. 4代表4阶

已知:

$$ \frac{dy}{dt} = f(t, y) \\ y(t_0) = y_0 $$

RK 4解法:

$$ y_{n+1} = y_n + \frac{1}{6}h(k_1 + 2k_2 + 2k_3 + k_4) \\ t_{n+1} = t_n + h $$

说明: 这个公式里的h就是\(\Delta t\)
()中的四个加法项是基于中点法的中间结果,系数是精心设计的

🔎 数值分析课程会对这个算法有详细的解释

如果说中点法是泰勒展开的即视感,那么这里的公式是对泰勒展开更精确的模拟

问:为什么说RK系列擅长非线性呢?都是以欧拉方法为基础,在哪里引入的非线性的设计?
答:1阶是处理线性问题,高于1阶才能处理非线性。理解类似泰勒公式的近似截断。

Position Based / Verlet 积分

原理:只是通过调整位置使得能够满足某些限制,简化弹簧的物理推导过程
优点:快、简单
缺点:不是基于真实的物理过程可能会有错误


本文出自CaterpillarStudyGroup,转载请注明出处。
https://caterpillarstudygroup.github.io/GAMES101_mdbook/