Loading [MathJax]/jax/output/HTML-CSS/jax.js

粒子系统 Particle System [49:38]

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

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

粒子建模要考虑的力有:

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

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

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

📌 具体内容在Lecture 22

单个粒子系统

要解决的问题

  • 场景一:

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

  • 场景二:

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

常微分方程

ODE = Ordinary Differential Equation

dxdt=˙x=v(x,t)

已知˙x,求x

一阶常微分方程的特点:

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

欧拉方法

显式欧拉方法

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

xt+Δt=xt+Δt˙xt˙xt+Δt=˙xt+Δt¨xt

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

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

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

特点:

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

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

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

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

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

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

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

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

中点法 Midpoint Method

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

xa=x(t+Δt)=x(t)+Δt˙x(t)

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

xmid=x(t)+x(t+Δt)2=x(t)+Δt2˙x(t)

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

˙x(t)=˙xmid(t)

  1. ˙x(t)再算一次欧拉,得到c点

xc=x(t+Δt)=x(t)+Δt˙x(t)

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

x(t+Δt)=x(t)+Δt˙x(t)+(Δt)22¨x(t)

Adaptive Step Size 自适应步长

  1. 定义初始的ΔtΔ0
  2. 用欧拉方法计算xt+Δ0。即用Δ0算一遍欧拉方法

XT=x(t)+Δ0˙x(t) 3. 用欧拉方计算xt+212Δ0。 即用212Δ0算两遍欧拉方法

Xmid=x(t)+Δ02˙x(t)XT/2=xmid+Δ02˙xmid

  1. 比较XTXT/2,如果两者差别比较大,取后者,且将delta0更新为12delta0

Implicit (隐式的) Euler Method

原问题:已知xt˙xt,求 xt+Δtdotxt+Δt

xt+Δt=xt+Δt˙xt˙xt+Δt=˙xt+Δt¨xt

转化为新问题:

xt+Δt=xt+Δt˙xt+Δt˙xt+Δt=˙xt+Δt¨xt+Δt

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

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

优点:稳定。

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

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

指标:

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

重要的不是指标的数值,而是这些指标与Δt的关系。

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

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

阶数越高越好。

Runge-kutta 方法

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

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

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

已知:

dydt=f(t,y)y(t0)=y0

RK 4解法:

yn+1=yn+16h(k1+2k2+2k3+k4)tn+1=tn+h

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

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

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

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

Position Based / Verlet 积分

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


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