Добавлен Devion,
опубликован
Триангуляция по простому - разбиение фигуры на треугольники. Подобная операция может понадобиться при создании как нестандартной области выделения, так и при генерации моделей из кода.
Однако, как можно посмотреть в википедии - способов триангуляции существует несколько и один другого круче.
Но не беда прочитать о ней, хочется еще и не изобретать велосипед и взять что-то готовое. Так решил сделать и я, но попытки не увенчались успехом - алгоритм Делоне на 1000 строк кода часть треугольников зачем-то переворачивал, а ушная триангуляция прикрепленная к самой вики статье - на 7000 строк ужасно кривого кода, в котором просто невозможно разобраться. Это принудило меня к написанию алгоритма с нуля - встречайте, ушная триангуляция для Unity всего на 100 строк.
Однако, как можно посмотреть в википедии - способов триангуляции существует несколько и один другого круче.
Но не беда прочитать о ней, хочется еще и не изобретать велосипед и взять что-то готовое. Так решил сделать и я, но попытки не увенчались успехом - алгоритм Делоне на 1000 строк кода часть треугольников зачем-то переворачивал, а ушная триангуляция прикрепленная к самой вики статье - на 7000 строк ужасно кривого кода, в котором просто невозможно разобраться. Это принудило меня к написанию алгоритма с нуля - встречайте, ушная триангуляция для Unity всего на 100 строк.
Как работает:
- Закиньте скрипт в папку с проектом
- В коде используйте Triangulation.GetResult для получения результата триангуляции. У метода есть две перегрузки
1 перегрузка (стандартная)
На вход в методе имеется два параметра:
- List<Vector2> points - точки многоугольника
- bool clockwise - если true, то полученные точки обрабатываются по часовой, если false - против часовой.
На выходе возвращается:
- List<Vector2> - точки треугольников
Пример использования:
var result = Triangulation.GetResult(points, true);
2 перегрузка (быстрая конвертация)
В методе имеется 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);
UPDATE:
В комментариях приложен доработанный код с более быстрым алгоритмом.
В комментариях приложен доработанный код с более быстрым алгоритмом.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Devion
создаю куб, стандартный юнити куб 1х1х1, потом что то такое :
Mesh mesh = gameObject.GetComponent<MeshFilter> ().mesh;
List<Vector3> listPoint = new List<Vector3> ();
for (int i = 0; i<mesh.vertices.Length; i++) {
listPoint.Add (mesh.vertices[i]);
}
Vector3[] verticles;
int[] triangles;
Vector2[] uvcoords;
print (verticles.Length + "|количестно новых точек триангуляции"); } вывод - 0
вопрос.. что не так... почему массив новых точек 0?
Отредактирован Devion
Триангуляция это операция совершаемая в плоскости. Точки пространства же порождают непредсказуемо разные фигуры. То есть для обработки трехмерного объекта вам надо поделить модель на соответствующие "плоскости", которые и будете обрабатывать алгоритмом.
А второе это то что вы подаете "фигуру в целом". А надо подавать ее контур. То есть вы просто туда сейчас закидываете набор точек, некоторые из которых там по два три раза фигурируют. Если вы посмотрите комментарии выше, то увидите что триангуляция строилась по "контуру многоугольника", который вы и должны подать в функцию. В результате точки пересекают фигуру несколько раз и все они засчитываются как невалидные.
Например вот такая фигура по ясным причинам не является обычным многоугольником:
Триангуляция так не работает, ибо ни по одному варианту из трех точек этой фигуры в итоге нельзя построить треугольник, ибо он не принадлежит фигуре и/или пересекает ее грани.
Но если бы точек было 6 и они бы шли по/против часовой, то это бы прокатило.
насколько я понял - он ничего не делает поскольку полигон и так прямоугольник.. возможно если добавить точку по середине между действующими точками поможет... но пока не получается.. как быть.?? возможно вообще такое?
Отредактирован Devion
Взять ваш треугольник, на самом широком ребре найти середину, разбить. И повторять так с каждой более мелкой фигурой, пока не достигнете необходимой вам глубины деления.
То есть.
Берете ваши вертексы из меша. Берете трианглес оттуда же, чтобы узнать в каком порядке вертексы располагаются. Согласно этому порядку берете первые три индекса из массива трианглс, далее по этим индексам обращаетесь к вертексам и кладете все в свой массив. И запускаете в алгоритм, который узнает между какими из трех точек наибольшее расстояние. Вычитаете вектора, делите полученный вектор пополам, прибавляете обратно. И вы узнали точку, образующую новые треугольники.
Отредактирован Devion
Вообще есть мысль написать полноценную статью по многоугольникам, так как последнее время пришлось много с ними работать - кое-что напридумывал, один алгоритм даже абсолютно уникальный, из головы :) Что думаете?