MRが楽しい

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

Blenderで利用可能なpythonスクリプトを作る その7(ファイルリストへの反復処理)

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

ファイルリストへの反復処理

ファイルリストのFBXファイルを読み込み、処理を行います。
本例では、ポリゴン数削減を行い、別名のFBXファイルとして出力します。
・decimate_fbx_filelist.py

# bpyインポート
import bpy

# 「ポリゴン数削減」モディファイアの反映
# 引数   arg_objectname      :指定オブジェクト名
#        arg_ratio           :削減比率
# 戻り値
def apply_modifier_decimate(arg_objectname='Default',arg_ratio=1.0):
  # 他のオブジェクトにモディファイアを適用しないよう全てのオブジェクトを走査する
  for ob in bpy.context.scene.objects:
    # 非選択状態に設定する
    ob.select=False
  # 指定オブジェクトを取得する
  selectob = bpy.data.objects[arg_objectname]
  # 変更オブジェクトをアクティブに変更する
  bpy.context.scene.objects.active = selectob
  # 変更オブジェクトを選択状態にする  
  selectob.select=True
  # 「ポリゴン数削減」モディファイアを追加する
  bpy.ops.object.modifier_add(type='DECIMATE')
  # 作成モディファイアを取得する
  selectmod = selectob.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

# FBXファイルのインポート
# 引数   arg_filepath:ファイルパス
# 戻り値
def fbx_import_file(arg_filepath='D:\BlenderDir\Script\Default.fbx'):
  bpy.ops.import_scene.fbx(filepath=arg_filepath)
  return

# FBXファイル(ジオメトリ形式)でのエクスポート
# 引数   arg_filepath:ファイルパス
# 戻り値
def fbx_export_geometry(arg_filepath='D:\BlenderDir\Script\Default.fbx'):
  # 現在のオブジェクトを以下のFBXファイルで出力する
  # バージョン:FBX 7.4 バイナリ
  # 形式:ジオメトリ
  # モディファイアーを適用:チェック
  # モデイファイアーのレンダー設定を使用:チェック
  # スムージン:法線のみ
  # 孤立する辺:チェック無し
  # タンジェント空間:チェック無し
  bpy.ops.export_scene.fbx(\
    filepath=arg_filepath,\
    version='BIN7400',\
    ui_tab='GEOMETRY',\
    use_mesh_modifiers=True,\
    use_mesh_modifiers_render=True,\
    mesh_smooth_type='OFF')
  return

# 指定オブジェクトの削除
# 引数   arg_deletename:削除オブジェクトの名前
# 戻り値
def delete_data_object(arg_deletename='defaultname'):
  # 削除オブジェクトを取得する
  deleteob = bpy.data.objects[arg_deletename]
  # オブジェクトを削除する
  bpy.data.objects.remove(deleteob)
  return


# 関数の実行例
# 処理ディレクトリの指定
fbx_filedir = 'D:\BlenderDir\Script\TestDir'
# ファイルリストの指定(拡張子(.fbx)はスクリプト内で付与される)
filename_list = [\
  'Model_01',\
  'Model_02'\
]
# 削減比率の指定
decimate_ratio = 0.1

# ファイルリストのファイルに処理を実行する
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)

f:id:bluebirdofoz:20180517235234j:plain