MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その122(アクションデータ内から指定ボーンポーズのデータを削除する)

本日は Blender の技術調査枠です。
Blender3.0で利用可能なpythonスクリプトを作ります。

アクションデータ内から指定ボーンポーズのデータを削除する

アクションデータにはアクションの動きを示すカーブデータが含まれています。
カーブデータはデータパス名とインデックスごとに保持されています。
docs.blender.org

ポーズモードで設定したボーンのデータパス名は pose.bones["(ボーン名)"].*** となっているので、これに一致するデータパスを削除します。
文字列の前方一致には startsswith() 関数が利用できます。
note.nkmk.me

サンプルスクリプト

スクリプトを実行すると指定したアクション内に含まれる指定ボーンポーズのデータが削除されます。
・Script_delete_action_datapath_byBone.py

# bpyインポート
import bpy

# 指定アクションに含まれる指定ボーンポーズ関連のデータパスを削除する
def delete_action_datapath_byBone(arg_actiondata:bpy.types.Action, arg_bonename:str) -> bool:
    """# 指定アクションに含まれる指定ボーンポーズ関連のデータパスを削除する

    Keyword Arguments:
        arg_actiondata {bpy.types.Action} -- 指定アクションデータ
        arg_bonename {str} -- 指定ボーン名

    Returns:
        bool -- 実行成否
    """

    # 引数をチェックする  
    if arg_actiondata == None:
        return False
    if arg_bonename == None:
        return False

    # ボーンポーズのデータパス名を作成する
    target_datapath_name = 'pose.bones["' + arg_bonename + '"].'

    # アクション内の全アクションカーブを走査する
    # データ削除のため、リストは逆順(reversed)で回す
    for fcurve in reversed(arg_actiondata.fcurves):
        # アクションカーブのデータパス名がボーン名と前方一致するか
        # Fcurveアクセスのマニュアル
        # (https://docs.blender.org/api/current/bpy.types.FCurve.html)
        if fcurve.data_path.startswith(target_datapath_name):
            # 対象ボーンのアクションカーブであれば削除する
            arg_actiondata.fcurves.remove(fcurve)

    return True

# 関数の実行例
delete_action_datapath_byBone(
    arg_actiondata=bpy.data.actions.get("Action_Wait"),
    arg_bonename="control.ChinIK")

・実行前

・実行後