Интерполяция в Godot

Линейная интерполяция, или часто используемое сокращение lerp, — это термин, который часто встречается в разработке игр. Если вы никогда с ним не сталкивались, он может казаться загадочным и сложным, но, как вы увидите в этом уроке, на самом деле это простая концепция с широким спектром применений в программировании игр.

Числовая интерполяция

Основная формула для линейной интерполяции выглядит так:

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

В этой формуле a и b представляют два значения, а t — это величина интерполяции, обычно выражаемая как значение между 0 (что возвращает a) и 1 (что возвращает b). Функция находит значение, находящееся на заданном расстоянии между двумя числами. Например:

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

Это называется линейной интерполяцией, потому что путь между двумя точками представляет собой прямую линию.

Вы можете анимировать свойства узла с помощью lerp(). Например, если разделить прошедшее время на желаемую продолжительность, вы получите значение от нуля до единицы, которое можно использовать для плавного изменения свойства с течением времени. Этот скрипт увеличивает спрайт в пять раз от его начального размера, одновременно уменьшая его прозрачность (используя 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 предоставляют методы linear_interpolate() для этого.

Например, чтобы найти вектор, который находится на полпути между векторами направления вперед и влево узла Spatial:

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

Следующий пример перемещает узел Sprite к позиции клика мыши. Каждый кадр узел перемещается на 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.linear_interpolate(target, 0.1)

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

1 + семь =

Прокрутить вверх