Линейная интерполяция, или часто используемое сокращение 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
Это называется линейной интерполяцией, потому что путь между двумя точками представляет собой прямую линию.
Проверь свои знания в нашем бесплатном ТЕСТЕ по Godot! Узнай, насколько хорошо ты его знаешь!
Вы можете анимировать свойства узла с помощью 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)