Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
Інтерполяція¶
Інтерполяція є самою базовою операцією в графічному програмуванні. Буде добре ознайомитися з нею, щоб розширити свій кругозір розробника графіки.
Основна ідея полягає в тому, що ви хочете перейти від А до В. Значення t
, представляє стани між ними.
For example, if t
is 0, then the state is A. If t
is 1, then the state is B. Anything in-between is an interpolation.
Between two real (floating-point) numbers, an interpolation can be described as:
interpolation = A * (1 - t) + B * t
І часто спрощується до:
interpolation = A + (B - A) * t
The name of this type of interpolation, which transforms a value into another at constant speed is "linear". So, when you hear about Linear Interpolation, you know they are referring to this formula.
Є й інші види інтерполяції, які тут не будуть розглядатися. Тому, після цієї статті, рекомендується прочитати сторінку Безьє.
Векторна інтерполяція¶
Vector types (Vector2 and Vector3) can also be interpolated, they come with handy functions to do it Vector2.lerp() and Vector3.lerp().
Для кубічної інтерполяції існують також Vector2.cubic_interpolate() та Vector3.cubic_interpolate(), які виконують інтерполяцію в стилі Безьє.
Here is example pseudo-code for going from point A to B using interpolation:
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);
}
Він буде виробляти наступний рух:
Інтерполяція перетворень¶
It is also possible to interpolate whole transforms (make sure they have either uniform scale or, at least, the same non-uniform scale). For this, the function Transform3D.interpolate_with() can be used.
Ось приклад перетворення мавпочки з Позиції1 в Позицію2:
За допомогою наступного псевдокоду:
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);
}
Він буде виробляти наступний рух:
Плавний рух¶
Інтерполяція може бути використана для створення плавного руху, обертання та ін. Ось приклад кола, що переслідує мишку за допомогою плавного руху:
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);
}
Ось як це виглядає:
Це корисно для згладжування руху камери, союзників, що йдуть за вами (гарантуючи, що вони залишаються в межах певного діапазону), і багатьох інших поширених моделей гри.