Когда мы работаем с объектом BMesh в Blender Python API мы, точно так же, как и в базовом объекте, можем получить точки на UV-развертке, отталкиваясь от вертексов на самом объекте.
Для примера добавим в сцену куб (если у вас он не добавлен по дефолту). У куба уже есть автоматически сгенерированная развертка. Переключимся в режим редактирования и выделим один полигон.
Теперь давайте получим координаты точек на UV-развертке для выделенного полигона используя объект BMesh.
Создадим объект BMesh и скопируем в него геометрию текущего активного объекта — куба. Сразу проведем переиндексацию для вертексов.
|
1 2 |
bm = bmesh.from_edit_mesh(bpy.context.object.data) bm.verts.ensure_lookup_table() |
Для начала возьмем выделенный полигон.
|
1 2 3 |
selected_face = next((_face for _face in bm.faces if _face.select), None) # <BMFace(0x000001C6C5DB71C0), index=2, totverts=4> |
Еще нам понадобиться указатель на текущий слой UV-развертки.
|
1 2 3 |
active_uv_layer = bm.loops.layers.uv.active # <BMLayerItem object at 0x000001C6C95CDFE0> |
Получим указатель на мешлуп выделенного полигона.
|
1 2 3 |
loop = selected_face.loops # <BMElemSeq object at 0x000001C6CA302670> |
Теперь через мешлуп мы можем получить связанный список вертексов самого 3D объекта (в BMesh) и точек на развертке.
|
1 2 3 |
uv_points = [(_loop.vert, _loop[active_uv_layer]) for _loop in selected_face.loops] # [(<BMVert(0x000001C6B544F1A8), index=5>, <BMLoopUV object at 0x000001C6CC469FE0>), ...] |
Координаты самих точек мы можем получить через свойство «uv» точек на развертке (BMLoopUV). Выведем индекс вертекса на геометрии и соответствующие этому вертексу координаты на UV-развертке.
|
1 2 3 |
uv_points_cos = [(_uv_point[0].index, _uv_point[1].uv) for _uv_point in uv_points] # [(6, Vector((0.44891229271888733, 0.6140835285186768))), ...] |
Еще один полезный вариант — получение списка для всех точек меша, связывающего указатель на точку геометрии с ее координатами на развертке. Этот вызов можно оформить вообще в одну строку.
|
1 2 3 |
uv_p_cos = [(_loop.vert, _loop[active_uv_layer].uv) for _face in bm.faces for _loop in _face.loops] # [(<BMVert(0x000001C6B544F090), index=0>, Vector((-0.007421731948852539, 0.4097326993942261))), ...] |
Первым элементом в полученном списке идет указатель на точку в 3D пространстве в объекте BMesh, а вторым — вектор с ее координатами в 2D пространстве UV-развертки.

.blend file on Patreon