Блог программиста
Математика Unity (Урок 13). Vector Интерполяции.
08.09.2013Математика Unity

С этого урока будут рассматриваться вектора. Но так как в Unity три класса векторов (Vector2, Vector3, Vector4), условное обозначение «общего» класса: Vector[X].
Т.е. если функция есть не только в одном классе, то буду писать Vector[X].Функция.
В коде «общий» класс использоваться не будет.

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

Первая функция интерполяции векторов в Unity (C#):
Vector[X].Lerp(Vector[X] a, Vector[X] b, float t)    //Интерполяция

Данная функция получает промежуточное значение (интерполирует) между векторами a и b на основе t.
При t равное 0 (или меньше) вернёт a. При t равное 1 (или больше) вернёт b. При t равное 0.5 вернёт среднее значение между a и b.

Применение

Можно изменить пример из урока 9 (Mathf Интерполяции):

using UnityEngine;
using System.Collections;

public class VectorLerp : MonoBehaviour {

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

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

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

Вторая функция интерполяции векторов в Unity (C#):
Vector3.Slerp(Vector3 a, Vector3 b, float t);    //Сферическая интерполяция

Возвращает промежуточное значение между векторами a и b на основе t (t в промежутке от 0 до 1).
В отличии от Lerp эта функция возвращает значение не на прямой, а на дуге.
Для лучшего понимания рассмотрим пример:
Персонажу всё ещё надо из точки А попасть в точку Б, но у него на пути есть препятствие.

using UnityEngine;
using System.Collections;

public class VectorSLerp : MonoBehaviour {

    //Цель (пункт Б)
    public Transform target;
     
    //Стартовая позиция
    private Vector3 _startPos;
    //Конечная позиция
    private Vector3 _endPos;
    // Use this for initialization
    void Start ()
    {
        //Запоминаем начальную и конечную позиции
        _startPos = transform.position;
        _endPos = target.position;
    }
     
    // Update is called once per frame
    void Update ()
    {
        //Устанавливаем новую позицию
        transform.position = Vector3.Slerp(_startPos, _endPos, Time.time/60);
    }
}

В данном случае персонаж не будет идти на прямую пытаясь пройти сквозь стену, а пойдёт по дуге (за одну минуту).

На этом урок закончен.

17871