本日はモンスター型モデルの作成枠です。
全アニメーションデータがループになるよう修正する作業を行ったので記事として記録します。
前回記事
以下の前回記事の続きです。
bluebirdofoz.hatenablog.com
発生した問題と対処
前回記事でアニメーションの修正を手動で行ったところ、アニメーションの開始フレームと終了フレームに差異があるものが発生しました。
手動で修正をかけるのは手間だったため、以下のような全アニメーションデータの開始フレームと終了フレームを一致させるスクリプトを作成しました。
・Script_action_edit_allactions.py
# bpyインポート import bpy # 正規表現を利用するためインポート import re # 指定のアクションに含まれる全カーブの最後の値を最初の値と同じにする def update_keyframe_startend_samevalue(arg_actionname:str) -> 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) for target_curve in target_action.fcurves: # キーフレームの数を取得する keyframecount = len(target_curve.keyframe_points) # キーフレームの数が 2 つ以上か if keyframecount > 1: # キーフレームの最初の値を取得する # Keyframeアクセスのマニュアル # (https://docs.blender.org/api/current/bpy.types.Keyframe.html) firstvalue = target_curve.keyframe_points[0].co[1] # 最後の値を最初の値で上書きする target_curve.keyframe_points[keyframecount - 1].co[1] = firstvalue # 更新したキーフレームに合わせてカーブを更新する target_curve.update() return True # 関数の実行例 actionname_pattern = r"Action_.*" for action in bpy.data.actions: # アクション名が指定の正規表現と一致するか if re.fullmatch(actionname_pattern, action.name): # 指定のアクションをループアクションにする update_keyframe_startend_samevalue(arg_actionname=action.name) print("change action : " + action.name)
本スクリプトを実行すると全アニメーションデータの登録済みのキーフレームの開始フレームと終了フレームの値を同一にします。
これにより、アニメーションが綺麗にループするようになります。