Come ottenere tutti i fotogrammi chiave per la striscia selezionata in Python?
Supponiamo di avere una striscia di immagini in VSE e ha 2 fotogrammi chiave per la sua opacità. Come posso modificare i valori di ciascuno di essi tramite Python?
Risposte
Importa il modulo bpy per accedere ai dati di Blender.
import bpy
Metodo di contesto
Se hai appena creato i fotogrammi chiave e stai semplicemente scrivendo script nell'editor di testo, puoi cercare gli oggetti in base al contesto. Devi essere certo che la striscia abbia due fotogrammi chiave e sia selezionata (attiva) nel sequencer.
Ottieni la scena attiva in base al contesto.
scene = bpy.context.scene
Ottieni la striscia del sequencer attivo in base al contesto.
strip = scene.sequence_editor.active_strip
Cerca la fcurve collegata alla data_path
striscia attiva con il suo nome e proprietà. (Guarda la risposta di batFINGER su come costruire data_path in modo più elegante con 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)
Assegna alcuni valori a quanto keyframe_points
memorizzato in 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
Forza l'aggiornamento del sequencer.
bpy.ops.sequencer.refresh_all()
Metodo dati
Se stai tentando di utilizzare questa funzionalità da un componente aggiuntivo o non sei sicuro che sia selezionata una striscia attiva o anche se sono presenti dei fotogrammi chiave, devi convalidare i dati.
Visualizza lo snippet di codice da GitHub.
Incapsula la funzionalità in un metodo, che può essere interrotto, se manca una precondizione. I parametri richiesti sono:
il nome della scena
il nome della striscia del sequencer
i valori utilizzati per sovrascrivere i valori dei fotogrammi chiave esistenti
def modify_strip_keyframes (scene_name, strip_name, keyframe_values = [1.0, 0.0]):
Ottieni la scena per nome, ma torna se non esiste.
scene = bpy.data.scenes.get(scene_name)
if scene == None:
print("Scene not found.")
return
Verificare che sia presente animation_data
e un file sequence_editor
. Se non ci sono fotogrammi chiave o strisce, questi elementi saranno None
. (La chiamata alle proprietà di None
farà bloccare lo script.)
if (scene.animation_data == None or scene.sequence_editor == None):
print("No strips with keyframes.")
return
Ottieni la striscia per nome e ottieni la fcurve associata alla sua proprietà blend_alpha
(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
Verificare che ce ne siano tanti keyframe_points
su fcurve quanti valori sono stati forniti. Quindi scorrere i punti e assegnare i nuovi valori alle keyframe_point
coordinate 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
Per eseguire la funzione, chiamala e aggiorna il sequencer per visualizzare la modifica.
modify_strip_keyframes("Scene", "cat", keyframe_values = [1, 0.5])
bpy.ops.sequencer.refresh_all()
Trova la fcurve in base al suo percorso dati
Il suggerimento di passare all'editor grafico e guardare le curve f visibili dipenderà dalle impostazioni dell'editor grafico.
Crea invece il percorso dati che è keyframe e cercalo nell'azione fcurves.
Le animazioni delle strisce VSE appartengono all'oggetto scena.
Script di seguito
ottiene la striscia attiva
trova il percorso della striscia attiva dal suo oggetto ID, la scena, un esempio di striscia di film attiva denominata "Foo"
'sequence_editor.sequences_all["Foo"].blend_alpha'
Lo cerca all'interno della raccolta fcurve delle azioni di scena
Nota: molte o tutte le proprietà di cui sopra potrebbero avere valore, None
incluso l'editor di sequenze, la striscia attiva, i dati di animazione e l'azione. Avrebbe bisogno di testare per ciascuno.
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'
La mia idea sbagliata era che Grafico> Fotogrammi chiave. Mentre la realtà è Grafico> FCurves> Keyframes.