MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その116(オペレータからポーズのキーフレームを登録する)

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

オペレータからポーズのキーフレームを登録する

キーフレームを登録するには bpy.ops.anim.keyframe_insert_menu オペレータを利用します。
type 引数の指定により登録するキーフレームの種別を切り替え可能です。
docs.blender.org

本サンプルスクリプトではフレーム位置を変更する際、即時切り替えのため frame_set オペレータを利用しています。
docs.blender.org

キーフレームの登録先となるアクションは Armature オブジェクトの animation_data に設定されているアクションです。
docs.blender.org

サンプルスクリプト

アーマチュアオブジェクト、アクション、フレーム位置を指定することでそのアーマチュアオブジェクトの現在のポーズ(位置・回転)をキーフレームに登録します。
・Script_keyframe_insert.py

# bpyインポート
import bpy

# アニメーションデータに対象オブジェクトのボーン位置と回転をキーフレームに登録する
def keyframe_insert(
    arg_targetobject:bpy.types.Object,
    arg_targetaction:bpy.types.Action,
    arg_framenumber:int) -> bool:
    """アニメーションデータに対象オブジェクトのボーン位置と回転をキーフレームに登録する

    Keyword Arguments:
        arg_targetobject {bpy.types.Object} -- 対象オブジェクト
        arg_targetaction {bpy.types.Action} -- 対象アクションデータ
        arg_framenumber {int} -- 指定フレーム番号

    Returns:
        bool -- 実行の正否
    """

    # 引数のNoneチェック
    if arg_targetobject == None:
        return False
    if arg_targetaction == None:
        return False

    # 指定オブジェクトがアーマチュアか確認する
    # オブジェクトタイプの一覧
    # (https://docs.blender.org/api/current/bpy.types.Object.html#bpy.types.Object.type)
    if arg_targetobject.type != 'ARMATURE':
        # アーマチュアでない場合はボーンを選択しない
        return False

    # アクションデータを現在のアーマチュアに設定する
    arg_targetobject.animation_data.action = arg_targetaction

    # 現在のモードがポーズモードかチェックする(反転には bpy.ops.pose 関数を利用するため)
    is_posemode = is_posemode_object(arg_targetobject)
    if not is_posemode:
        # ポーズモードでない場合はボーンを反転しない
        return False
    
    # アーマチュア内の全ボーンを選択状態にする(有効状態のレイヤー内のボーンのみ対象)
    # アーマチュア操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.Armature.html#bpy.types.Armature.bones)
    for bone in arg_targetobject.data.bones:
        # 選択状態に設定する
        # ボーン操作のマニュアル
        # (https://docs.blender.org/api/current/bpy.types.Bone.html)
        bone.select = True

    # 指定のフレーム番号を設定する
    bpy.context.scene.frame_set(arg_framenumber)

    # 選択中のボーンの位置・回転をキーフレームに挿入する
    bpy.ops.anim.keyframe_insert_menu(type='BUILTIN_KSI_LocRot')

    return True

# 指定のオブジェクトがポーズモードかチェックする
def is_posemode_object(arg_checkobject:bpy.types.Object) -> bool:
    """指定のオブジェクトがポーズモードかチェックする
    
    Keyword Arguments:
        arg_checkobject {bpy.types.Object} -- チェック対象オブジェクト

    Returns:
        bool -- ポーズモードか否か
    """

    # オブジェクト毎のモードをチェックする
    # (https://docs.blender.org/api/current/bpy.types.Object.html#bpy.types.Object.mode)
    return ('POSE' == arg_checkobject.mode)


# 関数の実行例
# アニメーションデータに対象オブジェクトのボーン位置と回転をキーフレームに登録する
keyframe_insert(
    arg_targetobject=bpy.data.objects.get("metarig"),
    arg_targetaction=bpy.data.actions.get("NewAction"),
    arg_framenumber=0
    )

f:id:bluebirdofoz:20220324234054j:plain
f:id:bluebirdofoz:20220324234102j:plain