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)
private float _t = 0.0f;
public override void _PhysicsProcess(double delta)
{
_t += (float)delta * 0.4f;
Marker2D a = GetNode<Marker2D>("A");
Marker2D b = GetNode<Marker2D>("B");
Sprite2D sprite = GetNode<Sprite2D>("Sprite2D");
sprite.Position = a.Position.Lerp(b.Position, _t);
}
Es wird die folgende Bewegung produzieren:
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:
Beim Benutzen des folgenden Pseudocodes:
var t = 0.0
func _physics_process(delta):
t += delta
$Monkey.transform = $Position1.transform.interpolate_with($Position2.transform, t)
private float _t = 0.0f;
public override void _PhysicsProcess(double delta)
{
_t += (float)delta;
Marker3D p1 = GetNode<Marker3D>("Position1");
Marker3D p2 = GetNode<Marker3D>("Position2");
CSGMesh3D monkey = GetNode<CSGMesh3D>("Monkey");
monkey.Transform = p1.Transform.InterpolateWith(p2.Transform, _t);
}
Und wieder wird die folgende Bewegung erzeugt:
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)
private const float FollowSpeed = 4.0f;
public override void _PhysicsProcess(double delta)
{
Vector2 mousePos = GetLocalMousePosition();
Sprite2D sprite = GetNode<Sprite2D>("Sprite2D");
sprite.Position = sprite.Position.Lerp(mousePos, (float)delta * FollowSpeed);
}
So sieht es aus:
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.