本日は Blender の技術調査枠です。
Blender3.0で利用可能なpythonスクリプトを作ります。
アクションデータ内から指定のフレーム以降のデータを削除する
アクションデータにはアクションの動きを示すカーブデータが含まれています。
カーブデータの各キーフレームにはフレームナンバーと値が保持されており、キーフレームのフレーム位置を確認できます。
docs.blender.org
スクリプトからキーフレームを削除した場合は update を実行すると残ったキーフレームを基にカーブを更新できます。
docs.blender.org
サンプルスクリプト
スクリプトを実行すると指定したアクションの指定フレーム以降のキーフレームが削除されます。
・Script_delete_keyframe_value_byFrameNumber.py
# bpyインポート import bpy # アクションデータ内から指定のフレームナンバー以降のデータを削除する def delete_keyframe_value_byFrameNumber(arg_actiondata:bpy.types.Action, arg_targetframenumber:int) -> bool: """アクションデータ内から指定のフレームナンバー以降のデータを削除する Keyword Arguments: arg_actiondata {bpy.types.Action} -- 指定アクションデータ arg_targetframenumber {int} -- 指定フレームナンバー Returns: bool -- 実行成否 """ # 引数をチェックする if arg_actiondata == None: return False # アクション内の全アクションカーブを走査する for fcurve in arg_actiondata.fcurves: # カーブ内の全キーポイントを走査する # データ削除のため、リストは逆順(reversed)で回す for keyframe_point in reversed(fcurve.keyframe_points): # キーフレームのフレームナンバー情報を取得する # Keyframeアクセスのマニュアル # (https://docs.blender.org/api/current/bpy.types.Keyframe.html) keyframe_point_framenumber = keyframe_point.co[0] # フレームナンバーが指定フレームナンバー以降かチェックする if keyframe_point_framenumber >= arg_targetframenumber : # 指定フレームナンバー以降のキーフレームであれば削除する fcurve.keyframe_points.remove(keyframe_point) # 更新したキーフレームに合わせてカーブを更新する fcurve.update() return True # 関数の実行例 actiondata = bpy.data.actions.get('Action_Wait') targetframenumber = 25 delete_keyframe_value_byFrameNumber( arg_actiondata=actiondata, arg_targetframenumber=targetframenumber)
・実行前
・実行後