MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その133(アクションデータ内のカーブをランダムにバラツキを与えて更新する)

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