MRが楽しい

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

Blenderで利用可能なpythonスクリプトを作る その23(モディファイアの適用と並べ替え)

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

モディファイアの適用

指定のオブジェクトのミラーまたは細分割曲面モディファイアを適用します。
modifier_apply.py

# bpyインポート
import bpy

# 以下のモディファイアを適用する
# - ミラーモディファイア
# - 細分割曲面モディファイア
#   対象モディファイアを保持しない場合は無視する
# 引数   arg_target_meshs:操作対象オブジェクト名リスト
# 戻り値
def apply_modifier_targetlist(arg_target_meshs=[]):
  # リストのメッシュを全て走査する
  for mesh in arg_target_meshs:
    # 指定オブジェクトを取得する
    selectob = bpy.data.objects[mesh]
    # 変更オブジェクトをアクティブに変更する
    bpy.context.scene.objects.active = selectob
    # オブジェクトの全てモディファイアを走査する
    # モディファイアのタイプ一覧
    # (https://docs.blender.org/api/blender_python_api_2_71_release/bpy.types.Modifier.html)
    for modifier in selectob.modifiers:
      # ミラーモディファイアを適用する
      if modifier.type == 'MIRROR':
        bpy.ops.object.modifier_apply(apply_as='DATA',modifier=modifier.name)
      # 細分割曲面モディファイアを適用する
      if modifier.type == 'SUBSURF':
        bpy.ops.object.modifier_apply(apply_as='DATA',modifier=modifier.name)
  return


# 関数の実行例
apply_modifier_targetlist(['Cube'])

f:id:bluebirdofoz:20190715173407j:plain

モディファイアの並べ替え

指定のオブジェクトのミラーモディファイアをリスト上位に並べ替えます。
modifier_apply.py

# bpyインポート
import bpy

# ミラーモディファイアをリストの先頭に移動する
#   対象モディファイアを保持しない場合は無視する
# 引数   arg_target_meshs:操作対象オブジェクト名リスト
# 戻り値
def moveup_mirror_modifier(arg_target_meshs=[]):
  # リストのメッシュを全て走査する
  for mesh in arg_target_meshs:
    # 指定オブジェクトを取得する
    selectob = bpy.data.objects[mesh]
    # 変更オブジェクトをアクティブに変更する
    bpy.context.scene.objects.active = selectob
    # オブジェクトに設定中のモディファイア数を取得する
    modifier_num = len(selectob.modifiers)
    # 走査中のモディファイア位置を記録する(先頭から開始)
    check_num = 0
    # 全てのモディファイアを走査する
    while modifier_num > check_num:
      # ミラーモディファイアかチェックする
      if selectob.modifiers[check_num].type == 'MIRROR':
        # 操作中インデックスを保存する
        loop_num = check_num
        # 対象モディファイアなら先頭インデックスに移動する
        while check_num > 0:
          # ループ回避のため、上位モディファイアが同じモディファイアでないことを確認する
          if selectob.modifiers[check_num - 1].type != 'MIRROR':
            # モディファイア名を取得する
            name = selectob.modifiers[check_num].name
            # モディファイアを上位に移動する
            bpy.ops.object.modifier_move_up(modifier=name)
            # アクティブモディファイアを合わせて上位に移動する
            check_num = check_num - 1
          else:
            # 上位モディファイアが同じモディファイアなら処理を終了する
            break
      # 走査位置を移動する
      check_num = check_num + 1
  return


# 関数の実行例
moveup_mirror_modifier(['Cube'])

f:id:bluebirdofoz:20190715173422j:plain