本日は Blender の技術調査枠です。
Blender2.8で利用可能なpythonスクリプトを作ります。
bluebirdofoz.hatenablog.com
ファイルリストへの反復ポリゴン削減
ファイルリストのFBXファイルを読み込み、処理を行います。
本例では、ポリゴン数削減を行い、別名のFBXファイルとして出力します。
・decimate_fbx_filelist.py
# bpyインポート import bpy # 「ポリゴン数削減」モディファイアの反映 def apply_modifier_decimate(arg_objectname="Default", arg_ratio=1.0) -> bool: """「ポリゴン数削減」モディファイアの反映 Keyword Arguments: arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"}) arg_ratio {float} -- 削減比率 (default: {1.0}) Returns: bool -- 実行の正否 """ # 指定オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) targetob = bpy.data.objects.get(arg_objectname) # 指定オブジェクトが存在するか確認する if targetob == None: # 指定オブジェクトが存在しない場合は処理しない return False # 変更オブジェクトをアクティブに変更する bpy.context.view_layer.objects.active = targetob # 「ポリゴン数削減」モディファイアを追加する bpy.ops.object.modifier_add(type='DECIMATE') # 作成モディファイアを取得する selectmod = targetob.modifiers['Decimate'] # 名前を指定オブジェクト名+「_Decimate」に設定する selectmod.name = arg_objectname + '_Decimate' # 削減設定を「束ねる」に設定する selectmod.decimate_type = 'COLLAPSE' # 比率を設定する selectmod.ratio = arg_ratio # 三角面化の実行を有効に設定する selectmod.use_collapse_triangulate = True # モディファイアを反映する bpy.ops.object.modifier_apply( modifier = arg_objectname + '_Decimate' ) return True # FBXファイルのインポート def fbx_import_file(arg_filepath="C:\\Models\\FBX\\Default.fbx") -> bool: """FBXファイルのインポート Keyword Arguments: arg_filepath {str} -- ファイルパス (default: {"C:\\Models\\FBX\\Default.fbx"}) Returns: bool -- 実行の正否 """ bpy.ops.import_scene.fbx(filepath=arg_filepath) return True # FBXファイル(ジオメトリ形式)でのエクスポート def fbx_export_geometry(arg_filepath="C:\\Models\\FBX\\Default.fbx") -> bool: """FBXファイル(ジオメトリ形式)でのエクスポート Keyword Arguments: arg_filepath {str} -- ファイルパス (default: {"C:\\Models\\FBX\\Default.fbx"}) Returns: bool -- 実行の正否 """ # 現在のオブジェクトを以下のFBXファイルで出力する # バージョン:FBX 7.4 バイナリ # 形式:ジオメトリ # モディファイアーを適用:チェック # モデイファイアーのレンダー設定を使用:チェック # スムージン:法線のみ # 孤立する辺:チェック無し # タンジェント空間:チェック無し bpy.ops.export_scene.fbx(\ filepath=arg_filepath,\ ui_tab='GEOMETRY',\ use_mesh_modifiers=True,\ use_mesh_modifiers_render=True,\ mesh_smooth_type='OFF') return True # 指定オブジェクトの削除 def delete_data_object(arg_deletename='defaultname') -> bool: """指定オブジェクトの削除 Keyword Arguments: arg_deletename {str} -- 削除対象オブジェくト名 (default: {'defaultname'}) Returns: bool -- 実行の正否 """ # 削除オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) targetob = bpy.data.objects.get(arg_deletename) # 指定オブジェクトが存在するか確認する if targetob == None: # 指定オブジェクトが存在しない場合は処理しない return False # オブジェクトを削除する bpy.data.objects.remove(targetob) return True # 関数の実行例 # 処理ディレクトリの指定 fbx_filedir = "C:\\Models\\FBX" # ファイルリストの指定(拡張子(.fbx)はスクリプト内で付与される) filename_list = [\ "Sphere",\ "Suzanne"\ ] # 削減比率の指定 decimate_ratio = 0.5 # ファイルリストのファイルに処理を実行する for filename in filename_list: # 入力ファイルパスを作成する import_filepath = fbx_filedir + "\\" + filename + ".fbx" # 出力ファイルパスを作成する export_filepath = fbx_filedir + "\\" + filename + "_decimated.fbx" # FBXファイルをインポートする fbx_import_file(import_filepath) # 全メッシュデータを取得する for obj in bpy.data.objects: if obj.type == 'MESH': # ポリゴン数削減処理を行う apply_modifier_decimate(obj.name,decimate_ratio) # FBXファイルをエクスポートする fbx_export_geometry(export_filepath) # 全メッシュデータを取得する for obj in bpy.data.objects: if obj.type == 'MESH': # オブジェクトを削除する delete_data_object(obj.name)