MRが楽しい

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

Blender2.8でモンスター型のキャラクターモデルを作成する その12(全アニメーションデータがループになるよう修正する)

本日はモンスター型モデルの作成枠です。
全アニメーションデータがループになるよう修正する作業を行ったので記事として記録します。

前回記事

以下の前回記事の続きです。
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)

スクリプトを実行すると全アニメーションデータの登録済みのキーフレームの開始フレームと終了フレームの値を同一にします。
これにより、アニメーションが綺麗にループするようになります。