bpy(Blender Python API)を用いたモディファイア(非破壊的効果)の追加と、モディファイア管理の基本的な操作方法について、学んだことをまとめておきます。
モディファイアを用いることでオブジェクトのメッシュに直接的に変更を加えず、形状を変化させることができます。
動作確認環境 : Blender 4.2
モディファイアの適用前に、全適用(全トランスフォーム)を行うことでモディファイア適用時の不自然さやアンバランスさが生じる現象を防ぐことができます。
あわせてこちらもご確認ください。
▼全トランスフォーム
ベベルモディファイア追加
ベベルモディファイアを用いて、角ばったオブジェクトの面取りを行い、全体的に滑らかな丸みを帯びた形にすることができます。
使用例 :
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()
上記の例では、22行目でセグメント(角を丸めるときの面の数)を指定して、24行目で滑らかさ(値が大きいほど滑らか)を指定しています。
配列モディファイア追加
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"
# -----------------------
# モディファイア
# -----------------------
# 配列モディファイア追加
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
# 配列モディファイア追加
bpy.ops.object.modifier_add(type='ARRAY')
# 名前変更
bpy.context.object.modifiers["Array"].name = "Array_01"
# 係数の変更(複製した要素の移動)
# x : 0, y : 1, z : 2
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モディファイアを追加しています。
17行目で1つ目のArrayモディファイアを追加し、X軸方向にオブジェクトを並べ、26行目で2つ目のArrayモディファイアを重ねて追加し、先ほどX軸方向に並べたオブジェクトをY軸方向に並べています。
ソリッド化モディファイア追加
Solidifyモディファイアを追加することで、メッシュに厚みを付けることができます。
使用例 :
Python :
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, y サイズ x軸方向に1倍, y軸方向に1倍, z軸方向に1倍
)
# キューブに名前を設定
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()
厚みを付ける方向や、厚みを調節することも可能です。
ベベルモディファイアなどと合わせて用いて、トレーや、鉢、コップのような縁のあるオブジェクトの作成に使い勝手が良いです。
複数のモディファイアを使用する際には、適用する優先順位を指定することも必要です。優先順位の付け方については、こちらの優先順序付けの章を参考にしてみてください。
ミラーモディファイア追加
追加したあとの効果はArrayモディファイアと似ていますが、こちらはある位置を基準にした時のオブジェクトの複製を行います。
片一方のオブジェクトを編集するとミラーリングしたオブジェクトにも影響するため、キャラクターモデリングなど、左右対称のオブジェクトを編集する際に使用されているのをよく見かけます。
使用例
Python :
def Base_create():
bpy.ops.object.mode_set(mode='OBJECT')
# 立方体を追加
# キューブを生成
bpy.ops.mesh.primitive_cube_add(
size=1 # 1ペンの長さ
, location=(0, 0, 0.5) # 配置場所
, scale=(1,1,0.1) # x, y, y サイズ x軸方向に1倍, y軸方向に1倍, z軸方向に1倍
)
# キューブに名前を設定
bpy.context.object.name = "cube_00"
# 立方体を追加
# キューブを生成
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, y サイズ x軸方向に1倍, y軸方向に1倍, z軸方向に1倍
)
# キューブに名前を設定
bpy.context.object.name = "cube_01"
# --------------------------
# モディファイア
# --------------------------
# ミラー追加
bpy.ops.object.modifier_add(type='MIRROR')
# Axis x: 0, y, 1 ミラー有効化
bpy.context.object.modifiers["Mirror"].use_axis[0] = True
bpy.context.object.modifiers["Mirror"].use_axis[1] = True
# Mirror Object
bpy.context.object.modifiers["Mirror"].mirror_object = bpy.data.objects["cube_00"]
Base_create()
この例では、X軸方向とY軸方向のミラーリングを有効化しています。
34行目でミラーリングの中心となるオブジェクトを指定しています。
モディファイアの適用
モディファイアを追加するだけだと、オブジェクトのメッシュには影響が無く非破壊的です。
モディファイアをオブジェクトに適用することで、オブジェクトのメッシュに直接影響を与えます。UV展開を行う必要がある際などに使用します。
Python :
# モディファイア適用
bpy.ops.object.modifier_apply(modifier="modifier_name")
モディファイア名を指定して、上記のように適用するための一文を加えます。
- アクティブオブジェクト選択
- モディファイア名を指定して適用
モディファイアの削除
オブジェクトの複製で不要なモディファイアがオブジェクトに追加されている場合など、必要のないモディファイアを削除する時には次のようにします。
Python :
# モディファイア削除
bpy.ops.object.modifier_remove(modifier="modifier_name")
- アクティブオブジェクト選択
- モディファイア名を指定して削除
複数モディファイア優先順序変更
複数モディファイアを追加したときに、それぞれがどのような優先度になるかを指定します。
優先度によって結果も変わってきますので、慎重に設定しておく必要があります。
Python :
# 優先順位を変える(0:SOLIDIFY, 1:BABEL)
bpy.ops.object.modifier_move_to_index(modifier="modifier_name", index=0)
例:
- Solidifyモディファイア --> index[0]
- Bevelモディファイア --> index[1]
モディファイアの適用方法、モディファイアの種類には様々あるので追記できることがあれば追記していきます。
以上