¿Cómo obtener todos los fotogramas clave para la tira seleccionada en Python?
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
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_path
de 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_points
almacenados 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_data
y a sequence_editor
. Si no hay fotogramas clave o franjas, estos elementos serán None
. (Llamar a las propiedades de None
bloqueará 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_alpha
propiedad (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_points
en la curva f como valores se hayan proporcionado. Luego, recorra los puntos y asigne los nuevos valores a las keyframe_point
coordenadas 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()
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, None
incluido 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)
#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.