66 lines
3.0 KiB
Python
66 lines
3.0 KiB
Python
|
|
import bpy
|
|
|
|
def append_layered_action_5_0(source_obj_name, target_obj_name):
|
|
source_obj = bpy.data.objects.get(source_obj_name)
|
|
target_obj = bpy.data.objects.get(target_obj_name)
|
|
|
|
if not (source_obj and target_obj):
|
|
print("Ошибка: Объекты не найдены")
|
|
return
|
|
|
|
src_action = source_obj.animation_data.action
|
|
tgt_action = target_obj.animation_data.action
|
|
|
|
# 1. Получаем слои (обычно первый)
|
|
src_layer = src_action.layers[0]
|
|
tgt_layer = tgt_action.layers[0]
|
|
|
|
# 2. Получаем стрипы
|
|
src_strip = src_layer.strips[0]
|
|
tgt_strip = tgt_layer.strips[0]
|
|
|
|
# Смещение (опираемся на конец диапазона целевого экшена)
|
|
offset = tgt_action.frame_range[1]
|
|
|
|
# 3. Итерируемся по channelbags в исходном стрипе
|
|
for src_bag in src_strip.channelbags:
|
|
# Ищем или создаем соответствующий bag в целевом стрипе
|
|
# Обычно они сопоставляются по имени или типу (например, 'Keyframe Channel Bag')
|
|
# В простейшем случае берем первый или сопоставляем по индексу
|
|
dst_bag = None
|
|
if len(tgt_strip.channelbags) > 0:
|
|
# Пытаемся найти по названию (если оно есть) или берем тот же индекс
|
|
dst_bag = tgt_strip.channelbags[0]
|
|
|
|
if not dst_bag:
|
|
# Если в целевом стрипе нет сумок, это странно, но можно создать
|
|
# (Метод создания может зависеть от конкретного подтипа стрипа в 5.0)
|
|
continue
|
|
|
|
#print(f"Обработка channelbag: {src_bag.name}, кривых: {len(src_bag.fcurves)}")
|
|
|
|
# 4. Итерируемся по fcurves внутри сумки
|
|
for src_fcurve in src_bag.fcurves:
|
|
dst_fcurve = dst_bag.fcurves.find(src_fcurve.data_path, index=src_fcurve.array_index)
|
|
|
|
if not dst_fcurve:
|
|
dst_fcurve = dst_bag.fcurves.new(data_path=src_fcurve.data_path, index=src_fcurve.array_index)
|
|
|
|
# 5. Копируем ключи с офсетом
|
|
for keyframe in src_fcurve.keyframe_points:
|
|
new_frame = keyframe.co[0] + offset
|
|
new_value = keyframe.co[1]
|
|
|
|
new_kp = dst_fcurve.keyframe_points.insert(new_frame, new_value, options={'FAST'})
|
|
new_kp.interpolation = keyframe.interpolation
|
|
|
|
# Обновляем интерполяцию
|
|
for fc in dst_bag.fcurves:
|
|
fc.update()
|
|
|
|
print(f"Анимация успешно дозаписана. Новый конец: {tgt_action.frame_range[1]}")
|
|
|
|
append_layered_action_5_0('Armature.001', 'Armature')
|
|
|