本日は 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"])
関連付けの解除
指定のオブジェクトのペアレントを解除します。
同時に、ペアレントに関連するモディファイアも全て解除されます。
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"])