Блог программиста
Математика Unity (Урок 15). Vector Отражение, расстояние, проекция и угол.
14.09.2013Математика Unity

Отражение

Функция отражения векторов в Unity (C#):
Vector3.Reflect(Vector3 inDirection, Vector3 inNormal)    //Отражение

Данная функция возвращает вектор, значение компонентов которого равны отражению вектора inDirection в плоскости с нормалью inNormal.
Пример:
using UnityEngine;
using System.Collections;

public class VectorReflect : MonoBehaviour {
	
	//Объеткт-"отражение"
	public Transform reflectObject;
	
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update ()
	{
		reflectObject.position = Vector3.Reflect(transform.position, Vector3.forward);
	}
}

В данном случае reflectObject будет «отражением» объекта, на котором висит скрипт. «Зеркалом» будет плоскость OXY (т. к. ось Z является нормалью данной плоскости).

Расстояние

Для нахождения расстояния между двумя точками в Unity есть функция:
Vector[X].Distance(Vector[X] a, Vector[X] b);

Использовать можно, например, для проверки возможности атаки.

Проекция

Функция проекции в Unity (C#):
Vector[X].Project(Vector[X] a, Vector[X] b);    //Проекция

Возвращает проекцию вектора a на вектор b.
Для чего может пригодиться?
Пример:
Летит самолёт скинуть груз на остров, мы знаем скорость самолёта, его координаты, знаем координаты острова. Нам нужно рассчитать время, через которое самолёт долетит.
Формула расчёта: время = расстояние/скорость. Скорость мы знаем, расстояние можем найти функцией Vector3.Distance, но... Самолёт выше острова и ему не требуется приземляться, чтобы скинут груз, поэтому рассчитанное время будет больше, чем на самом деле, т. к. будет учитываться высота. Для избежания этой проблемы можно использовать проекцию, в этом случае разницы в высоте не будет, и можно спокойно измерить расстояние, которое самолёт пролетит.

Угол

Функция для получения угла между векторами в Unity (C#):
Vector[X].Angle(Vector[X] a, Vector[X] b);    //Угол

Можно использовать для проверки, находится ли объект в поле видимости:
using UnityEngine;
using System.Collections;

public class VectorAngle : MonoBehaviour {
	
	//Угол обзора
	public float angle = 60;
	//Цель
	public Transform target;
	
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update ()
	{
		//Измеряем и сверяем угол между векторами
		if(Vector3.Angle(transform.forward, target.position - transform.position) <= angle)
		{
			Debug.Log("Visible!");
		}
	}
}


Конец.

16357