MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その125(指定ボーンのポーズ情報を参照する)

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

指定ボーンのポーズ情報を参照する

ボーンのポーズ情報は bpy.types.Bone データからは参照できません。
アーマチュアオブジェクトに含まれる pose 変数から bpy.types.PoseBone データを参照する必要があります。
docs.blender.org
docs.blender.org
docs.blender.org

サンプルスクリプト

アーマチュアオブジェクトとボーン名を指定すると、指定のポーズボーンデータの参照を取得できます。
・Script_sow_bone_target_posebone.py

# bpyインポート
import bpy

# アーマチュア内の指定ボーンのポーズボーン情報を参照する
def select_posebone_target(arg_targetobject:bpy.types.Object, arg_bonename:str) -> bpy.types.PoseBone:
    """アーマチュア内の指定ボーンのポーズボーン情報を参照する

    Keyword Arguments:
        arg_targetobject {bpy.types.Object} -- 対象オブジェクト
        arg_bonename {str} -- 対象ボーン名

    Returns:
        bpy.types.PoseBone -- ポーズボーン情報
    """

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

    # アーマチュア内のポーズデータの指定ボーンを取得する
    target_posebone = arg_targetobject.pose.bones.get(arg_bonename)
    if target_posebone == None:
        # ボーンを取得できない場合は処理を終了する
        return None

    return target_posebone

# 関数の実行例
# 指定アーマチュア内の指定ボーンを参照する
get_posebone = select_posebone_target(
    arg_targetobject=bpy.data.objects.get("metarig"),
    arg_bonename="control.BodyIK")
# 取得したボーン名を表示する
# ポーズボーン操作のマニュアル
# (https://docs.blender.org/api/3.0/bpy.types.PoseBone.html)
print(f"Bone : name = {get_posebone.name} , length = {get_posebone.length:.05f}")
# ポーズデータの座標と回転を参照する
print("PoseBone location : "
  + f"{get_posebone.location[0]:.05f} ,"
  + f"{get_posebone.location[1]:.05f} ,"
  + f"{get_posebone.location[2]:.05f}")
print("PoseBone rotation_quaternion : "
  + f"{get_posebone.rotation_quaternion[0]:.05f} ,"
  + f"{get_posebone.rotation_quaternion[1]:.05f} ,"
  + f"{get_posebone.rotation_quaternion[2]:.05f} ,"
  + f"{get_posebone.rotation_quaternion[3]:.05f}")