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