Когда для создания новой геометрии мы работаем через Blender Python API с объектом bmesh, все создаваемые вертексы получают индекс равный -1. Хотя мы можем полноценно взаимодействовать и управлять созданными вертексами, отсутствие у них номерного индекса может несколько затруднить восприятие геометрии и отладку кода.
Для назначения вертексам в bmesh последовательных номеров используется функция index_update().
Посмотрим наглядно, как она работает. Для этого создадим объект bmesh из текущего активного меша.
1 2 3 |
mesh = bpy.context.object.data bm = bmesh.from_edit_mesh(mesh) bm.verts.ensure_lookup_table() |
И проверим нумерацию текущих индексов точек.
1 2 3 |
print([_vert.index for _vert in bm.verts]) # [0, 1, 2, 3, 4, 5, 6, 7] |
Теперь создадим новую точку с координатами (0.0, 0.0, 2.0).
1 |
new_vert = bm.verts.new((0.0, 0.0, 2.0)) |
И снова проверим номера индексов.
1 2 3 |
print([_vert.index for _vert in bm.verts]) # [0, 1, 2, 3, 4, 5, 6, 7, -1] |
Как мы видим, появилась новая точка с индексом равным -1. И, как мы можем убедиться, это новая, созданная нами точка.
1 2 3 |
print(new_vert) # <BMVert(0x000002BF03FAFA90), index=-1> |
Теперь приведем индексы к порядковому следованию при помощи функции index_update().
1 |
bm.verts.index_update() |
И снова проверим индексы точек.
1 2 3 4 5 |
print([_vert.index for _vert in bm.verts]) print(new_vert) # [0, 1, 2, 3, 4, 5, 6, 7, 8] # <BMVert(0x000002BF03FAF150), index=8> |
После вызова index_update() все индексы получили порядковые номера. Так же это отразилось и в данных созданной нами точки.
По сути, функция index_update() состоит всего из двух строк.
1 2 |
for i, vertex in enumerate(bm.verts): vertex.index = i |
Важно помнить, что вызов index_update() не гарантирует вам точного следования полученных индексов порядку создания точек или порядку следования точек друг за другом.