MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その109(アクションデータ内のカーブデータを更新する)

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

アクションデータ内のカーブデータを更新する

アクションデータ内のカーブデータから参照したキーフレームの値は編集することができます。
ただしカーブデータを正しく補完するには値の編集後 update() 関数を実行する必要があります。
docs.blender.org
docs.blender.org

・実行例

    # 指定名のアクションを取得する
    target_action = bpy.data.actions.get(arg_actionname)    
    if target_action == None:
        return False
    
    # 指定データパスのカーブを取得する
    target_curve = target_action.fcurves.find(arg_datapathname, index=arg_datapathindex)
    if target_curve == None:
        return False

    # カーブ内の全キーポイントを走査する
    for keyframe_point in target_curve.keyframe_points:
        # キーフレーム内の全インデックスの値を加減算する
        keyframe_point.co[1] += arg_addvalue
    
    # 更新したキーフレームに合わせてカーブを更新する
    target_curve.update()

サンプルスクリプト

スクリプトを実行すると指定したカーブの全インデックスの値に加減算を行い、カーブデータを更新します。
・Script_update_keyframelist_value.py

# bpyインポート
import bpy
# 正規表現を利用するためインポート
import re

# アクションに含まれるカーブを指定して全キーフレームを指定値で更新する
def show_keyframelist_value(arg_actionname:str,
  arg_datapathname:str, arg_datapathindex:int,
  arg_addvalue:float) -> bool:
    """アクションに含まれるカーブを指定して全キーフレームを指定値で更新する

    Keyword Arguments:
        arg_actionname {str} -- 指定アクション名
        arg_datapathname {str} -- 指定データパス名
        arg_datapathindex {int} -- 指定インデックス
        arg_addvalue {float} -- 加減算値

    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)
    if target_curve == None:
        return False

    # カーブ内の全キーポイントを走査する
    for keyframe_point in target_curve.keyframe_points:
        # キーフレーム内の全インデックスの値を加減算する
        # Keyframeアクセスのマニュアル
        # (https://docs.blender.org/api/current/bpy.types.Keyframe.html)
        keyframe_point.co[1] += arg_addvalue
    
    # 更新したキーフレームに合わせてカーブを更新する
    target_curve.update()

    return True

# 関数の実行例
actionname_pattern = r"Action_.*"
datapathname = 'pose.bones["control.forearmIK.L"].location'
datapathindex = 1 # ロケーションの場合 0:Xaxis, 1:Yaxis, 2:Zaxis の対応で値が保持されている
addvalue = 0.2
for action in bpy.data.actions:
    # アクション名が指定の正規表現と一致するか
    if re.fullmatch(actionname_pattern, action.name):
        show_keyframelist_value(arg_actionname=action.name,
          arg_datapathname=datapathname, arg_datapathindex=datapathindex,
          arg_addvalue=addvalue)

actionname_pattern = r"Action_.*"
datapathname = 'pose.bones["control.forearmIK.R"].location'
datapathindex = 1 # ロケーションの場合 0:Xaxis, 1:Yaxis, 2:Zaxis の対応で値が保持されている
addvalue = 0.2
for action in bpy.data.actions:
    # アクション名が指定の正規表現と一致するか
    if re.fullmatch(actionname_pattern, action.name):
        show_keyframelist_value(arg_actionname=action.name,
          arg_datapathname=datapathname, arg_datapathindex=datapathindex,
          arg_addvalue=addvalue)

f:id:bluebirdofoz:20220307222737j:plain