MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その31(ポリゴン数指定のリダクション)

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

ポリゴン数を指定してリダクションする

対象オブジェクトを指定のポリゴン数以下に削減します。
リダクション前に「三角面化」モディファイアを適用します。
・apply_decimate_meshcount.py

# bpyインポート
import bpy

# 対象オブジェクトを指定のポリゴン数まで削減する
# モディファイア追加の種類とマニュアル
# (https://docs.blender.org/api/current/bpy.ops.object.html#bpy.ops.object.gpencil_modifier_add)
def apply_decimate_meshcount(arg_objectname="Default", arg_targetmeshcount=10000) -> bool:
    """対象オブジェクトを指定のポリゴン数まで削減する

    Keyword Arguments:
        arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"})
        arg_targetmeshcount {int} -- 削減後の指定ポリゴン数 (default: {10000})

    Returns:
        Bool -- 実行正否
    """

    # 指定オブジェクトを取得する
    # (get関数は対象が存在しない場合 None が返る)
    selectob = bpy.data.objects.get(arg_objectname)

    # 指定オブジェクトが存在するか確認する
    if selectob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False

    # 変更オブジェクトをアクティブに変更する
    bpy.context.view_layer.objects.active = selectob

    # 「三角面化」モディファイアを追加する
    # 三角面化モディファイアのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.TriangulateModifier.html)
    bpy.ops.object.modifier_add(type='TRIANGULATE')

    # 追加されたモディファイアを取得する
    trian_modifier = selectob.modifiers[-1]

    # 「三角面化」モディファイアを適用する
    bpy.ops.object.modifier_apply(apply_as='DATA',modifier=trian_modifier.name)

    # 「ポリゴン数削減」モディファイアを追加する
    # ポリゴン数削減モディファイアのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.DecimateModifier.html)
    bpy.ops.object.modifier_add(type='DECIMATE')

    # 追加されたモディファイアを取得する
    decimate_modifier = selectob.modifiers[-1]

    # 現在のポリゴン数を取得する
    current_meshcount = decimate_modifier.face_count

    # 指定のポリゴン数より現在のポリゴン数が多いか確認する
    if current_meshcount > arg_targetmeshcount:
        # 指定のポリゴン数まで削減するための比率を計算する
        target_ratio = arg_targetmeshcount / current_meshcount

        # 削減の比率を設定する
        decimate_modifier.ratio = target_ratio

    # 「ポリゴン数削減」モディファイアを適用する
    bpy.ops.object.modifier_apply(apply_as='DATA',modifier=decimate_modifier.name)
    
    return True

# 関数の実行例
apply_decimate_meshcount(arg_objectname="Sphere", arg_targetmeshcount=10000)

f:id:bluebirdofoz:20200522211054j:plain
f:id:bluebirdofoz:20200522211103j:plain