Применить к объекту наложенные на него модификаторы можно последовательно проходя по списку модификаторов и вызывая оператор bpy.ops.object.modifier_apply() для применения каждого из них. Однако можно воспользоваться тем, что в depsgraph уже есть полностью просчитанные данные меша с уже примененными модификаторами и просто перестроить объект по этим данным.
Автор метода Iyad Ahmed.
Дополнительны бонус при использовании данного метода – модификаторы можно применять как в объектном режиме, так и в режиме редактирования меша.
Сначала нужно получить указатель на depsgraph:
1 |
depsgraph = bpy.context.evaluated_depsgraph_get() |
при помощи которого теперь мы можем получить уже полностью просчитанную геометрию меша с учетом всех модификаторов:
1 |
evaluated_object = bpy.context.object.evaluated_get(depsgraph) |
В дальнейшем нам нужно будет удалить модификаторы с объекта, что повлияет на перерасчитанные данные, поэтому сделаем копию перерасчитанной геометрии меша:
1 |
mesh = bpy.data.meshes.new_from_object(evaluated_object, depsgraph=depsgraph) |
Теперь можно удалить все модификаторы
1 |
bpy.context.object.modifiers.clear() |
Осталось заменить текущую геометрию меша на ту, что мы сохранили в копии.
Для объектного режима:
1 2 |
if bpy.context.object.mode == 'OBJECT': bpy.context.object.data = mesh |
и для режима редактирования:
1 2 3 4 5 |
else: bm = bmesh.from_edit_mesh(bpy.context.object.data) bm.clear() bm.from_mesh(mesh) bmesh.update_edit_mesh(bpy.context.object.data) |
В результате мы получаем готовый объект со всеми применёнными к нему модификаторами.
Полный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import bpy import bmesh depsgraph = bpy.context.evaluated_depsgraph_get() obj = bpy.context.object evaluated_object = obj.evaluated_get(depsgraph) mesh = bpy.data.meshes.new_from_object(evaluated_object, depsgraph=depsgraph) obj.modifiers.clear() if obj.mode == 'OBJECT': obj.data = mesh else: bm = bmesh.from_edit_mesh(obj.data) bm.clear() bm.from_mesh(mesh) bmesh.update_edit_mesh(obj.data) |