Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

积分方法

在游戏物理引擎中,积分方法用于将连续的力学方程离散化,是物体每个时间步内更新位置和速度。根据模拟的稳定性、精度和性能,选择不同的积分方法。

显式欧拉

显式欧拉(Explicit Euler)是最基础的积分方法,其核心思想是用当前的速度和加速度直接预测下一帧的位置和速度。公式如下:

其中,是速度,是位置,是加速度,是时间步长。

这种方法计算简单,开销低。当时间步长过大或者系统刚体较强时,容易出现不稳定,导致能量发散或者物体穿透。

隐式欧拉

隐式欧拉(Implicit / Backward Euler)与显式欧拉不同,它使用下一帧未知状态的加速度进行积分,从而提高数值稳定性。公式如下:

稳定性高,即使大时间步也不会发散。可以处理刚性系统,例如柔体、流体和复杂约束。计算量相对较大,需要求解线性方程组。在游戏物理引擎中,主要用柔体和流体模拟。刚体不用隐式欧拉,通常用西面半隐式欧拉方法,兼顾稳定性和性能。

半隐式欧拉

半隐式欧拉(Semi-implicit / Symplectic Euler)结合了显式和隐式的特点,是游戏物理中最常用的方法之一。

与隐式欧拉区别是,位置更新使用的是更新后的速度,而不是当前速度。相比显式欧拉更稳定,能量不易发散。计算量低,实时性能好,广泛用在刚体模拟、角色控制器、布料约束等。几乎所有主流游戏引擎的刚体子系统(包括 Bullet、Unity、Unreal)都使用半隐式欧拉作为默认的积分方法。

Verlet积分

Verlet 积分是基于位置的积分方法,不直接使用速度,而是利用当前和上一帧的位置及加速度更新下一帧位置。核心公式:

速度通过差分近似得到:

在物理引擎中,常用于粒子系统、布料模拟和柔体系统,适合PBD使用。

Runge-Kutta积分

Runge-Kutta 积分是一类高阶积分方法,通过多次估计加速度来提高数值精度。最常用的是二阶(RK2)和四阶(RK4)方法。 例如 RK4 方法:

其中是对不同时间点加速度的加权估计。精度高,震荡小。适合刚体、粒子系统、流体的精确模拟。计算量大,实时性能低。在物理引擎中,游戏中实时刚体很少使用,但在布料或粒子模拟的高精度子系统中可能用到。