本日は Blender の技術調査枠です。
Blenderで利用可能なpythonスクリプトを作ります。
bluebirdofoz.hatenablog.com
空マテリアルの削除
指定のオブジェクトからマテリアルが設定されていないからマテリアルを削除します。
delete_materialslot.py
# bpyインポート import bpy # 空のマテリアルスロットを削除する # 引数 arg_objectname:指定オブジェクト名 # 戻り値 def delete_materialslot_none(arg_objectname='Default'): # 指定オブジェクトを取得する targetob = bpy.data.objects[arg_objectname] # 空のマテリアルスロットを削除する for num in range(len(targetob.material_slots))[::-1]: # 削除処理を行うので逆順に要素を追う targetmat=targetob.material_slots[num].material # マテリアルが空であるか if targetmat == None: # 空ならば削除する targetob.active_material_index=num bpy.ops.object.material_slot_remove() return # 関数実行例 delete_materialslot_none('Cube')
類似マテリアルの差し替え
マテリアルスロットに登録されているマテリアルと全マテリアルを比較し、類似するマテリアルがあれば差し替えます。
本スクリプトではディフューズ色のみを比較しています。
material_marge.py
# bpyインポート import bpy # 指定したオブジェクトのマテリアルを類似マテリアルにマージする # マージ条件 # - Diffuse カラー値 # 引数 arg_objectname:指定オブジェクト名 # 戻り値 def material_marge_object(arg_objectname='Default'): # 指定オブジェクトを取得する selectob = bpy.data.objects[arg_objectname] # 変更オブジェクトをアクティブに変更する bpy.context.scene.objects.active = selectob # オブジェクトがメッシュならマージ処理を実行する if selectob.type == 'MESH': # オブジェクトのマテリアルスロットを走査する for material_slot in selectob.material_slots: # スロットのマテリアルを取得 checkmat = material_slot.material # マテリアルのディフューズ色を取得 check_diffuse_color = checkmat.diffuse_color # 全マテリアルデータを走査する for compmat in bpy.data.materials: # 一致マテリアルを検出する前に自身がリストに出た場合 # マージ処理を行わない if checkmat.name == compmat.name: break # 一致確認フラグ match_flg = True # ディフューズ色を比較 if checkmat.diffuse_color != compmat.diffuse_color: # 不一致判定 match_flg = False # 最終的なマテリアルの一致判定 if match_flg: print('match') # マテリアルを一致したものに差し替え material_slot.material = compmat # マージ処理を終了する break else: print('nonmatch') return # 関数の実行例 for ob in bpy.context.scene.objects: material_marge_object(ob.name)