最近在学习
GAMES104课程的过程中,对其中物理仿真的部分有点兴趣,最近就开始学习一些物理仿真的相关内容。在这里我看的书是
基于物理的建模与动画这本书,这本书里对粒子仿真进行了详细介绍。如果希望学习刚体仿真的相关内容,
Game Physics in One Weekend Series是一个很好的开始,里面有很多代码示例,更重要的是书的配套代码提供了很好的练习,可以快速掌握实现代码。
本节主要是对模拟部分的基础进行总结,并假设读者有一定的线性代数的知识。
基本知识
创建物理模拟的动画(Physically Based Animation)的两个关键要素是模型(Model)与仿真(Simulation)。基于物理的模型规定了物理对模型运动规则的支配,仿真则是根据基于物理的模型,以及初始条件,来尝试判断物体行为如何随时间变化。为了达到实时的效果,模型与仿真方法的选择需要很多权衡。
对于物理仿真来说,最基本的定律就是牛顿三定律:
- 除非施加外力,物体将会保持原有运动状态
- 物体受到的力,等于质量乘以加速度
- 物体之间的力是相互作用的
由此可得到以下公式:
v=dx/dt
a=dv/dt
a=d(dx/dt)/dt=d2x/dt2
上述公式可以简写为:
v=x˙,a=v˙,a=x¨
反向来看,就可以积分得到:
v=∫adt
x=∫vdt
在实际应用中,我们将离散的时间步对上述公式求数值积分。
基本模拟循环
仿真运行的基本循环过程如下:
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
x[n+1]=x[n]+v[n]h
但是使用这个方法往往与正确结果差距甚远,因此需要改进积分方法。由于欧拉积分的位置落后于精确解的位置,因此改进为下述公式:
v[n+1]=v[n]+a[n]h
x[n+1]=x[n]+v[n+1]h
改进后的结果超前于精确解,因此继续提出:
v[n+1]=v[n]+a[n]h
x[n+1]=x[n]+(v[n]+v[n+1])/2h
改进后的结果可以得到更精确的解,但这只是初步优化,若希望得到更通用的方法,需要更复杂的计算,本书的后续章节会介绍这些。
空气中的三维运动
在三维空间中的质点运动,由于不同运动方向上互不干扰,因此可以由简单的一维情况进行扩展,分别在三个维度应用运动规律,求出实际的运动仿真结果。
而对空气中运动的物体来说,空气阻力是必须要考虑的因素。简化的空气阻力公式如下:
F=−dv
由这个公式可以得到物体加速度,用于仿真中。
对于风的仿真与此类似,可以用下述公式来近似风的作用力:
Fwind=dwwind
总结
本章主要介绍了一些基本的粒子仿真知识,可以由此做出一个简单的三维粒子仿真器。若希望有更复杂的行为,在后续章节将会一一介绍。
Powered by Quick LATEX