補間

線形補間(リニア・インターポレーション)、あるいはその略称であるlerpは、ゲーム開発の現場で頻繁に用いられる概念です。初めて耳にする方には難解で技術的に聞こえてしまうかもしれませんが、このチュートリアルを通じてご覧いただけるように、実際には理解しやすいシンプルな原理でありながら、ゲームプログラミングにおいて幅広く応用可能な強力なツールなのです。

数値補間処理

線形補間の基本式は以下のようになります。

func lerp(a, b, t):
    return (1 - t) * a + t * b

この数式において、ab は2つの値を表し、t は補間量を示します。通常、0(結果はa)から1(結果はb)までの範囲で指定します。この関数は、指定された比率に基づいて2つの値の間に適切な中間値を求めます。具体例を挙げると以下となります。

x = lerp(0, 1, 0.75)  # x is 0.75
x = lerp(0, 100, 0.5)  # x is 50
x = lerp(10, 75, 0.3)  # x is 29.5
x = lerp(30, 2, 0.75)  # x is 9

この手法が「線形補間」と呼ばれる理由は、2点間の経路が直線であるためです。

ノードのプロパティをlerp()でアニメーション化できます。例えば、経過時間を希望する持続時間で割ると、0から1の間の値が得られ、これを使ってプロパティを滑らかに変化させることができます。このスクリプトでは、スプライトを開始サイズの5倍まで拡大しつつ、2秒間かけて徐々にフェードアウトさせます(modulate.aを使用して)。

extends Sprite2D

var time = 0
var duration = 2  # length of the effect

func _process(delta):
    if time < duration:
        time += delta
        modulate.a = lerp(1, 0, time / duration)
        scale = Vector2.ONE * lerp(1, 5, time / duration)

ベクトル補間

また、ベクトル間での補間もできます。Vector2 および Vector3 はどちらも lerp() メソッドを提供しています。

例:Node3Dノードの前方方向ベクトルと左方向ベクトルのちょうど中間に位置するベクターを取得するには。

var forward = -transform.basis.z
var left = transform.basis.x
var forward_left = forward.lerp(left, 0.5)

以下の例では、スプライトノードをマウスクリック位置に移動させています。各フレームごとにノードは目標位置まで10%ずつ近づきます。これにより、オブジェクトが近づくにつれて速度が徐々に減速する「接近」効果が得られます。

extends Sprite2D

var target

func _input(event):
    if event is InputEventMouseButton and event.pressed:
        target = event.position

func _process(delta):
    if target:
        position = position.lerp(target, 0.1)

補間のより高度な応用については、Tween を参照してください。