最近在学习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