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