简单介绍在游戏中模拟物理运动的三个常见方法。
欧拉方法
显式欧拉方法
在数学和计算机科学中,欧拉方法,命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解。它是一种解决数值常微分方程的最基本的一类显型方法(Explicit method)。
欧拉方法通过记录物体位置和速度,然后在每帧循环期间把速度累加到位置上,从而模拟物体的物理运动。
初中物理内容了,根据此刻速度和加速度,可计算出下一刻的速度和位移差。
\[ v_{n+1} = v_n + a_ndt \]
\[ p_{n+1} = p_n + v_ndt \]
改进的欧拉方法——半隐式欧拉
上述对运动的计算并不够准确——加速度的变化是持续的,而这里通过微分时间将加速度这一持续变化的量看作该微分时间短内的常量,除非微分时间段足够短,但这样又会导致效率太低。
这里使用一种改进的欧拉法,即使用上一刻的加速度计算下一刻的速度,并使用下一刻的速度计算出下一刻的位移。
\[ v_{n+1} = v_n + {\color{orange}a_n}dt \]
\[ p_{n+1} = p_n + {\color{orange}v_{n+1}}dt \]
下图解释为何改进后的公式更准确。使用此刻的速度计算下一刻的位移差显然与实际线路偏移较大,而使用下一刻的速度计算下一刻的位移差则更加准确(至少模拟路线有可能与正确路线相交而不是越偏越远)。
改进后的欧拉方法开销和原方法一样大,但却准确得多。
韦尔莱积分法
韦尔莱算法是一种用于求解牛顿运动方程的数值方法,被广泛应用于分子动力学模拟以及视频游戏中。韦尔莱算法的优点在于:数值稳定性比简单的欧拉方法高很多,并保持了物理系统中的时间可逆性与相空间体积元体积守恒的性质。
韦尔莱积分法记录了分子当前的位置和之前的位置,要获得分子的速度,只要用当前位置减去之前的位置就行了。
\[ p_{n+1} = p_n + (p_n - p_{n-1}) + a_ndt^2 \]
\(p_n - p_{n-1}\) 即隐含的速度。这一方法的好处便是不需要单独储存速度,分子的速度和加速度都是隐式处理,稳定且高效。
龙格-库塔法
在各种Runge-Kutta法当中有一个方法十分常用,以至于经常被称为“RK4”或者就是“Runge-Kutta法”。该方法主要是在已知方程导数和初值信息,利用计算机仿真时应用,省去求解微分方程的复杂过程。
找到一个不错的视频,解释一下公式的推导过程,具体原理我不知道也不想知道。4th-Order Runge Kutta Method for ODEs
总结
以上三种方法的复杂度分别为:
方法 | 复杂度 |
---|---|
欧拉法 | \(O(n)\) |
韦尔莱积分法 | \(O(n^2)\) |
龙格-库塔法 | \(O(n^4)\) |
复杂度越高的方法越准确,但是开销也大。对于大部分游戏和大部分玩家,半隐式欧拉已经足够了。
原文地址:https://www.cnblogs.com/liez/p/12009980.html