Функция convex_hull() позволяет создать для меша выпуклую оболочку – форму, которая полностью охватывает меш по его крайним точкам. С ее помощью можно быстро строить упрощенные модели из сложных мешей.
Для того чтобы воспользоваться функцией convex_hull() необходимо инициировать структуру данных bmesh.
Создадим bmesh и загрузим в него геометрию текущего выделенного меша.
1 2 3 4 |
import bmesh bm = bmesh.new() bm.from_mesh(bpy.context.object.data) |
Вызовем функцию convex_hull для построения выпуклой оболочки вокруг геометрии, находящейся в bmesh.
1 |
hull = bmesh.ops.convex_hull(bm, input=bm.verts) |
В функцию передается два параметра:
- указатель на геометрию bmesh
- набор точек, вокруг которых будет построена выпуклая оболочка
В нашем случае мы передаем во втором параметре все точки меша.
Функция возвращает словарь с четырьмя ключами:
- geom – список точек из которых построена выпуклая оболочка
- geom_interior – список всех точек геометрии
- geom_unused – список неиспользованных в просчете точек, если они есть
- geom_holes – список точек, образующих отверстия в оболочке, если они есть
Эту информацию можно использовать, например, для того чтобы выделить точки, образующие только саму построенную оболочку.
Для этого предварительно нужно снять выделение со всех точек:
1 2 3 |
[v.select_set(False) for v in bm.verts] [e.select_set(False) for e in bm.edges] [f.select_set(False) for f in bm.faces] |
А после вызова convex_hull() выделить точки из списка по ключу geom:
1 2 |
for v in hull['geom']: v.select = True |
После выполнения нужных действий перенесем обработанную геометрию из bmesh обратно в исходный меш, а сам bmesh, который нам больше не нужен, очистим и удалим.
1 2 3 |
bm.to_mesh(bpy.context.object.data) bm.clear() bm.free() |
Полный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import bmesh bm = bmesh.new() bm.from_mesh(bpy.context.object.data) [v.select_set(False) for v in bm.verts] [e.select_set(False) for e in bm.edges] [f.select_set(False) for f in bm.faces] hull = bmesh.ops.convex_hull(bm, input=bm.verts) print([(k, len(hull[k])) for k in hull.keys()]) for v in hull['geom']: v.select = True bm.to_mesh(bpy.context.object.data) bm.clear() bm.free() |