MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その19(メッシュオブジェクトとアーマチュアの関連付け)

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

メッシュオブジェクトとアーマチュアの関連付け

指定のメッシュオブジェクトと指定のアーマチュアの関連付けを行います。
set_parent_armature.py

# bpyインポート
import bpy

# メッシュオブジェクトとアーマチュアの関連付けを行う
def set_parent_armature(arg_armaturename="Default", arg_meshnames=[]) -> bool:
    """メッシュオブジェクトとアーマチュアの関連付けを行う
    
    Keyword Arguments:
        arg_armaturename {str} -- 対象アーマチュアオブジェクト名 (default: {"Default"})
        arg_meshnames {list} -- 対象メッシュオブジェクト名リスト (default: {[]})

    Returns:
        bool -- 実行の正否
    """

    # 全てのオブジェクトを走査する
    for ob in bpy.context.scene.objects:
        # 非選択状態に設定する
        ob.select_set(False)

    # 指定オブジェクトを全てチェックする
    for check_objname in arg_meshnames:
        # 指定オブジェクトを取得する
        # (get関数は対象が存在しない場合 None が返る)
        selectob = bpy.data.objects.get(check_objname)

        # 指定オブジェクトが存在するか確認する
        if selectob == None:
            # 指定オブジェクトが存在しない場合は処理しない
            return False

        # メッシュオブジェクトであるか確認する        
        if selectob.type == 'MESH':
            # オブジェクトを選択状態にする
            selectob.select_set(True)

    # 指定アーマチュアオブジェクトを取得する
    # (get関数は対象が存在しない場合 None が返る)
    parentob = bpy.data.objects.get(arg_armaturename)

    # 指定オブジェクトが存在するか確認する
    if parentob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False

    # アーマチュアオブジェクトであるか確認する        
    if parentob.type == 'ARMATURE':
        # オブジェクトを選択状態にする
        parentob.select_set(True)

        # オブジェクトをアクティブにする
        bpy.context.view_layer.objects.active = parentob
        
        # アーマチュアの関連付けを実行する
        bpy.ops.object.parent_set(type='ARMATURE')

    return True


# 関数の実行例
set_parent_armature("metarig",
  ["Arm_Hand_HP","Arm_Lower_HP","Arm_Upper_HP"
  ,"ArmClaw","ArmClawSphere","Body_Chest_HP","Body_Hip_HP"
  ,"Eye_Hitomi","Eye_Trans_LD","Fang_Lower","Fang_Upper"
  ,"Head_HP","HeadAntenna","HeadArmor"
  ,"Leg_Lower_HP","Leg_Toes_HP","Leg_Upper_HP"
  ,"LegClaw","LegClawSphere","ZFur_Body","ZFur_Tail"])

f:id:bluebirdofoz:20200425214802j:plain

関連付けの解除

指定のオブジェクトのペアレントを解除します。
同時に、ペアレントに関連するモディファイアも全て解除されます。
clear_parent_meshs.py

# bpyインポート
import bpy

# 指定のオブジェクトのペアレントを解除する
def clear_parent_objects(arg_objectnames=[]) -> bool:
    """指定のオブジェクトのペアレントを解除する
    
    Keyword Arguments:
        arg_objectnames {list} -- 対象オブジェクト名リスト (default: {[]})

    Returns:
        bool -- 実行の正否
    """

    # 全てのオブジェクトを走査する
    for ob in bpy.context.scene.objects:
        # 非選択状態に設定する
        ob.select_set(False)

    # 指定オブジェクトを全てチェックする
    for check_objname in arg_objectnames:
        # 指定オブジェクトを取得する
        # (get関数は対象が存在しない場合 None が返る)
        selectob = bpy.data.objects.get(check_objname)

        # 指定オブジェクトが存在するか確認する
        if selectob == None:
            # 指定オブジェクトが存在しない場合は処理しない
            return False
    
        # オブジェクトを選択状態にする
        selectob.select_set(True)

    # 選択中のオブジェクトのペアレントを解除する
    bpy.ops.object.parent_clear(type='CLEAR')

    return True


# 関数の実行例
clear_parent_objects(
  ["Arm_Hand_HP","Arm_Lower_HP","Arm_Upper_HP"
  ,"ArmClaw","ArmClawSphere","Body_Chest_HP","Body_Hip_HP"
  ,"Eye_Hitomi","Eye_Trans_LD","Fang_Lower","Fang_Upper"
  ,"Head_HP","HeadAntenna","HeadArmor"
  ,"Leg_Lower_HP","Leg_Toes_HP","Leg_Upper_HP"
  ,"LegClaw","LegClawSphere","ZFur_Body","ZFur_Tail"])

f:id:bluebirdofoz:20200425214816j:plain