
Триангуляция по простому - разбиение фигуры на треугольники. Подобная операция может понадобиться при создании как нестандартной области выделения, так и при генерации моделей из кода.
Однако, как можно посмотреть в википедии - способов триангуляции существует несколько и один другого круче.
Но не беда прочитать о ней, хочется еще и не изобретать велосипед и взять что-то готовое. Так решил сделать и я, но попытки не увенчались успехом - алгоритм Делоне на 1000 строк кода часть треугольников зачем-то переворачивал, а ушная триангуляция прикрепленная к самой вики статье - на 7000 строк ужасно кривого кода, в котором просто невозможно разобраться. Это принудило меня к написанию алгоритма с нуля - встречайте, ушная триангуляция для Unity всего на 100 строк.
Как работает:
- Закиньте скрипт в папку с проектом
- В коде используйте Triangulation.GetResult для получения результата триангуляции. У метода есть две перегрузки
На вход в методе имеется два параметра:
- List<Vector2> points - точки многоугольника
Триангуляция - это работа в плоскости, потому вектора двумерные. Если внимательно посмотреть, то вариантов разбиения многоугольника на треугольники всегда несколько и в пространстве это бы возвращало разные фигуры. Потому даже не пытайтесь приводить это к трехмерному вектору, не повторяйте моих глупых ошибок :)
- bool clockwise - если true, то полученные точки обрабатываются по часовой, если false - против часовой.
На выходе возвращается:
- List<Vector2> - точки треугольников
Список по количеству всегда кратен 3, то есть через каждые три индекса описывается новый треугольник
Пример использования:
var result = Triangulation.GetResult(points, true);
В методе имеется 6 параметров, из которых три на вход:
- List<Vector3> points - точки многоугольника в пространстве
- bool clockwise - если true, то полученные точки обрабатываются по часовой, если false - против часовой.
- Vector3 upAxis - ось, перпендикулярная плоскости
Возвращает три параметра при помощи out. Все эти данные используются для создания меша в аналогичных полях:
- Vector3[] verticles
- int[] triangles
- Vector2[] uvcoords
Третья координата рассчитывается как "среднее значение по точкам на перпендикулярной плоскости".
Пример использования:
Vector3[] verticles; int[] triangles; Vector2[] uvcoords; Triangulation.GetResult(points, true, Vector3.up, out verticles, out triangles, out uvcoords);
В комментариях приложен доработанный код с более быстрым алгоритмом.
Смотрите также:
Комментарии
Круто! Штука весьма полезная, особенно для динамического создания различных эффектов. Жаль только текстурные координаты не генерирует
годно, весьма
Схоронил, однажды понадобилась и я забил именно из-за 7к кривых строк, которые еще нужно переписывать. Этот код гораздо легче портировать.
alexprey, с текстурными координатами вроде там все просто - эти же точки и есть текстурные координаты. Хотя могу ошибаться, меш еще с этим не текстурил
Проверил - не ошибся

public void Calculate()
{
//Add points
var points = new List<Vector3>();
for (int i = 0; i < transform.childCount; i++)
points.Add(transform.GetChild(i).localPosition);
//Triangulation
var result = Triangulation.GetResult(points.Select(v => new Vector2(v.x, v.z)).ToList(), true);
//Get Verticles
var verticles = result.Select(v => new Vector3(v.x, 0, v.y)).ToList();
//Get Triangles - тупо значения от 0 и ++
var triangles = new int[verticles.Count];
for (int i = 0; i < verticles.Count; i++)
triangles[i] = i;
//Create mesh
var mesh = new Mesh { vertices = verticles.ToArray(), triangles = triangles.ToArray(), uv = result.ToArray() };
mesh.RecalculateNormals();
//Add mesh in MeshFilter
var f = GetComponent<MeshFilter>();
if (f.sharedMesh != null)
DestroyImmediate(f.sharedMesh);
f.sharedMesh = mesh;
}
Естественно по нестандартной оси появилось бы еще немного работы с кватернионом
а что в юнити модели только из трианглов сделаны?
Extravert, это понятно что из полигонов
просто некоторые движки позволяют юзать не только трианглы и квадры
Обновлено.
Добавлена перегрузка, конвертирующая пространственные координаты по указанной нами оси и возвращающая (координаты точек + порядок рисования + текстурные координаты).
В общем для создания мешей удобней и быть не может.


<a href= http://mosros.flybb.ru/viewtopic.php?f=2&t=635>Процесс получения диплома стоматолога: реально ли это сделать быстро?</a>