Найти угол между точками и «рисование» фигур

Конкретней говоря, рисование объектов не в буквальном смысле. Суть в том, что есть заранее подготовленные фигуры (в данном примере: треугольник, квадрат, линия), а игрок с помощью мышки очерчивает контур фигуры в «воздухе». То бишь, для квадрата например, нужно «начертить» четыре линии и соответственно сделать четыре точки, останавливая мышку. Затем, следует проверка углов, на основе позиций точек. И если, углы вписываются в погрешность, иначе говоря, форма близка к оригиналу, тогда на сцену будет добавлена соответствующая фигура. Размер формы рассчитывается в зависимости, либо от одной из сторон, либо от диагонали.


Проще всего разобраться на примере, поэтому скрипт и проект по теме, можно скачать ниже. Здесь же мы, уточним некоторые моменты. Во-первых, скрипт заточен под камеру, у которой отрицательное значение по оси Z, а вращение равно нулю. То есть, по простому, подойдет для 2.5D платформера например. У всех создаваемых объектов Z будет равен 0. Это нужно учитывать, при тестировании.



Далее, формы. Их глубина должна определяться по оси Z. Поворот фигуры делается именно по этой оси, основная при этом ось Х. Допустим у нас есть вот такая модель:


Тут Х будет ориентировать плоскость, между двумя точками. Но нам надо чтобы разворачивались края формы.

Поэтому, надо вложить объект в пустышку и развернуть так, как нужно:


Вот теперь, всё как и должно быть.

Функция определения угла. Суть в том, что она работает с тремя точками, одна как центр, а между двумя другими вычисляется угол. Возможно кому-нибудь пригодится отдельно подобная функция:

float AngleRelativeToPoint(Vector3 posA, Vector3 posB, Vector3 point)
{
	var ab = point - posA;
	var ac = point - posB;
	float angle = Vector3.Angle(ab, ac);
	return angle;
}


Более наглядней:

Найти угол между точками и «рисование» фигур

Запрос будет выглядеть, так:

float angle = AngleRelativeToPoint(A, B, C);

Скачать скрипт и пример проекта:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.

Комментариев 3

Офлайн
ABZS09 7 января 2016
идея ОБАЛДЕННАЯ но почему не могу импортировать этот пакет в юнити ?
Офлайн
ABZS09 7 января 2016
всё норм сори тупанул имена пакетов одинаковые были )
Офлайн
Legion 25 января 2017
var CA = point - posA;
var CB = point - posB;
float angle = Vector3.Angle(CA, CB);
// или наоборот. AC/AB. Правильные имена залог долгой жизни кода.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика