Работа с UV через API Blender

Доступ к активной развертке:

Доступ к развертке по имени:

Один полигон меша всегда соответствует одному полигону на развертке. Однако для ребер и вертексов это не так. Ребро меша, если по нему проходит шов, будет разделено в развертке на два отдельных ребра. Вертекс меша будет разделен на столько точек в развертке, сколько швов его пересекает. Поэтому для того, чтобы точно соотносить точки развертки и меша используются так называемые «мешлупы» (MeshLoop).

По сути, «мешлуп» это логическая комбинация «ребро + вертекс». Основное отличие от обычных ребер и вертексов в том, что если два прилегающих полигона имеют одно общее ребро и два общих вертекса, «мешлупы» у каждого из них свои. Так у отдельного четырехугольного полигона (квада) 4 вертекса, 4 ребра и 4 «мешлупа». А у дефолтного куба 8 вертексов, 12 ребер и 24 «мешлупа» — 6 полигонов в каждом из которых по 4 «мешлупа».

Для того, чтобы различать «мешлупы» на меше и в развертке, они по-разному типизируются. MeshLoop — для меша, MeshUVLoop — для развертки.

Одной из особенностей API Blender является то, что данные «мешлупов» доступны только в объектном режиме. Перед началом работы нужно проверять или принудительно выставлять нужный режим:

Получить доступ ко всем «мешлупам» меша можно через индексы его полигонов. Через них же можно получить доступ к «мешлупам» развертки.

Список всех «мешлупов» развертки с координатами их точек можно получить следующим образом:

Если при построении развертки ребро меша не было разделено швом, «мешлупы» развертки для этого ребра расположены в одной точке и при выделении кликом мышки выделяются сразу все. Все манипуляции (например перемещение) соответственно производятся со всеми совпадающими «мешлупами» сразу.  Такой подход удобен для сшивания — достаточно совместить «мешлупы» развертки, соответствующие одному ребру меша, чтобы шов был сшит. Однако из-за этого «мешлупы» развертки сложно разделить.

Для разделения выбранных на развертке «мешлупов» можно использовать следующий код:

Функция centroid высчитывает координаты центра полигона по координатам его вершин.

Скрипт просматривает все выделенные точки развертки. Все «мешлупы» для выделенной точки немного сдвигаются на развертке по направлению к центру полигона, которому они принадлежат.