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')
|
||
|