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

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

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

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

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

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

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

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

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

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

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

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

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

Nikita

Автор: Nikita

Blender add-ons developer and articles writer.