¿Cómo obtener todos los fotogramas clave para la tira seleccionada en Python?

Aug 19 2020

Supongamos que tenemos una tira de imágenes en VSE y tiene 2 fotogramas clave para su opacidad. ¿Cómo puedo editar los valores de cada uno de ellos a través de Python?

Respuestas

6 Leander Aug 19 2020 at 17:02

Importe el módulo bpy para acceder a los datos de Blender.

import bpy

Método de contexto

Si acaba de crear los fotogramas clave y simplemente está escribiendo en el editor de texto, puede buscar los objetos por contexto. Debe asegurarse de que la tira tenga dos fotogramas clave y esté seleccionada (activa) en el secuenciador.

Obtenga la escena activa por contexto.

scene = bpy.context.scene

Obtenga la tira del secuenciador activo por contexto.

strip = scene.sequence_editor.active_strip

Busque la fcurve conectada a la data_pathde la tira activa con su nombre y propiedad. (Mire la respuesta de batFINGER sobre cómo construir el data_path de manera más elegante strip.path_from_id("blend_alpha")).

data_path = 'sequence_editor.sequences_all["' + strip.name + '"].blend_alpha'
fcrv = scene.animation_data.action.fcurves.find(data_path)

Asigne algunos valores a los keyframe_pointsalmacenados en fcurve.

for i, y in [[0, 0.0], [1, 1.0]]:
    fcrv.keyframe_points[i].co.y = y
    fcrv.keyframe_points[i].handle_left.y = y
    fcrv.keyframe_points[i].handle_right.y = y

Obliga al secuenciador a actualizarse.

bpy.ops.sequencer.refresh_all()

Método de datos

Si está intentando utilizar esta funcionalidad desde un complemento o no está seguro de si se ha seleccionado una franja activa o incluso si hay fotogramas clave, debe validar los datos.

Ver fragmento de código de github.

Encapsule la funcionalidad en un método, que se puede abortar, si falta una condición previa. Los parámetros requeridos son:

  • el nombre de la escena

  • el nombre de la tira del secuenciador

  • los valores que se utilizan para sobrescribir los valores de fotogramas clave existentes

    def modificar_transmisiones_keyframes (nombre_de_escena, nombre_de_la_tracción, keyframe_values ​​= [1.0, 0.0]):

Obtenga la escena por su nombre, pero devuélvala si no existe.

    scene = bpy.data.scenes.get(scene_name)
    if scene == None:
        print("Scene not found.")
        return

Verifique que haya animation_datay a sequence_editor. Si no hay fotogramas clave o franjas, estos elementos serán None. (Llamar a las propiedades de Nonebloqueará el script).

    if (scene.animation_data == None or scene.sequence_editor == None):
        print("No strips with keyframes.")
        return
    

Obtenga la tira por nombre y obtenga la fcurve asociada con su blend_alphapropiedad (la opacidad).

    strip = scene.sequence_editor.sequences.get(strip_name)
    if strip == None:
        print("Strip not found.")
        return
    
    data_path = 'sequence_editor.sequences_all["' + strip_name + '"].blend_alpha'
    fcrv = scene.animation_data.action.fcurves.find(data_path)
    
    if fcrv == None:
        print("No opacity keyframes found.")
        return

Verifique que haya tantos keyframe_pointsen la curva f como valores se hayan proporcionado. Luego, recorra los puntos y asigne los nuevos valores a las keyframe_pointcoordenadas co.

    if len(fcrv.keyframe_points) != len(keyframe_values):
        print("The strip has " + str(len(fcrv.keyframe_points)) +
            " keys, but " + str(len(keyframe_values)) + " values were supplied.")
        return
    
    for i in range(len(fcrv.keyframe_points)):
        key = fcrv.keyframe_points[i]
        key.co.y = keyframe_values[i]
        key.handle_left.y = keyframe_values[i]
        key.handle_right.y = keyframe_values[i]
        key.handle_left.x = key.co.x
        key.handle_right.x = key.co.x
    

Para ejecutar la función, llámala y actualiza el secuenciador para visualizar el cambio.

modify_strip_keyframes("Scene", "cat", keyframe_values = [1, 0.5])
bpy.ops.sequencer.refresh_all()
6 batFINGER Aug 19 2020 at 17:17

Encuentre la curva f basada en su ruta de datos

La sugerencia de alternar en el editor de gráficos y mirar las fcurves visibles dependerá de la configuración del editor de gráficos.

En su lugar, cree la ruta de datos con fotogramas clave y búsquela en la acción fcurves.

Las animaciones de tira VSE pertenecen al objeto de escena.

Guión a continuación

  • obtiene la tira activa

  • encuentra la ruta de la tira activa a partir de su objeto de ID, la escena, un ejemplo de tira de película activa llamada "Foo"

     'sequence_editor.sequences_all["Foo"].blend_alpha'
    
  • La busca dentro de la colección de acciones de escena fcurve

Nota: muchas o todas las propiedades anteriores podrían tener valor, Noneincluido el editor de secuencias, la tira activa, los datos de animación y la acción. Necesitaría probar para cada uno.

import bpy
from bpy import context

scene = context.scene
seq = scene.sequence_editor
active_strip = seq.active_strip
datapath = active_strip.path_from_id("blend_alpha")
action = scene.animation_data.action

fc = action.fcurves.find(datapath)
1 Noname Aug 19 2020 at 16:52
#Assuming you are at VSE with your strip selected
context.area.type = 'GRAPH_EDITOR'
for fcurve in context.visible_fcurves:
    for keyframe in fcurve.keyframe_points:
        #Do w/e you want with the keyframe
        pass
#We switch back to VSE
context.area.type = 'SEQUENCE_EDITOR'

Mi idea errónea fue que Graph> Keyframes. Mientras que la realidad es Graph> FCurves> Keyframes.