Одна из самых частых задач при работе с геометрией мешей через Ptyhon API в Blender — нахождение ближайших соседних вертексов для определенной точки. Найти все ближайшие вертексы, лежащие в пределах определенного расстояний от нужного нам вертекса мы можем при помощи инструментов BMesh и KD-Tree.
Напишем простой скрипт, который будет находить и выделять все вертексы, лежащие в пределах заданного расстояния от каждого выделенного вертекса на меше. Пусть меш находится в режиме редактирования.
Создадим объект BMesh и сразу скопируем в него геометрию текущего активного меша.
|
1 |
bm = bmesh.from_edit_mesh(bpy.context.object.data) |
Теперь создадим дерево KD-Tree. Заполним его данными с координатами всех точек меша. Также сделаем предрасчет — балансировку дерева.
|
1 2 3 4 |
kdt = kdtree.KDTree(len(bm.verts)) for i, v in enumerate(bm.verts): kdt.insert(v.co, i) kdt.balance() |
Допустим, мы хотим найти все точки, лежащие от выделенных, в пределах расстояния 0.7. Зададим его.
|
1 |
distance = 0.7 |
Пройдем в цикле по всем выделенным вертексам.
Чтобы при помощи KD-Tree найти все нужные точки, используем метод find_range(), в параметры которого мы передаем координаты выделенной точки и расстояние, в пределах которого искать. Метод возвращает координаты, индекс и расстояние до каждой найденной точки. Выделим ее и выведем ее данные в консоль.
|
1 2 3 4 |
for v in [v for v in bm.verts if v.select]: for (co, index, dist) in kdt.find_range(v.co, distance): bm.verts[index].select = True print(bm.verts, dist) |
После завершения цикла вернем геометрию с обновленным выделением в исходный меш и очистим объект BMesh, который нам больше не нужен.
Таким образом мы выделили все точки, которые лежат в пределах заданного нами расстояния от каждой исходно выделенной точки.

.blend file on Patreon