bpy(Blender Python API)を用いたモディファイア(非破壊的効果)の追加と、モディファイア管理の基本的な操作方法について、学んだことをまとめておきます。
モディファイアを用いることでオブジェクトのメッシュに直接的に変更を加えず、形状を変化させることができます。
動作確認環境 : Blender 5.2.0 LTS
モディファイアの適用前に、全適用(全トランスフォーム)を行うことでモディファイア適用時の不自然さやアンバランスさが生じる現象を防ぐことができます。
あわせてこちらもご確認ください。
▼全トランスフォーム
ベベルモディファイアを用いて、角ばったオブジェクトの面取りを行い、全体的に滑らかな丸みを帯びた形にすることができます。
使用例 :

Python :
segmentsで角を丸めるときの面の数、widthで面取りの幅(値が大きいほど面取りが広くなる)を指定しています。
Arrayモディファイアを用いると、規則的にオブジェクトを並べることができます。
大量のオブジェクトを1つずつ複製して並べるのに比べて、大幅に記述量を減らすことができます。
使用例 :

Python :
ここでは2つのArrayモディファイアを追加しています。1つ目のArrayモディファイアでX軸方向にオブジェクトを並べ、2つ目のArrayモディファイアを重ねて追加し、先ほどX軸方向に並べたオブジェクトをY軸方向に並べています。
Solidifyモディファイアを追加することで、メッシュに厚みを付けることができます。
使用例 :

Python :
▼element_select
厚みを付ける方向や、厚みを調節することも可能です。
ベベルモディファイアなどと合わせて用いて、トレーや、鉢、コップのような縁のあるオブジェクトの作成に使い勝手が良いです。
複数のモディファイアを使用する際には、適用する優先順位を指定することも必要です。優先順位の付け方については、こちらの優先順序付けの章を参考にしてみてください。
追加したあとの効果はArrayモディファイアと似ていますが、こちらはある位置を基準にした時のオブジェクトの複製を行います。
片一方のオブジェクトを編集するとミラーリングしたオブジェクトにも影響するため、キャラクターモデリングなど、左右対称のオブジェクトを編集する際に使用されているのをよく見かけます。
使用例

Python :
この例では、X軸方向とY軸方向のミラーリングを有効化し、cube_00を基準にcube_01をミラーリングしています。
モディファイアを追加するだけだと、オブジェクトのメッシュには影響が無く非破壊的です。
モディファイアをオブジェクトに適用することで、オブジェクトのメッシュに直接影響を与えます。UV展開を行う必要がある際などに使用します。
Python :
モディファイア名を指定して、上記のように適用するための一文を加えます。
オブジェクトの複製で不要なモディファイアがオブジェクトに追加されている場合など、必要のないモディファイアを削除する時には次のようにします。
Python :
複数モディファイアを追加したときに、それぞれがどのような優先度になるかを指定します。
優先度によって結果も変わってきますので、慎重に設定しておく必要があります。
Python :
この例では"index"に0を指定して、優先度を最優先にしています。これらの値を変えることで優先度を調節することができます。
例:
モディファイアの適用方法、モディファイアの種類には様々あるので追記できることがあれば追記していきます。
以上
モディファイアを用いることでオブジェクトのメッシュに直接的に変更を加えず、形状を変化させることができます。
動作確認環境 : Blender 5.2.0 LTS
モディファイアの適用前に、全適用(全トランスフォーム)を行うことでモディファイア適用時の不自然さやアンバランスさが生じる現象を防ぐことができます。
あわせてこちらもご確認ください。
▼全トランスフォーム
ベベルモディファイア追加
ベベルモディファイアを用いて、角ばったオブジェクトの面取りを行い、全体的に滑らかな丸みを帯びた形にすることができます。
使用例 :

Python :
def Base_create():
bpy.ops.object.mode_set(mode='OBJECT')
# 立方体を追加
bpy.ops.mesh.primitive_cube_add(
size=2
, location=(0, 0, 0)
, scale=(1,1,1)
)
# 名前変更
bpy.context.object.name = "Cube_00"
# -----------------------
# モディファイア
# -----------------------
# ベベル
bpy.ops.object.modifier_add(type='BEVEL')
# モディファイア:名前変更
bpy.context.object.modifiers["Bevel"].name = "Bevel_00"
bpy.context.object.modifiers["Bevel_00"].affect = 'EDGES'
# セグメント(面取り数、値が大きいほど滑らか)
bpy.context.object.modifiers["Bevel_00"].segments = 10
# 面取りの幅
bpy.context.object.modifiers["Bevel_00"].width = 0.1
Base_create()segmentsで角を丸めるときの面の数、widthで面取りの幅(値が大きいほど面取りが広くなる)を指定しています。
配列モディファイア追加
Arrayモディファイアを用いると、規則的にオブジェクトを並べることができます。
大量のオブジェクトを1つずつ複製して並べるのに比べて、大幅に記述量を減らすことができます。
使用例 :

Python :
def Base_create():
bpy.ops.object.mode_set(mode='OBJECT')
# 立方体を追加
bpy.ops.mesh.primitive_cube_add(
size=2
, location=(0, 0, 0)
, scale=(1,1,1)
)
# 名前変更
bpy.context.object.name = "Cube_00"
# -----------------------
# モディファイア
# -----------------------
# 1つ目の配列モディファイア追加 (X軸方向に5個並べる)
bpy.ops.object.modifier_add(type='ARRAY')
bpy.context.object.modifiers["Array"].name = "Array_00"
# 係数の変更(複製した要素の移動、インデックス x:0, y:1, z:2)
bpy.context.object.modifiers["Array_00"].relative_offset_displace[0] = 2
bpy.context.object.modifiers["Array_00"].count = 5
# 2つ目の配列モディファイア追加 (1つ目の結果を、さらにY軸方向に5個並べる)
bpy.ops.object.modifier_add(type='ARRAY')
bpy.context.object.modifiers["Array"].name = "Array_01"
bpy.context.object.modifiers["Array_01"].relative_offset_displace[0] = 0
bpy.context.object.modifiers["Array_01"].relative_offset_displace[1] = -1.5
bpy.context.object.modifiers["Array_01"].count = 5
# 位置調整
bpy.context.object.modifiers["Array_01"].use_object_offset = True
# 相対オフセット調整
bpy.context.object.modifiers["Array_01"].relative_offset_displace[0] = 0.0 # x方向のオフセット
bpy.context.object.modifiers["Array_01"].relative_offset_displace[1] = -2.0 # y方向のオフセット
bpy.context.object.modifiers["Array_01"].relative_offset_displace[2] = 0.0 # z方向のオフセット
Base_create()ここでは2つのArrayモディファイアを追加しています。1つ目のArrayモディファイアでX軸方向にオブジェクトを並べ、2つ目のArrayモディファイアを重ねて追加し、先ほどX軸方向に並べたオブジェクトをY軸方向に並べています。
ソリッド化モディファイア追加
Solidifyモディファイアを追加することで、メッシュに厚みを付けることができます。
使用例 :

Python :
# element_select は下記リンク先の記事で定義した関数
def Base_create():
bpy.ops.object.mode_set(mode='OBJECT')
# キューブを生成
bpy.ops.mesh.primitive_cube_add(
size=1 # 1辺の長さ
, location=(0, 0, 0) # 配置場所
, scale=(1, 1, 0.5) # x, y, z サイズ
)
bpy.context.object.name = "cube_00"
# Mode切り替え
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_mode(type='FACE')
# 上面の要素を選択して削除 (厚みを付けたときに開口部になる)
element_select(
element_list=[5]
, select_mode="FACE"
, object_name_list=["cube_00"]
)
bpy.ops.mesh.delete(type='FACE')
# Mode切り替え
bpy.ops.object.mode_set(mode='OBJECT')
# --------------------------
# モディファイア
# --------------------------
# ソリッド化(厚みを持たせる)
bpy.ops.object.modifier_add(type='SOLIDIFY')
# 優先順位設定 (他のモディファイアより先に適用したい場合)
bpy.ops.object.modifier_move_to_index(modifier="Solidify", index=0)
# 厚みを調整(1:上方向, -1:下方向)
bpy.context.object.modifiers["Solidify"].offset = -1
# 厚みの幅を調整
bpy.context.object.modifiers["Solidify"].thickness = 0.1
Base_create()▼element_select
厚みを付ける方向や、厚みを調節することも可能です。
ベベルモディファイアなどと合わせて用いて、トレーや、鉢、コップのような縁のあるオブジェクトの作成に使い勝手が良いです。
複数のモディファイアを使用する際には、適用する優先順位を指定することも必要です。優先順位の付け方については、こちらの優先順序付けの章を参考にしてみてください。
ミラーモディファイア追加
追加したあとの効果はArrayモディファイアと似ていますが、こちらはある位置を基準にした時のオブジェクトの複製を行います。
片一方のオブジェクトを編集するとミラーリングしたオブジェクトにも影響するため、キャラクターモデリングなど、左右対称のオブジェクトを編集する際に使用されているのをよく見かけます。
使用例

Python :
def Base_create():
bpy.ops.object.mode_set(mode='OBJECT')
# ミラー元となる立方体 (cube_00)
bpy.ops.mesh.primitive_cube_add(
size=1 # 1辺の長さ
, location=(0, 0, 0.5) # 配置場所
, scale=(1, 1, 0.1) # x, y, z サイズ
)
bpy.context.object.name = "cube_00"
# ミラーリングされる側の立方体 (cube_01)
bpy.ops.mesh.primitive_cube_add(
size=1 # 1辺の長さ
, location=(0.4, 0.4, 0.2) # 配置場所
, scale=(0.1, 0.1, 0.5) # x, y, z サイズ
)
bpy.context.object.name = "cube_01"
# --------------------------
# モディファイア
# --------------------------
# ミラー追加 (cube_01 に対して追加する)
bpy.ops.object.modifier_add(type='MIRROR')
# 有効化する軸 (インデックス x:0, y:1, z:2)
bpy.context.object.modifiers["Mirror"].use_axis[0] = True
bpy.context.object.modifiers["Mirror"].use_axis[1] = True
# ミラーリングの基準オブジェクト
bpy.context.object.modifiers["Mirror"].mirror_object = bpy.data.objects["cube_00"]
Base_create()この例では、X軸方向とY軸方向のミラーリングを有効化し、cube_00を基準にcube_01をミラーリングしています。
モディファイアの適用
モディファイアを追加するだけだと、オブジェクトのメッシュには影響が無く非破壊的です。
モディファイアをオブジェクトに適用することで、オブジェクトのメッシュに直接影響を与えます。UV展開を行う必要がある際などに使用します。
Python :
# モディファイア適用
bpy.ops.object.modifier_apply(modifier="modifier_name")モディファイア名を指定して、上記のように適用するための一文を加えます。
- アクティブオブジェクト選択
- モディファイア名を指定して適用
モディファイアの削除
オブジェクトの複製で不要なモディファイアがオブジェクトに追加されている場合など、必要のないモディファイアを削除する時には次のようにします。
Python :
# モディファイア削除
bpy.ops.object.modifier_remove(modifier="modifier_name")- アクティブオブジェクト選択
- モディファイア名を指定して削除
複数モディファイア優先順序変更
複数モディファイアを追加したときに、それぞれがどのような優先度になるかを指定します。
優先度によって結果も変わってきますので、慎重に設定しておく必要があります。
Python :
# 優先順位を変える (indexが小さいほど先に適用される。例 0:Solidify, 1:Bevel)
bpy.ops.object.modifier_move_to_index(modifier="modifier_name", index=0)例:
- Solidifyモディファイア → index[0]
- Bevelモディファイア → index[1]
モディファイアの適用方法、モディファイアの種類には様々あるので追記できることがあれば追記していきます。
以上
