Создать копию объекта в сцене можно двумя путями:
- Вызывая оператор дублирования объекта,
- Используя метод copy() самого объекта.
Создание копии объекта с помощью оператора
Чтобы создать копию объекта, вызовем оператор дублирования:
1 |
bpy.ops.object.duplicate(linked=False) |
Копируемый объект должен быть выделенным и активным.
В параметре linked передается указание, какую копию делать: полную – новый объект будет полностью независимым, или линкованную – создается инстанс объекта, данные которого ссылаются на данные исходного объекта.
Создание копии объекта методом copy()
Создать копию объекта можно и без использования операторов.
Вызвав метод copy() у исходного объекта, мы получим в результате его копию.
1 |
obj_copy = bpy.context.active_object.copy() |
Добавив копию объекта в коллекцию, мы увидим его в нашей сцене.
1 |
bpy.context.collection.objects.link(obj_copy) |
С помощью метода copy() мы получаем инстанс объекта. Для того, чтобы сделать полную копию, нужно отдельно вызвать метод copy() для данных объекта и, если они у него есть, для ключей анимации объекта.
1 2 3 4 |
obj_copy.data = obj_copy.data.copy() if obj_copy.animation_data: obj_copy.animation_data.action = obj_copy.animation_data.action.copy() |
Оформим необходимые вызовы в функцию:
1 2 3 4 5 6 7 8 |
def duplicate(obj, data=True, actions=True, collection=None): obj_copy = obj.copy() if data: obj_copy.data = obj_copy.data.copy() if actions and obj_copy.animation_data: obj_copy.animation_data.action = obj_copy.animation_data.action.copy() collection.objects.link(obj_copy) return obj_copy |
Во входных параметрах мы будем передавать:
- obj – объект, копию которого надо сделать
- data и actions – указания, делать полную копию или линкованную (инстанс)
- collection – коллекция, в которую надо поместить копию объекта
Теперь для создания копии текущего активного объекта нам нужно просто вызвать созданную функцию:
1 2 3 4 5 |
obj_copy = duplicate( obj=bpy.context.active_object, data=True, actions=True ) |