Lerp что это
Интерполяция — способ нахождения промежуточных значений.
Интерполяция 1
Первая функция интерполяции в Unity (C#):
Mathf.Lerp(float a, float b, float t) //Интерполяция
Данная функция получает промежуточное значение (интерполирует) между a и b на основе t.
При t равное 0 (или меньше) вернёт a. При t равное 1 (или больше) вернёт b. При t равное 0.5 вернёт среднее значение между a и b.
Функция считает по формуле: a + (b-a) * t, где 0 40803
Lerp функции в Unity (C#)
DailyDev
В этом посте я хочу рассказать про принцип работы Lerp функции в Unity. Данная функция невероятно полезна, так как именно с её помощью мы можем сделать плавное перемещение объекта. Как вы уже поняли, я буду использовать язык C#.
Немного теории
Итак, начнем с того, что данная функция может принадлежать различным классам или структурам, в зависимости от того с чем мы работаем. К примеру, Lerp функция присутствует в структуре Mathf которая отвечает за все математические функции представленные библиотекой UnityEngine. Функция принимает аргументы a, b и t каждый из которых имеет тип float, а возвращает функция число типа float. Параметр t принимает значения от 0 до 1.

Чтож, по определению, функция Mathf.Lerp() — это линейная интерполяция. Что это значит? По сути, это нахождение промежуточного значения, которое получается исходя из тех значений, которые мы передали функции. Покажу более наглядно.
Предположим, что мы передаем функции аргументы: a = 0, b = 1, t = 0.3f. Нашим начальным значением будет являться число a, а конечным b, иными словами, мы рассматриваем отрезок [a, b]. Что же делает параметр t? Этот параметр говорит нам какое число мы возьмем на этом промежутке. В данном случае это будет выглядеть так:

Иными словами, мы берем отрезок за 1 и возвращаем число которое делит его на отметке 0.3. Но как мы можем использовать это на практике? С помощью этой функции мы можем задать плавное перемещение объекта из одной точки в другую. Постепенно приближаясь к цели, объект замедляется.
Реализация
Рассмотрим использование этой функции на практике. Зададим движение кубу.
В данном случае мы будем использовать функцию структуры Vector3, так как мы работаем с transform.position.
Реализация движения куба:
private void Update()
Каждый кадр куб проходит от своего положения до цели примерно треть пути, и, так как начальное значение параметра a каждый кадр разное, то и получается, что куб замедляется приближаясь к цели.
Также существует и обратная функция InverseLerp которая в отличии от обычной функции, возвращает параметр t.
Заключение
В этом посте рассмотрел лишь основные способы использования данной функции, для более глубокого понимания я оставлю полезные ссылки.
- Документация от Unity — https://docs.unity3d.com/ScriptReference/Mathf.Lerp.html
- Видео с реализацией движения круга (язык Python) -https://www.youtube.com/watch?v=8uLVnM36XUc&t=335s
- Статья про линейную интерполяцию на википедии — https://en.wikipedia.org/wiki/Linear_interpolation
Коротко про Lerp
Линейная интерполяция (Linear interpolation, которую ещё называют ‘lerp’ или ‘mix’) — очень удобная функция при разработке игр, которая интерполирует в диапазоне [от..до] на основе параметра t, где t обычно находится в диапазоне [0..1].
JavaScript
function lerp ( start , end , t ) <
return start * ( 1 - t ) + end * t ;
console . log ( lerp ( 0 , 100 , 0.5 ) ) ; // 50
console . log ( lerp ( 20 , 80 , 0 ) ) ; // 20
console . log ( lerp ( 30 , 5 , 1 ) ) ; // 5
console . log ( lerp ( - 1 , 1 , 0.5 ) ) ; // 0
console . log ( lerp ( 0.5 , 1 , 0.5 ) ) ; // 0.75
К примеру, разделите время цикла на продолжительность цикла, и вы получите значение t между 0,0 и 1,0. Теперь вы можете отобразить это значение t в новый диапазон, например, lerp (20, 50, t) , чтобы постепенно увеличить радиус круга, или lerp (20, 10, t) , чтобы постепенно уменьшить толщину линии.
Другой пример: вы можете использовать линейную интерполяцию, чтобы плавно анимировать движение из одной точки в другую. Определите начальную точку (x1, y1) и конечную точку (x2, y2), затем интерполируйте измерения x и y отдельно, чтобы найти итоговую точку.
Или используйте линейную интерполяцию, чтобы прыгнуть к движущейся цели. Каждый кадр интерполировать от текущего значения к целевому значению с небольшим шагом t, к примеру, 0,05. Это всё равно, что сказать: приблизиться на 5% к цели за каждый кадр.
Пример посложнее — интерполирует один цвет (красный) в другой (синий). Чтобы сделать это, мы интерполируем (R, G, B) или (H, S, L) каналы цвета по отдельности, по аналогии с тем, как мы делали для 2D или 3D координат.
В комментариях заметили, что пример с телепортированием очень зависит от фреймрейта. Лучше учитывать deltaTime :
Что внутри функции lerp
в Unity 3d есть метод Vector3.Lerp Принимает 2 вектора и разницу по времени между кадрами, дельта тайм. На выходе вектор, напоминает что-то среднее по расстоянию, но не совсем, кто знает что там внутри происходит?
Отслеживать
80.9k 9 9 золотых знаков 78 78 серебряных знаков 134 134 бронзовых знака
задан 25 мая 2017 в 15:17
Serge Esmanovich Serge Esmanovich
2,315 16 16 серебряных знаков 34 34 бронзовых знака
25 мая 2017 в 15:19
Какая-то сложная математика
25 мая 2017 в 15:20
@Alex78191 ничего сложного, разность векторов скалярно умноженная на время. Вектор разности определяет направление движения, а скалярное произведение корректирует пройденное в этом направление расстояние с учетом времени. Графикой, увы, не получится заниматься без минимального понимания векторных операций.
