Bagaimana cara mendapatkan semua bingkai utama untuk strip yang dipilih dengan python?

Aug 19 2020

Misalkan kita memiliki strip gambar di VSE dan memiliki 2 bingkai utama untuk opasitasnya. Bagaimana saya bisa mengedit nilai masing-masing melalui python?

Jawaban

6 Leander Aug 19 2020 at 17:02

Impor modul bpy untuk mengakses data Blender.

import bpy

Metode Konteks

Jika Anda baru saja membuat bingkai utama dan hanya membuat skrip di editor teks, Anda dapat mencari objek berdasarkan konteks. Anda harus yakin bahwa strip memiliki dua bingkai utama dan dipilih (aktif) di sekuenser.

Dapatkan adegan aktif berdasarkan konteks.

scene = bpy.context.scene

Dapatkan strip sequencer aktif berdasarkan konteks.

strip = scene.sequence_editor.active_strip

Cari fcurve yang terhubung ke data_pathdari strip aktif dengan nama dan propertinya. (Lihat jawaban batFINGER tentang cara membuat data_path dengan lebih elegan 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)

Tetapkan beberapa nilai ke yang keyframe_pointsdisimpan di 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

Paksa sequencer untuk menyegarkan.

bpy.ops.sequencer.refresh_all()

Metode Data

Jika mencoba menggunakan fungsionalitas ini dari addon atau tidak yakin apakah strip aktif dipilih atau bahkan jika keyframe ada, Anda harus memvalidasi data.

Lihat cuplikan kode dari github.

Mengenkapsulasi fungsionalitas dalam metode, yang dapat dibatalkan, jika prasyarat hilang. Parameter yang dibutuhkan adalah:

  • nama tempat kejadian

  • nama strip sequencer

  • nilai yang digunakan untuk menimpa nilai bingkai utama yang ada

    def modifikasikan_strip_kunci (nama_semarang, nama_lajur, bingkai_kunci = [1.0, 0.0]):

Dapatkan adegan berdasarkan namanya, tetapi kembalikan jika tidak ada.

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

Pastikan bahwa ada animation_datadan a sequence_editor. Jika tidak ada bingkai utama atau tidak ada strip, item ini akan ada None. (Memanggil properti Noneakan merusak skrip.)

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

Dapatkan strip berdasarkan nama dan dapatkan fcurve yang terkait dengan properti itu blend_alpha(opacity).

    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

Verifikasikan bahwa ada sebanyak keyframe_pointsdi fcurve, karena nilai telah diberikan. Kemudian ulangi titik dan tetapkan nilai baru ke keyframe_pointkoordinat 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
    

Untuk menjalankan fungsinya, panggil dan segarkan sequencer untuk memvisualisasikan perubahan.

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

Temukan fcurve berdasarkan datapathnya

Saran untuk beralih ke editor grafik dan melihat kurva yang terlihat, akan bergantung pada pengaturan editor grafik.

Sebagai gantinya buatlah datapath yang memiliki bingkai kunci dan cari di fcurves tindakan.

Animasi strip VSE termasuk dalam objek scene.

Skrip di bawah

  • mendapatkan strip aktif

  • menemukan jalur strip aktif dari objek ID-nya, adegan, contoh untuk strip film aktif bernama "Foo"

     'sequence_editor.sequences_all["Foo"].blend_alpha'
    
  • Pencarian untuk itu dalam koleksi adegan tindakan fcurve

Catatan: Banyak atau semua properti di atas dapat memiliki nilai Nonetermasuk editor urutan, strip aktif, data animasi, dan tindakan. Akan perlu menguji untuk masing-masing.

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'

Kesalahpahaman saya adalah Graph> Keyframes. Sedangkan kenyataannya adalah Graph> FCurves> Keyframes.