Как определить в каких точках LineRenderer пересекает Mesh объект? (Unity2D)
Не могу понять как определить в каких точках LineRenderer пересекает коллайдер Mesh объекта. LineRenderer отрисовываю так: по зажатию ЛКМ запоминаю точку старта (start_pos), после отпускания фиксирую конечную точку (end_pos) и рисую линию. С квадратом или кругом это легко реализовать с помощью Linecast с двух сторон, а если взять звезду, где точек может быть больше, это уже не сработает. Подскажите как это можно реализовать.
Ответы (1 шт):
Не найдя никаких решений от Unity (возможно не там искал) решил проблему с помощью математики - через поиск пересечения 2 векторов. В массиве мы должны хранить все вершины нашей фигуры (н-р звезды, у нее 10 вершин). Теперь к самому алгоритму.
У меня уже есть 1 вектор - это сама линия. 2 вектор мы получаем в цикле, проходя все точки нашей вершины. Сначала проверяем, пересекаются ли отрезки с помощью isCrossing, если пересекаются, то запускаем CrossingPoint, и на выходе получаем точку пересечения. За основу взял данный материал - http://grafika.me/node/237
public bool isCrossing(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4)
{
// Результат произведения находится в Vector3.z
Vector3 v1 = Vector3.Cross(new Vector3(p4.x - p3.x, p4.y - p3.y), new Vector3(p1.x - p3.x, p1.y - p3.y));
Vector3 v2 = Vector3.Cross(new Vector3(p4.x - p3.x, p4.y - p3.y), new Vector3(p2.x - p3.x, p2.y - p3.y));
Vector3 v3 = Vector3.Cross(new Vector3(p2.x - p1.x, p2.y - p1.y), new Vector3(p3.x - p1.x, p3.y - p1.y));
Vector3 v4 = Vector3.Cross(new Vector3(p2.x - p1.x, p2.y - p1.y), new Vector3(p4.x - p1.x, p4.y - p1.y));
if ((v1.z * v2.z <= 0) && (v3.z * v4.z <= 0))
return true;
else
return false;
}
public Vector2 CrossingPoint(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4)
{
// коэффициенты уравнения прямых для первого вектора
float A1 = p2.y - p1.y;
float B1 = p1.x - p2.x;
float C1 = p1.x * -A1 + p1.y * -B1;
// коэффициенты уравнения прямых для второго вектора
float A2 = p4.y - p3.y;
float B2 = p3.x - p4.x;
float C2 = p3.x * -A2 + p3.y * -B2;
//Находим определитель и воспомогательные определители системы
float d = (A1 * B2 - B1 * A2);
float dx = (-C1 * B2 + B1 * C2);
float dy = (-A1 * C2 + C1 * A2);
// по формуле Крамера находим точки пересечения (x = D / Dx)
return new Vector2(dx / d, dy / d);
}