Получение массива точек ключевых кадров в Blender

Привет, у меня есть сценарий, над которым я работаю, и он не работает так, как я хочу. Это то, что я получил до сих пор.

import bpy
def Key_Frame_Points(): #Gets the key-frame values as an array.

    fcurves = bpy.context.active_object.animation_data.action.fcurves

    for curve in fcurves:

        keyframePoints = fcurves[4].keyframe_points # selects Action channel's axis / attribute

        for keyframe in keyframePoints:

            print('KEY FRAME POINTS ARE  @T ',keyframe.co[0])         
            KEYFRAME_POINTS_ARRAY = keyframe.co[0]

    print(KEYFRAME_POINTS_ARRAY)

Key_Frame_Points()

Когда я запускаю его, он распечатывает все ключевые кадры на выбранных объектах так, как я этого хотел. Но проблема в том, что я не могу по какой-то причине получить значения его печати в переменную. Если вы запустите его и проверьте систему Concole. он действует странно. Как и при распечатке значений объекта Keyframed. Но когда я прошу его получить эти значения в виде массива, он просто распечатывает последний кадр.

Вот как это выглядит вкратце

введите описание изображения здесь

1 ответ

Я думаю, что вы хотите сделать, это добавить каждый keyframe.co[1] в массив, который означает, что вы хотите использовать KEYFRAME_POINTS_ARRAY.append(keyframe.co[1]) и чтобы это работало, вам нужно определить его как пустой массив вне цикла с KEYFRAME_POINTS_ARRAY = []

Обратите внимание, что keyframe.co[0] это кадр, который в то время как ключ keyframe.co[1] является ключевым значением в этом кадре.

Также следует отметить, что вы просматриваете fcurves, но не используете каждую кривую.

for curve in fcurves:
    keyframePoints = fcurves[4].keyframe_points

Используя fcurves[4] здесь вы читаете один и тот же fcurve каждый раз, вы, вероятно, хотели использовать keyframePoints = curve.keyframe_points

Так что я ожидаю, что вы хотите иметь -

import bpy

def Key_Frame_Points(): #Gets the key-frame values as an array.
    KEYFRAME_POINTS_ARRAY = []
    fcurves = bpy.context.active_object.animation_data.action.fcurves

    for curve in fcurves:
        keyframePoints = curve.keyframe_points
        for keyframe in keyframePoints:
            print('KEY FRAME POINTS ARE frame:{} value:{}'.format(keyframe.co[0],keyframe.co[1]))
            KEYFRAME_POINTS_ARRAY.append(keyframe.co[1])
    return KEYFRAME_POINTS_ARRAY

print(Key_Frame_Points())

Вы также можете быть заинтересованы в использовании fcurves.find(data_path) найти конкретную кривую по ее пути.

Существует также fcurve.evaluate(frame) это даст вам значение кривой в любом кадре, а не только в ключевых значениях.

Другие вопросы по тегам