Interpolation

Interpolation ist eine sehr grundlegende Operation in der Grafikprogrammierung. Es ist gut sich damit vertraut zu machen um Ihren Horizont als Grafikentwickler zu erweitern.

Die Grundidee ist, dass Sie von A nach B wechseln möchten. Ein Wert t repräsentiert die dazwischen liegenden Zustände.

Wenn beispielsweise t 0 ist, ist der Zustand A. Wenn t 1 ist, ist der Zustand B. Alles dazwischen ist eine * Interpolation *.

Zwischen zwei reellen (Gleitkomma-) Zahlen wird eine einfache Interpolation normalerweise beschrieben als:

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

Und oft vereinfacht zu:

interpolation = A + (B - A) * t

Der Name dieser Art der Interpolation, die mit konstanter Geschwindigkeit einen Wert in einen anderen umwandelt, lautet "linear". Wenn Sie also von Lineare Interpolation hören, wissen Sie, dass sie sich auf diese einfache Formel beziehen.

Es gibt andere Arten von Interpolationen, die hier nicht behandelt werden. Eine empfohlene Lektüre ist anschließend die Seite Bezier.

Vektorinterpolation

Vector types (Vector2 and Vector3) can also be interpolated, they come with handy functions to do it Vector2.linear_interpolate() and Vector3.linear_interpolate().

For cubic interpolation, there are also Vector2.cubic_interpolate() and Vector3.cubic_interpolate(), which do a Bezier style interpolation.

Hier ist ein einfacher Pseudocode für die Strecke von Punkt A nach Punkt B mithilfe von Interpolation:

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

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

Es wird die folgende Bewegung produzieren:

../../_images/interpolation_vector.gif

Interpolation transformieren

Es ist auch möglich ganze Transformationen zu interpolieren (stellen Sie sicher, dass sie entweder eine einheitliche Skalierung oder mindestens dieselbe ungleichmäßige Skalierung haben). Hierzu kann die Funktion Transform.interpolate_with () verwendet werden.

Hier ist ein Beispiel für die Umwandlung eines Affen von Position1 in Position2:

../../_images/interpolation_positions.png

Beim Benutzen des folgenden Pseudocodes:

var t = 0.0

func _physics_process(delta):
    t += delta

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

Und wieder wird die folgende Bewegung erzeugt:

../../_images/interpolation_monkey.gif

Glatte Bewegung

Interpolation kann verwendet werden um Bewegung, Drehung usw. zu glätten. Hier ist ein Beispiel für einen Kreis, der der Maus mit geglätteter Bewegung folgt:

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)

So sieht es aus:

../../_images/interpolation_follow.gif

Dies ist nützlich für sanfte Kamerabewegungen, Ihnen folgende Verbündete (um sicherzustellen, dass sie in einem bestimmten Bereich bleiben) und viele andere gängige Spielmuster.