MRが楽しい

MRやVRについて学習したことを書き残す

Blender3.0で利用可能なpythonスクリプトを作る その121(アクションデータ内から指定のフレーム以降のデータを削除する)

本日は 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)

・実行前

・実行後