Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

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 einen Übergang von A nach B gestalten möchten. Ein Wert t repräsentiert die dazwischen liegenden Zustände.

Wenn t zum Beispiel 0 ist, dann ist der Zustand A. Wenn t 1 ist, dann ist der Zustand B. Alles dazwischen ist eine Interpolation.

Eine Interpolation zwischen zwei reellen (Float-) Zahlen kann wie folgt beschrieben werden:

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

Und wird oft vereinfacht zu:

interpolation = A + (B - A) * t

Die Bezeichnung für diese Art der Interpolation, bei der ein Wert mit konstanter Geschwindigkeit in einen anderen umgewandelt wird, lautet "linear". Wenn Sie also von Linearer Interpolation hören, wissen Sie, dass diese Formel gemeint ist.

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

Vektorinterpolation

Vektortypen (Vector2 und Vector3) können ebenfalls interpoliert werden, sie verfügen über praktische Funktionen dafür Vector2.lerp() und Vector3.lerp().

Für kubische Interpolation gibt es auch Vector2.cubic_interpolate() und Vector3.cubic_interpolate(), die eine Bezier-Interpolation durchführen.

Hier ist ein Beispiel für Pseudocode, der mit Hilfe von Interpolation von Punkt A nach B verläuft:

var t = 0.0

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

    $Sprite2D.position = $A.position.lerp($B.position, t)

Es wird die folgende Bewegung produzieren:

../../_images/interpolation_vector.gif

Transformations-Interpolation

Es ist auch möglich, ganze Transformationen zu interpolieren (vergewissern Sie sich, dass sie entweder einen einheitlichen Maßstab oder zumindest denselben ungleichmäßigen Maßstab haben). Hierfür kann die Funktion Transform3D.interpolate_with() verwendet werden.

Hier ist ein Beispiel für die Transformation eines Affen von Position1 nach 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

Gleichmäßige Bewegung

Interpolation kann verwendet werden, um Bewegung, Rotation, usw. zu glätten. Hier ist ein Beispiel für einen Kreis, der mit gleichmäßiger Bewegung der Maus folgt:

const FOLLOW_SPEED = 4.0

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

    $Sprite2D.position = $Sprite2D.position.lerp(mouse_pos, delta * FOLLOW_SPEED)

So sieht es aus:

../../_images/interpolation_follow.gif

Dies ist nützlich, um Kamerabewegung zu glätten, Verbündete zu verfolgen (um sicherzustellen, dass sie innerhalb eines bestimmten Bereichs bleiben) und viele andere gängige Game Design Patterns.