Генератор UV координат. Пара стандартных алгоритмов.

Опишу чуток стандартные алгоритмы из каких они частей состоят, чтобы последующие посты были может немножко понятнее.

Автоматический генератор UV координат состоит из следующих частей.

1. Определение топологии объекта. (Соседство разнообразное tiangle->edge->triangle, point->triangle, triangle->point).
2. Определение линий разреза. (edge, в который UV координаты имеют разрыв.) Обычно получаются несколько кусков, но можно написать алгоритм когда получается единственный кусок всегда.
3. Первоначальная раскладка UV координат. (Тут главное чтобы треугольники не пересекались в uv пространстве.)
4. Сдвиг вершин в uv пространстве некоторый, для более равномерного распределения текселей по треугольникам.
5. Паковка получившихся кусков на один общий прямоугольник UV.

Вот для примера как это делается в алгоритме Least Squares Conformal Maps (LSCM)

2. Определение линий разреза.
Генерируется tangent space для модели.
Берётся точка на модели, для неё uv выставляется произвольно.

Потом циклически пока есть точки для всех точек примыкающих к этой рассчитывается du, dv на основе tangent space в окружающих треугольниках.
Там где получились большие разрывы du,dv, там и делается разрез по edge.

Здесь очень большой вариант выбора эмпирических условий.

3. Первоначальная раскладка.
Из топологии известно что, любую поверхность граница которой есть линия, можно представить в виде диска на плоскости.
И в LSCM алгоритме действительно преобразуют к плоской поверхности, граница которой есть круг.

Первоначальную раскладку делают по разному.
а. Например проекцией на плоскость (ограничения тут понятные).
б. Проекцией на сферу.
в. Както по другому.

Здесь и кроется основной недостаток такого подхода и источник многочисленных багов.
Треугольники могут пересекаться!

4. Сдвиг вершин для равномерного распределения текселей по треугольникам.
Сдесь алгоритм LSCM старается сохранить неизменными углы у треугольника,
но при этом не обращает никакого внимания на их размеры.
Для этого генерируется огроменное количество линейных выражений, и ищется минимум.

То, что размеры треугольников не пытаются сохраняться – это довольно существенный минус, потому как треугольники на внешней границе могут быть во много раз больше треугольников на внутренней. Впрочем от этого недостатка можно избавиться, изначально разбивая на более мелкие куски при определении линии разреза.

Плюс этого алгоритма – в большинстве случаев получается отличная раскладка.
Минус – достаточно часто вместо отличной раскладки на экране видим мусор из пересекающихся треугольников, что недопустимо для автоматического алгоритма.

Ещё опишу алгоритм автогенерации из ZBrush (Там наверняка несколько их).

2. Определение линий разреза.
Предполагается что топология поверхности – это четырёхугольная сетка.
(Если это условие не выполняется, то всегда 2 соседних треугольника будут элементом четырёхугольной сетки и алгоритм начнёт на мелкие кусочки бить модельку.)
Берётся кусок этой сетки, и увеличивается до тех пор, пока его можно планарно спроецировать без артефактов и треугольники не сильно искажаются.

3. Первоначальная раскладка получается тривиальной.
4. Равномерное распределение не происходит.

Плюс этого алгоритма – он всегда выдаст корректную раскладку.
Минус – кусочков на которые разбита модель может быть не просто много, а очень много!

PS: Про свой алгоритм пока писать не буду, потому как недоделан он ещё.

  • Aliot

    Еще есть ABF(ABF++), HLSCM(просто быстрее), DPBF.
    Мы юзаем ABF++ и еще один, свой, довольно примитивный (для разных случаев – юзается разный).

    Но если ты напишешь свой (хороший) наша компания готова денег заплатить за него!!!
    Как за библиотеку, так и за stand-alone tool с простыми форматами in/out.
    Если случайно это пишется не для души, а как работа в компании – то и компании может быть интересно, думаю!

  • Aliot

    P.S. Когда abf++ не сработывает – используется LSCM с проверкой самопересечения.

  • IronPeter

    Кстати да. Удивляет, что нет грамотного тематического middleware. Казалось бы – интерфейса на 10 строчек. А скрытых ништяков внутри может быть сильно много.

  • dyh

    Я похоже не до конца понимаю что делает именно *автоматический* генератор UV координат… Это как, совсем без вмешательства? Или пользователь все-таки влияет на процесс (как например, в modo http://www.luxology.com/community/tutorials/character/uv_unwrap)? С zbrush не знаком…

  • Aliot

    Кстати.
    Можешь grpahite (GrpahiteOne) посмотреть. Там все есть – хотя он и ужасный.

  • Balmer

    “ABF(ABF++), HLSCM(просто быстрее), DPBF” – спасибо за названия.

  • Balmer

    dyh – автоматический генератор полностью автоматически делает раскладку по UV без вмешательства человека.

  • shodan