Bagaimana cara mendapatkan semua bingkai utama untuk strip yang dipilih dengan python?
Misalkan kita memiliki strip gambar di VSE dan memiliki 2 bingkai utama untuk opasitasnya. Bagaimana saya bisa mengedit nilai masing-masing melalui python?
Jawaban
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_path
dari 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_points
disimpan 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_data
dan a sequence_editor
. Jika tidak ada bingkai utama atau tidak ada strip, item ini akan ada None
. (Memanggil properti None
akan 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_points
di fcurve, karena nilai telah diberikan. Kemudian ulangi titik dan tetapkan nilai baru ke keyframe_point
koordinat 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()
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 None
termasuk 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)
#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.