Come ottenere tutti i fotogrammi chiave per la striscia selezionata in Python?

Aug 19 2020

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

6 Leander Aug 19 2020 at 17:02

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_pathstriscia 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_pointsmemorizzato 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_datae un file sequence_editor. Se non ci sono fotogrammi chiave o strisce, questi elementi saranno None. (La chiamata alle proprietà di Nonefarà 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_pointssu fcurve quanti valori sono stati forniti. Quindi scorrere i punti e assegnare i nuovi valori alle keyframe_pointcoordinate 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()
6 batFINGER Aug 19 2020 at 17:17

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, Noneincluso 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)
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'

La mia idea sbagliata era che Grafico> Fotogrammi chiave. Mentre la realtà è Grafico> FCurves> Keyframes.