В процессе работы с UV разверткой в Blender иногда бывает нужно найти для целой развертки какие-то граничные точки. Рассмотрим, как это можно сделать на примере поиска левой нижней точки развертки.
Для начала переключимся в объектный режим, чтобы зафиксировать данные в развертке.
|
1 |
bpy.ops.object.mode_set(mode = 'OBJECT') |
Получим указатель на текущую активную развертку меша.
|
1 2 |
bpy.context.object.data.uv_layers.active # bpy.data.meshes['Cube'].uv_layers["UVMap"] |
Теперь получим все “мешлупы” – объекты, связывающие точки меша с точками его развертки.
|
1 2 3 4 |
mesh_loops = [uv_layer.data[loop_index] for _face in bpy.context.object.data.polygons \ for loop_index in _face.loop_indices] # [bpy.data.meshes['Cube'].uv_layers["UVMap"].data[0], bpy.data.meshes['Cube'].uv_layers["UVMap"].data[1], ...] |
Через мешлупы мы можем получить координаты точек развертки.
Например, координаты первой точки развертки, полученные из первого мешлупа:
|
1 2 3 |
print(mesh_loops[0].uv) # <Vector (1.1929, 0.5230)> |
Имея ссылку на координаты для точки развертки, мы можем легко найти левую нижнюю точку, сначала отсортировав мешлупы по координате X,
|
1 |
mesh_loops_x_sorted = sorted(mesh_loops, key=lambda _uv_point: _uv_point.uv.x) |
а потом найдя мешлуп с минимальной координатой по Y.
|
1 |
lb_point = min(mesh_loops_x_sorted, key=lambda _uv_point: _uv_point.uv.y) |
Выведем для найденного мешлупа координаты точки развертки:
|
1 2 3 |
print(lb_point, lb_point.uv) # <bpy_struct, MeshUVLoop at 0x000001BF984FCC30> <Vector (0.2997, 0.0141)> |
Как мы можем визуально убедиться, найденные координаты действительно соответствуют левой нижней точке в развертке меша.
Подобным образом можно найти и другие граничные точки, левую верхнюю, правую нижнюю и правую верхнюю. Нужно лишь менять сортировку по нужной оси (X или Y) и находить минимальную или максимальную (min() или max()) координату по другой оси.

.blend file on Patreon