MRが楽しい

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

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

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

指定ボーンのエディットボーン情報を参照する

ボーンの編集データは bpy.types.EditBone データで参照できます。
編集データではボーンのヘッドやテールの位置情報を参照したりすることができます。
docs.blender.org
docs.blender.org
docs.blender.org

サンプルスクリプト

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

# bpyインポート
import bpy

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

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

    Returns:
        bpy.types.EditBone -- 編集ボーン情報
    """

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

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

    return target_editbone

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