MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その115(指定アーマチュアのポーズを左右反転する)

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

f:id:bluebirdofoz:20220320042509j:plain
f:id:bluebirdofoz:20220320042517j:plain