MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その108(アクションデータ内の各要素の値を参照する)

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

アクションデータ内の各要素の値を参照する

アクションデータにはアクションの動きを示すカーブデータが含まれています。
カーブデータには設定したキーフレームのインデックス番号と値が含まれています。
docs.blender.org

サンプルスクリプト

スクリプトを実行すると指定したアクションのデータパス内に含まれる全てのインデックスと値が標準出力されます。
・Script_show_keyframelist_value.py

# bpyインポート
import bpy

# 指定アクションに含まれる全カーブのデータパス名を表示する
def show_keyframelist_value(arg_actionname:str,
  arg_datapathname:str, arg_datapathindex:int) -> bool:
    """指定アクションに含まれる全カーブのデータパス名を表示する

    Keyword Arguments:
        arg_actionname {str} -- 指定文字列

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

    # 指定名のアクションを取得する
    target_action = bpy.data.actions.get(arg_actionname)    
    if target_action == None:
        return False
    
    # 指定データパスのカーブを取得する
    # FCurvesアクセスのマニュアル
    # (https://docs.blender.org/api/current/bpy.types.ActionFCurves.html)
    target_curve = target_action.fcurves.find(arg_datapathname, index=arg_datapathindex)

    # カーブ内の全キーポイントを走査する
    for keyframe_point in target_curve.keyframe_points:
        # キーフレームのインデックスとバリューを標準出力する
        # Keyframeアクセスのマニュアル
        # (https://docs.blender.org/api/current/bpy.types.Keyframe.html)
        print('FrameNumber = {}; Value = {}'.format(keyframe_point.co[0], keyframe_point.co[1]))

    return True

# 関数の実行例
actionname = 'Action_Wait'
datapathname = 'pose.bones["control.ChinIK"].location'
datapathindex = 2 # ロケーションの場合 0:Xaxis, 1:Yaxis, 2:Zaxis の対応で値が保持されている
show_keyframelist_value(arg_actionname=actionname,
  arg_datapathname=datapathname, arg_datapathindex=datapathindex)

f:id:bluebirdofoz:20220306112500j:plain