MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その110(アクションデータの最初と最後の状態を同じにする)

本日は Blender の技術調査枠です。
Blender3.0で利用可能なpythonスクリプトを作ります。

アクションデータの最初と最後の状態を同じにする

アクションデータにはアクションの動きを示すカーブデータが含まれています。
カーブデータ内の全キーフレームをチェックして最初と最後の値を同じにすることでループ時に違和感のないアクションデータを作成できます。
docs.blender.org
docs.blender.org

サンプルスクリプト

スクリプトを実行すると指定したアクション内に含まれる全てのカーブデータの最初と最後の値が同じ値に後進されます。
・Script_action_edit.py

# bpyインポート
import bpy

# 指定のアクションに含まれる全カーブの最後の値を最初の値と同じにする
def update_keyframe_startend_samevalue(arg_actionname:str) -> bool:
    """指定のアクションに含まれる全カーブの最後の値を最初の値と同じにする

    Keyword Arguments:
        arg_actionname {str} -- 指定アクション名

    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 = 'Action_Wait'
update_keyframe_startend_samevalue(arg_actionname=actionname)

f:id:bluebirdofoz:20220309234151j:plain