积分方法
在游戏物理引擎中,积分方法用于将连续的力学方程离散化,是物体每个时间步内更新位置和速度。根据模拟的稳定性、精度和性能,选择不同的积分方法。
显式欧拉
显式欧拉(Explicit Euler)是最基础的积分方法,其核心思想是用当前的速度和加速度直接预测下一帧的位置和速度。公式如下:
其中,是速度,是位置,是加速度,是时间步长。
这种方法计算简单,开销低。当时间步长过大或者系统刚体较强时,容易出现不稳定,导致能量发散或者物体穿透。
隐式欧拉
隐式欧拉(Implicit / Backward Euler)与显式欧拉不同,它使用下一帧未知状态的加速度进行积分,从而提高数值稳定性。公式如下:
稳定性高,即使大时间步也不会发散。可以处理刚性系统,例如柔体、流体和复杂约束。计算量相对较大,需要求解线性方程组。在游戏物理引擎中,主要用柔体和流体模拟。刚体不用隐式欧拉,通常用西面半隐式欧拉方法,兼顾稳定性和性能。
半隐式欧拉
半隐式欧拉(Semi-implicit / Symplectic Euler)结合了显式和隐式的特点,是游戏物理中最常用的方法之一。
与隐式欧拉区别是,位置更新使用的是更新后的速度,而不是当前速度。相比显式欧拉更稳定,能量不易发散。计算量低,实时性能好,广泛用在刚体模拟、角色控制器、布料约束等。几乎所有主流游戏引擎的刚体子系统(包括 Bullet、Unity、Unreal)都使用半隐式欧拉作为默认的积分方法。
Verlet积分
Verlet 积分是基于位置的积分方法,不直接使用速度,而是利用当前和上一帧的位置及加速度更新下一帧位置。核心公式:
速度通过差分近似得到:
在物理引擎中,常用于粒子系统、布料模拟和柔体系统,适合PBD使用。
Runge-Kutta积分
Runge-Kutta 积分是一类高阶积分方法,通过多次估计加速度来提高数值精度。最常用的是二阶(RK2)和四阶(RK4)方法。 例如 RK4 方法:
其中是对不同时间点加速度的加权估计。精度高,震荡小。适合刚体、粒子系统、流体的精确模拟。计算量大,实时性能低。在物理引擎中,游戏中实时刚体很少使用,但在布料或粒子模拟的高精度子系统中可能用到。