Блог программиста
Математика Unity (Урок 9). Mathf Интерполяции.
12.07.2013Математика Unity

Интерполяция — способ нахождения промежуточных значений.

Интерполяция 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 <= t >= 1.

Применение

Для примера переместим персонажа из точки А в точку Б:

using UnityEngine;

public class LerpPos : MonoBehaviour {
		
	//Цель (пункт Б)
	public Transform target;
	
	//Стартовая позиция (ось Z)
	private float _startPos;
	//Конечная позиция (ось Z)
	private float _endPos;
	// Use this for initialization
	void Start ()
	{
		//Запоминаем начальную и конечную позиции
		_startPos = transform.position.z;
		_endPos = target.position.z;
	}
	
	// Update is called once per frame
	void Update ()
	{
		//Новая позиция по оси Z
		float _z = Mathf.Lerp(_startPos, _endPos, Time.time);
		//Устанавливаем новую позицию
		transform.position = new Vector3(transform.position.x, transform.position.y, _z);
	}
}

В данном случае персонаж доберётся из точки А в точку Б за одну секунду. Можно поделить Time.time на какое-нибудь число, чтобы персонаж двигался медленнее (например на 60, тогда он доберётся за одну минуту).

Интерполяция 2

Вторая функция интерполяции в Unity (C#):
Mathf.LerpAngle(float a, float b, float t);		//Интерполяция от -180 до 180

Возвращает промежуточное значение между a и b на основе t (t в промежутке от 0 до 1).
При этом приводит a и b к значениям в промежутке от -180 до 180, то есть если получено значение a = 300, b = 210 то функция приведёт их к a = -60, b = -150.

К практике

Используем данную функцию для плавного поворота персонажа:
using UnityEngine;

public class LerpRot : MonoBehaviour {
	
	//Угол поворота, к которому стремимся
	public float targetAngle = 90.0f;
        //Изначальный угол поворота
	private float startAngle;
	
	void Start()
	{
		//Запоминаем начальный угол
		startAngle = transform.rotation.y;
	}

        void Update()
	{
            //Получаем новый угол поворота по оси Y
            float angle = Mathf.LerpAngle(startAngle, targetAngle, Time.time);
            //Устанавливаем новый угол
            transform.eulerAngles = new Vector3(transform.rotation.x, angle, transform.rotation.z);
    }
}

Персонаж повернётся за 1 секунду.Можно поделить Time.time на какое-нибудь число, чтобы персонаж поворачивался медленнее (например на 60, тогда он повернётся за одну минуту).

Интерполяция 3

Третья функция интерполяции в Unity (C#):
Mathf.SmoothStep(float a, float b, float t)		//Интерполяция

Эта функция работает также как и Mathf.Lerp, но в начале ускоряется, а в конце замедляется.
Немного изменим первый пример из урока:
using UnityEngine;
using System.Collections;

public class SmoothStep : MonoBehaviour {

	//Цель (пункт Б)
	public Transform target;
	
	//Стартовая позиция (ось Z)
	private float _startPos;
	//Конечная позиция (ось Z)
	private float _endPos;
	// Use this for initialization
	void Start ()
	{
		//Запоминаем начальную и конечную позиции
		_startPos = transform.position.z;
		_endPos = target.position.z;
	}
	
	// Update is called once per frame
	void Update ()
	{
		//Новая позиция по оси Z
		float _z = Mathf.SmoothStep(_startPos, _endPos, Time.time/5);
		Debug.Log(_z);
		//Устанавливаем новую позицию
		transform.position = new Vector3(transform.position.x, transform.position.y, _z);
	}
}

Коротко, но надеюсь понятно.
P.S. Если что-то не понятно, пишите в комментариях.

22869