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

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

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

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

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

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

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

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

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

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

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

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

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

5 1 голос
Article Rating
Подписаться
Уведомить о
guest

2 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
asdfrog
1 год назад

Здравствуйте. Я импортирую в blender большую модель с разверткой из rizom uv, которая содержит 2 udim’а. В блендере же я хочу полигонам левого uv квадрата назначить один материал, а полигонам правого uv квадрата – другой, чтоб фактически каждый меш модели имел два материала, для облегченного нанесения материалов в unity. Я хотел автоматизировать этот процесс при помощи скриптинга, но столкнулся с проблемой, что у меня не получается оператором bpy.ops.uv.select_box (и прочими вариациями select) выделить полигоны именно левого или правого uv квадрата. Оператор либо выдает ошибку context is incorrect, либо (видимо из-за mesh-loop’ов) выделяет все полигоны.
Вручную я просто в режиме uv sync selection мышкой выделяю области каждого uv квадрата и назначаю им материалы, все получается. Как я могу повторить это действие при помощи скриптинга?