Для того чтобы перемещать точки меша при помощи Blender Python API не выходя из режима редактирования (EDIT мод), нужно использовать объект bmesh. С его помощью можно удобно манипулировать геометрией объекта.
Добавим в сцену куб (если вы удалили его ранее) Shift + a – Mesh – Cube и перейдем в режим редактирования, нажатием на клавишу Tab. Выделим все точки (a) и передвинем их куда-нибудь, нажав на клавишу g.
Теперь вернем геометрию в начало координат при помощи Python API.
Указатель на структуру данных объекта мы можем получить их его свойства data. Для текущего активного объекта:
1 2 3 |
obj_data = bpy.context.object.data # bpy.data.meshes['Cube'] |
Создадим объект типа bmesh, передав в параметрах указатель на данные объекта.
1 2 3 4 5 |
import bmesh bm = bmesh.from_edit_mesh(obj_data) # <BMesh(0x000001E6167F9D08), totvert=8, totedge=12, totface=6, totloop=24> |
Получить доступ к вертексам куба мы можем через свойство bmesh.verts. Это список, где каждый элемент это объект, соответсвующий одному вертексу. Через него мы можем получить доступ к координатам вертекса.
1 2 3 |
bm.verts[0] # <BMVert(0x000001E607C01250), index=0> |
Для перемещения точек нужно просто задать для каждой точки нужные координаты.
Для примера переместим всю геометрию так, чтобы первый вертекс оказался в начальной точке (origin).
Локальные координаты начальной точки равны (0.0, 0.0, 0.0).
Координаты первой точки геометрии:
1 2 3 |
bm.verts[0].co # Vector((5.0934367179870605, 4.548335552215576, 3.2297282218933105)) |
Чтобы переместить любую точку с сохранением ее смещения относительно первой точки, нужно из ее текущих координат вычесть координаты первой точки.
Сохраним копию координат первой точки в отдельную переменную, и пройдем в цикле по всем точкам, вычитая из их координат сохраненное значение.
1 2 3 4 |
v_co = bm.verts[0].co.copy() for v in bm.verts: v.co -= v_co |
Для того чтобы сделанные в геометрии изменения вступили в силу и отобразились во вьюпорте, нужно обновить структуру данных меша, вызвав метод update().
1 |
obj_data.update() |