本日は Blender の技術調査枠です。
Blender3.0で利用可能なpythonスクリプトを作ります。
指定アーマチュアのポーズを左右反転する
ポーズを左右(X軸)反転させるには bpy.ops.pose.copy オペレータでボーンの状態をコピーした後、bpy.ops.pose.paste オペレータを使うことで反転ペーストができます。
bpy.ops.pose オペレータはポーズモードでのみ利用可能です。
docs.blender.org
bpy.ops.pose.paste オペレータの flipped 変数を True にして実行すると X 軸で反転して貼り付けが行われます。
docs.blender.org
サンプルスクリプト
対象オブジェクトがアーマチュアオブジェクトかつポーズモードであればオブジェクト内のボーンを全て左右反転します。
・Script_inversion_boneall.py
# bpyインポート import bpy # 対象オブジェクトのボーンを全て反転する def inversion_boneall(arg_targetobject:bpy.types.Object) -> bool: """対象オブジェクトのボーンを全て反転する Keyword Arguments: arg_targetobject {bpy.types.Object} -- 対象オブジェクト Returns: bool -- 実行の正否 """ # 指定オブジェクトがアーマチュアか確認する # オブジェクトタイプの一覧 # (https://docs.blender.org/api/current/bpy.types.Object.html#bpy.types.Object.type) if arg_targetobject.type != 'ARMATURE': # アーマチュアでない場合はボーンを選択しない return False # 現在のモードがポーズモードかチェックする(反転には 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.ops.pose.copy() # ポーズを反転して貼り付けを行う bpy.ops.pose.paste(flipped=True) 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) # 関数の実行例 # 対象オブジェクトがアーマチュアオブジェクトであればオブジェクト内のボーンを全て選択する inversion_boneall(arg_targetobject=bpy.data.objects.get("metarig"))