本日は Blender の技術調査枠です。
Blender3.0で利用可能なpythonスクリプトを作ります。
アクションデータ内のカーブをランダムにバラツキを与えて更新する
本記事のスクリプトは以下のスクリプトを改変して作成しました。
利用関数の詳細はこちらを参照ください。
bluebirdofoz.hatenablog.com
サンプルデータには以下の記事で作成した全フレームにキーフレームを設定したプロジェクトを利用します。
bluebirdofoz.hatenablog.com
またランダム値の生成には random.uniform 関数を利用しました。
camp.trainocate.co.jp
サンプルスクリプト
スクリプトを実行すると指定したカーブの全インデックスの値に指定範囲のランダム値の加減算を行い、カーブデータを更新します。
・Script_update_keyframelist_randomvalue.py
# bpyインポート import bpy # ランダム値生成のため import random # アクションに含まれるカーブを指定して全キーフレームを指定値で更新する def update_keyframelist_randomvalue(arg_actionname:str, arg_datapathname:str, arg_datapathindex:int, arg_minvalue:float, arg_maxvalue:float) -> bool: """アクションに含まれるカーブを指定して全キーフレームを指定範囲のランダム値で更新する Keyword Arguments: arg_actionname {str} -- 指定アクション名 arg_datapathname {str} -- 指定データパス名 arg_datapathindex {int} -- 指定インデックス arg_minvalue {float} -- ランダム加減算最小値 arg_maxvalue {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] += random.uniform(minvalue, maxvalue) # 更新したキーフレームに合わせてカーブを更新する target_curve.update() return True # 関数の実行例 actionname = "CubeAction2" datapathname = 'location' datapathindex = 2 # ロケーションの場合 0:Xaxis, 1:Yaxis, 2:Zaxis の対応で値が保持されている minvalue = -0.1 maxvalue = 0.1 # カーブをランダムに加減する update_keyframelist_randomvalue(arg_actionname=actionname, arg_datapathname=datapathname, arg_datapathindex=datapathindex, arg_minvalue=minvalue, arg_maxvalue=maxvalue)