插值

插值是图形编程中一个非常基本的操作. 作为一名图形开发人员, 熟悉它有助于扩展您的视野.

基本思想是从A转换到B."t" 值是介于两者之间的状态.

举个例子, 如果 t 值为0, 那么状态是A. 如果 t 值是1, 状态是B. 任何介于两者之间的都是 插值.

在两个实数(浮点数)之间, 一个简单的插值通常描述为:

interpolation = A * (1 - t) + B * t

通常简化为:

interpolation = A + (B - A) * t

这类型的插值名字, 将一个值以 恒定速度 转换成另一个值 "线性". 当你听说线性插值时, 就知道他们是指这个简单的公式.

还有其他类型的插值, 这里将不做讨论. 建议之后阅读: 参考:` 贝塞尔 <文档_贝塞尔_及_曲线>` 页面.

向量插值

向量类型(: 参考:` 二维向量 <类_二维向量>` 和 : 参考:` 三维向量 <类_三维向量>`)也可以插值, 它们提供了方便的函数来实现这一点: 参考:二维向量. 线性_插值() <类_二维向量_方法_线性_插值> 和: 参考:三维向量. 线性_插值() <类_三维向量_方法_线性_插值>.

以及立方插值, 请参见: 参考:二维向量. 立方_插值() <类_二维向量_方法_线性_插值> 和: 参考:三维向量. 立方_插值() <类_三维向量_方法_线性_插值>, 使用: 参考:` 贝塞尔 <文档_贝塞尔_及_曲线>` 制作风格插值.

下面是使用插值从A点到B点的简单伪代码:

func _physics_process(delta):
    t += delta * 0.4

    $Sprite.position = $A.position.linear_interpolate($B.position, t)

它将产生以下运动:

../../_images/interpolation_vector.gif

变换插值

也可以对整个变换进行插值(确保它们有统一的缩放, 或者至少有相同的非统一缩放). 对此, 可以使用函数 Transform.interpolate_with() .

下面是将猴子从位置1转换为位置2的例子:

../../_images/interpolation_positions.png

使用以下伪代码:

var t = 0.0

func _physics_process(delta):
    t += delta

    $Monkey.transform = $Position1.transform.interpolate_with($Position2.transform, t)

又会产生下面的动作:

../../_images/interpolation_monkey.gif

平滑运动

插值可用于平滑运动, 旋转等. 下面是使用平滑运动跟随鼠标的圆圈的例子:

const FOLLOW_SPEED = 4.0

func _physics_process(delta):
    var mouse_pos = get_local_mouse_position()

    $Sprite.position = $Sprite.position.linear_interpolate(mouse_pos, delta * FOLLOW_SPEED)

如下:

../../_images/interpolation_follow.gif

这对平滑相机运动很有用, 队友在跟随你(确保他们保持在一定范围内), 以及许多其他常见的游戏模式.