算法、数据结构、与设计模式等在游戏开发中的运用 (三):插值(Interpolation)
作者:Compasslg(李涵威)
1. 什么是插值
插值(Interpolation)其实是数学中的一种常用概念,他是利用一种给定函数来连接点的方式。在数学中,插值被用于通过将离散的点数据连接成连续的曲线,来达到补全函数图像的目的。而在游戏开发中,插值则常常被运用于实现动画(Animation)和 移动(motion)。
所谓插值,代表的是在离散点之间通过插入连续的“估值”来连接他们的概念,而不同的插值方法可以达到不同的连接效果。常用的插值有线性插值,三角函数插值,样条插值等。不同的插值类型会造成在关键点附近图像的平滑程度有所区别,但总的而言,给定的数据点都一定会在图像上,这也是插值与数学中另一个常常被拿来讨论的概念 拟合(Curve Fitting) 的区别。
- 线性插值是直接利用直线来连接点
- 非线性插值产生的图像斜率变化得更为平滑
2. 如何实现和使用插值
插值的类型很多,但调用方式都大同小异,基本上都是给定数据点(起点和终点)以及当前自变量的值为参数,然后返回这个自变量所对应的插值。由于这篇博文主要讨论的是插值在游戏中的应用而非每个插值的实现原理,这里我只以最简单的线性插值和利用三角函数实现的非线性插值为例进行代码实现。
线性插值的实现非常简单,你可以把他想象成路程为(起点 - 终点),总时间为1的匀速直线运动。以下为范例代码:
float LinearInterpolate(float startVal, float endVal, float t){
return startVal + t * (endVal - startVal);
}
非线性插值的主要优势在于在比线性插值在数据点附近会更为平滑,实现例如在起点附近加速,终点附近减速的效果;但他同样是t从0到1,返回值从起点运动到终点。也就是说,只要对t稍加处理,只要两端的0和1不变,就可以达到这个平滑的效果。
我们都知道cos(t π \pi π)的函数图像在 t ∈ [ 0 , 1 ] t \in [0, 1] t∈[0,1]中y值是“平滑”的从1运动-1,在t = 0 附近加速变化,