Comment obtenir toutes les images clés pour la bande sélectionnée en python?
Supposons que nous ayons une bande d'image dans VSE et qu'elle ait 2 images clés pour son opacité. Comment puis-je modifier les valeurs de chacun d'entre eux via python?
Réponses
Importez le module bpy pour accéder aux données de Blender.
import bpy
Méthode de contexte
Si vous venez de créer les images clés et que vous créez simplement des scripts dans l'éditeur de texte, vous pouvez rechercher les objets par contexte. Vous devez être certain que la bande comporte deux images clés et qu'elle est sélectionnée (active) dans le séquenceur.
Obtenez la scène active par contexte.
scene = bpy.context.scene
Obtenez la bande de séquenceur active par contexte.
strip = scene.sequence_editor.active_strip
Recherchez la courbe fcurve connectée à la data_path
bande active avec son nom et sa propriété. (Regardez la réponse de batFINGER sur la façon de construire le data_path plus élégamment avec 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)
Attribuez des valeurs au keyframe_points
stocké dans la 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
Forcer l'actualisation du séquenceur.
bpy.ops.sequencer.refresh_all()
Méthode de données
Si vous essayez d'utiliser cette fonctionnalité à partir d'un module complémentaire ou si vous ne savez pas si une bande active est sélectionnée ou même si des images clés sont présentes, vous devez valider les données.
Afficher l'extrait de code de github.
Encapsulez la fonctionnalité dans une méthode, qui peut être abandonnée, si une condition préalable est manquante. Les paramètres requis sont:
le nom de la scène
le nom de la bande de séquenceur
les valeurs utilisées pour écraser les valeurs des images clés existantes
def modify_strip_keyframes (nom_scène, nom de bande, valeurs_image-clé = [1.0, 0.0]):
Obtenez la scène par son nom, mais renvoyez-la si elle n'existe pas.
scene = bpy.data.scenes.get(scene_name)
if scene == None:
print("Scene not found.")
return
Vérifiez qu'il existe animation_data
et a sequence_editor
. S'il n'y a pas d'images clés ou de bandes, ces éléments le seront None
. (L'appel des propriétés de None
fera planter le script.)
if (scene.animation_data == None or scene.sequence_editor == None):
print("No strips with keyframes.")
return
Obtenez la bande par nom et obtenez la fcurve associée à sa blend_alpha
propriété (l'opacité).
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
Vérifiez qu'il y en a autant keyframe_points
sur la fcurve que les valeurs ont été fournies. Puis bouclez sur les points et attribuez les nouvelles valeurs aux keyframe_point
coordonnées 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
Pour exécuter la fonction, appelez-la et actualisez le séquenceur pour visualiser le changement.
modify_strip_keyframes("Scene", "cat", keyframe_values = [1, 0.5])
bpy.ops.sequencer.refresh_all()
Trouvez la fcurve en fonction de son chemin de données
La suggestion de basculer dans l'éditeur de graphiques et de regarder les courbes visibles dépendra des paramètres de l'éditeur de graphiques.
Au lieu de cela, créez le chemin de données qui contient des images clés et recherchez-le dans l'action fcurves.
Les animations de bande VSE appartiennent à l'objet scène.
Script ci-dessous
obtient la bande active
trouve le chemin de la bande active à partir de son objet ID, la scène, un exemple de bande de film active nommée "Foo"
'sequence_editor.sequences_all["Foo"].blend_alpha'
Le recherche dans la collection d'actions de scène fcurve
Remarque: la plupart ou toutes les propriétés ci-dessus peuvent avoir une valeur, None
y compris l'éditeur de séquence, la bande active, les données d'animation et l'action. Aurait besoin de tester pour chacun.
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'
Mon idée fausse était que Graph> Keyframes. Alors que la réalité est Graph> FCurves> Keyframes.