最近在学习GAMES104课程的过程中,对其中物理仿真的部分有点兴趣,最近就开始学习一些物理仿真的相关内容。在这里我看的书是基于物理的建模与动画这本书,这本书里对粒子仿真进行了详细介绍。如果希望学习刚体仿真的相关内容,Game Physics in One Weekend Series是一个很好的开始,里面有很多代码示例,更重要的是书的配套代码提供了很好的练习,可以快速掌握实现代码。
本节主要是对模拟部分的基础进行总结,并假设读者有一定的线性代数的知识。

基本知识

创建物理模拟的动画(Physically Based Animation)的两个关键要素是模型(Model)与仿真(Simulation)。基于物理的模型规定了物理对模型运动规则的支配,仿真则是根据基于物理的模型,以及初始条件,来尝试判断物体行为如何随时间变化。为了达到实时的效果,模型与仿真方法的选择需要很多权衡。
对于物理仿真来说,最基本的定律就是牛顿三定律:

  1. 除非施加外力,物体将会保持原有运动状态
  2. 物体受到的力,等于质量乘以加速度
  3. 物体之间的力是相互作用的
    由此可得到以下公式:

v=dx/dt\mathbf{v} = \mathrm{d}\mathbf{x} / \mathrm{d}t

a=dv/dt\mathbf{a} = \mathrm{d}\mathbf{v} / \mathrm{d}t

a=d(dx/dt)/dt=d2x/dt2\mathbf{a} = \mathrm{d}(\mathrm{d}\mathbf{x} / \mathrm{d}t) / \mathrm{d}t = \mathrm{d}^2\mathbf{x} / \mathrm{d}t^2

上述公式可以简写为:

v=x˙,a=v˙,a=x¨\mathbf{v} = \mathbf{\dot{x}}, \mathbf{a} = \mathbf{\dot{v}}, \mathbf{a} = \mathbf{\ddot{x}}

反向来看,就可以积分得到:

v=adt\mathbf{v} = \int_{}^{} \mathbf{a} \mathrm{d}t

x=vdt\mathbf{x} = \int_{}^{} \mathbf{v} \mathrm{d}t

在实际应用中,我们将离散的时间步对上述公式求数值积分。

基本模拟循环

仿真运行的基本循环过程如下:

t = 0
while t < t_max
    get current force
    calculate acceleration
    get new state
    update state
    t = t + h

数值近似方法

最简单直接的方法就是使用欧拉积分:

v[n+1]=v[n]+a[n]h\mathbf{v}^{[n+1]} = \mathbf{v}^{[n]} + \mathbf{a}^{[n]}h

x[n+1]=x[n]+v[n]h\mathbf{x}^{[n+1]} = \mathbf{x}^{[n]} + \mathbf{v}^{[n]}h

但是使用这个方法往往与正确结果差距甚远,因此需要改进积分方法。由于欧拉积分的位置落后于精确解的位置,因此改进为下述公式:

v[n+1]=v[n]+a[n]h\mathbf{v}^{[n+1]} = \mathbf{v}^{[n]} + \mathbf{a}^{[n]}h

x[n+1]=x[n]+v[n+1]h\mathbf{x}^{[n+1]} = \mathbf{x}^{[n]} + \mathbf{v}^{[n+1]}h

改进后的结果超前于精确解,因此继续提出:

v[n+1]=v[n]+a[n]h\mathbf{v}^{[n+1]} = \mathbf{v}^{[n]} + \mathbf{a}^{[n]}h

x[n+1]=x[n]+(v[n]+v[n+1])/2h\mathbf{x}^{[n+1]} = \mathbf{x}^{[n]} + (\mathbf{v}^{[n]} + \mathbf{v}^{[n+1]})/2 h

改进后的结果可以得到更精确的解,但这只是初步优化,若希望得到更通用的方法,需要更复杂的计算,本书的后续章节会介绍这些。

空气中的三维运动

在三维空间中的质点运动,由于不同运动方向上互不干扰,因此可以由简单的一维情况进行扩展,分别在三个维度应用运动规律,求出实际的运动仿真结果。
而对空气中运动的物体来说,空气阻力是必须要考虑的因素。简化的空气阻力公式如下:

F=dv\mathbf{F} = -d\mathbf{v}

由这个公式可以得到物体加速度,用于仿真中。
对于风的仿真与此类似,可以用下述公式来近似风的作用力:

Fwind=dwwind\mathbf{F}_{wind} = d\mathbf{w}_{wind}

总结

本章主要介绍了一些基本的粒子仿真知识,可以由此做出一个简单的三维粒子仿真器。若希望有更复杂的行为,在后续章节将会一一介绍。

Powered by Quick LaTeX\LaTeX