MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その8(ファイルリストへの反復ポリゴン削減)

本日は 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)

f:id:bluebirdofoz:20200102214436j:plain