こんにちは、管理人のウノケンです。
今回は、BlenderをPythonで自在に操作する方法について解説していきます。
Blenderは、3Dモデリングやアニメーション制作などに利用されるオープンソースの3Dアプリケーションです。Pythonとの相性も良く、手作業による面倒な反復作業を自動化することができます。
Pythonスクリプトを使ったBlenderの操作について、「モディファイア」にフォーカスして解説します。3Dモデリング初心者の方や、Pythonになじみのない方でも操作を実行できるように、コピペで自動化処理ができる例も用意しています。
なお、Blender Python APIについての解説や、Pythonスクリプトを使ったBlenderの基本操作については以下の記事で解説しているので、「基本から知りたい!」という方はこちらの記事からご覧ください。
それでは見ていきましょう!
Blenderの「モディファイア」をPythonで設定する方法
そもそもBlenderのモディファイアとは
Blenderにおける「モディファイア」とは、オブジェクトに対して幾何学的な変形やエフェクトを加えるための機能です。
例えば、オブジェクトに「サブディビジョンサーフェス」というモディファイアを適用すると、オブジェクトの表面をなめらかにすることができます。また、「ミラー」というモディファイアを適用すると、オブジェクトを対称に反転することができます。このように、モディファイアはオブジェクトの形状を変更するだけでなく、作業の効率化にも役立ちます。
複数のモディファイアを追加すると、これらはスタック状に追加されていきます。各モディファイアは前のモディファイアによる編集を踏まえて作用するため、複数のモディファイアを組み合わせることで、より複雑な形状やエフェクトを作り出すことも可能です。
モディファイアを追加する手順【マウス操作の場合】
モディファイアをPythonで操作する前に、マウスで操作する場合について簡単におさらいしておきましょう。
モディファイアープロパティを開く
右側のカラムにある「モディファイアープロパティ」を開き、「モディファイアーを追加」を左クリックします。
モディファイアを追加する
「モディファイアーを追加」を左クリックすると、以下のように多くのモディファイアーのリストが現れます。例として、オブジェクトの表面をなめらかにしたいときによく使われる「サブディビジョンサーフェス」を追加してみます。
パラメータを調整する
「サブディビジョンサーフェス」を追加すると、3Dビューポート上のオブジェクトにモディファイアの処理が反映されます。立方体の面が分割されて少し角が取れたような形に見えることがわかります。
「モディファイアープロパティ」上の設定を変更すると、モディファイアーの処理を行うアルゴリズムやパラメータの変更を行うことができます。例えば、サブディビジョンサーフェスでは「カトマルクラーク」と「シンプル」の2つの細分化アルゴリズムを選択でき、数値を大きくすることでよりなめらかな表面を得ることができます。
モディファイアを「適用」する
モディファイアを追加しただけでは、モディファイアによる変更は仮のものです。モディファイアのパラメータや、複数のモディファイアの順番が決まったら、「適用」させて変更を確定します。
モディファイア処理をPythonで自動化するメリット
モディファイア処理をPythonで自動化するメリットには、以下のようなものがあります。
- 手動で一つずつ処理を行う場合に比べて、自動化することで効率的に大量のオブジェクトを処理できる
- 自動化することで人為的なエラーが発生しにくくなり、作業の正確性が高まる
- 同じ種類のオブジェクトに対して同じモディファイアを適用する場合、処理内容を再利用できる
面倒な処理を自動化したいときはPythonの出番です。次の項目から、具体的なスクリプトについて確認していきましょう。
PythonでBlenderのモディファイア処理を自動化する具体的な方法
Pythonを使ったBlenderのモディファイアに関する基本操作について解説してきます。
以下の項目はすべてコピペで実行することが可能です。Blender初心者の方や、Pythonに不慣れな方もぜひ手元の環境で実行してみてください。
Blender上でPythonスクリプトを使用する準備段階については、「3Dモデリングを自動化!BlenderをPythonで操作する方法【コピペ可能】」の記事で解説しているので、適宜ご参照ください。
以下では、基本操作の紹介として、「モディファイアの追加」、「サブディビジョンサーフェス」、「配列」、「ベベル」、「ブーリアン」、「ミラー」および「ソリッド化」について解説します。最後に、これらの基本操作を組み合わせて実行できる自動化処理の例も掲載しています。
モディファイアの追加
最初に、モディファイアの追加方法を紹介します。以下のスクリプトでは、「サブディビジョンサーフェス」モディファイアを追加しています。
import bpy
bpy.ops.object.modifier_add(type='SUBSURF')
bpy.context.object.modifiers.new()
を使って同様の処理を行うことも可能です。
bpy.context.object.modifiers.new(name="細分化", type='SUBSURF')
上記の2つの例では、ともに引数のtype
でモディファイアの種類を指定しています。追加できるモディファイアと引数type
の例を以下に示します。
モディファイアの名称 | type | 効果 |
---|---|---|
サブディビジョンサーフェス | SUBSURF | オブジェクトのポリゴン数を増やし、滑らかな表面を作成する |
配列 | ARRAY | オブジェクトを複数回複製し、指定されたオフセットで配置する |
ベベル | BEVEL | オブジェクトのエッジを丸め、ベベルを追加する |
ブーリアン | BOOLEAN | 他のオブジェクトとのブーリアン演算を実行する |
ミラー | MIRROR | オブジェクトを指定された軸に沿ってミラーリング(反転)する |
ソリッド化 | SOLIDIFY | オブジェクトに厚みを追加し、薄いシェルから立体的な形状を作成する |
ディスプレイス | DISPLACE | テクスチャに基づいてオブジェクトの頂点を変位させる |
「サブディビジョンサーフェス」モディファイア
次に、サブディビジョンサーフェスモディファイアの設定方法を紹介します。以下のスクリプトでは、ビューポートとレンダリングのサブディビジョンサーフェスのレベルを設定しています。
# サブディビジョンサーフェスモディファイアを追加
subdiv_mod = obj.modifiers.new(name="Subdivision", type='SUBSURF')
# サブディビジョンサーフェスのレベルを設定(ビューポート/レンダリング)
subdiv_mod.levels = 3
subdiv_mod.render_levels = 3
「配列」モディファイア
配列モディファイアを追加し、オフセットと要素数を設定する方法を紹介します。
# 配列モディファイアを追加
array_mod = obj.modifiers.new(name="Array", type='ARRAY')
# 配列のオフセットを設定
array_mod.use_relative_offset = True
array_mod.relative_offset_displace[0] = 1.1 # X
array_mod.relative_offset_displace[1] = 0 # Y
array_mod.relative_offset_displace[2] = 0 # Z
# 配列の要素数を設定
array_mod.count = 20
「ベベル」モディファイア
ベベルモディファイアを追加し、ベベルの幅とセグメント数を設定する方法を紹介します。
# ベベルモディファイアを追加
bevel_mod = obj.modifiers.new(name="Bevel", type='BEVEL')
# ベベルの幅を設定
bevel_mod.width = 0.1
# ベベルのセグメント数を設定
bevel_mod.segments = 3
「ブーリアン」モディファイア
ブーリアンモディファイアを使って、立方体と球のブーリアン演算を行い、その結果を適用する方法を紹介します。
# 立方体を追加
bpy.ops.mesh.primitive_cube_add()
# シーンのアクティブオブジェクトを取得
obj = bpy.context.active_object
# 球を追加
bpy.ops.mesh.primitive_uv_sphere_add(location=(1, 0, 0), radius=1)
sphere = bpy.context.active_object
# キューブを再選択
bpy.context.view_layer.objects.active = obj
obj.select_set(True)
# ブーリアンモディファイアを追加
bool_mod = obj.modifiers.new(name="Boolean", type='BOOLEAN')
# ブーリアンのオペレーションを設定
bool_mod.operation = 'DIFFERENCE'
# ブーリアンのオブジェクトを設定(球)
bool_mod.object = sphere
# モディファイアを適用
bpy.ops.object.modifier_apply({"object": obj}, modifier=bool_mod.name)
# 球を削除
bpy.ops.object.select_all(action='DESELECT')
sphere.select_set(True)
bpy.ops.object.delete()
「ミラー」モディファイア
ミラーモディファイアを追加し、オプションを設定する方法を紹介します。
# ミラーモディファイアを追加
mirror_mod = obj.modifiers.new(name="Mirror", type='MIRROR')
# ミラーモディファイアのオプションを設定
mirror_mod.use_axis = (True, False, False)
mirror_mod.use_clip = True
「ソリッド化」モディファイア
ソリッド化モディファイアを追加し、オプションを設定する方法を紹介します。
# ソリッド化モディファイアを追加
solidify_mod = obj.modifiers.new(name="Solidify", type='SOLIDIFY')
# ソリッド化モディファイアのオプションを設定
solidify_mod.thickness = 0.1
「ディスプレイス」モディファイア
ディスプレイスモディファイアを使って、テクスチャを基にオブジェクトの形状を変形させる方法を紹介します。
以下のスクリプトでは、ディスプレイスモディファイアを追加し、ノイズテクスチャを作成してモディファイアに割り当てています。さらに、テクスチャの設定を変更し、ディスプレイスモディファイアの強度を0設定しています。
# ディスプレイスモディファイアを追加
disp_mod = sphere.modifiers.new(name="Displace", type='DISPLACE')
# 新しいテクスチャを作成
tex = bpy.data.textures.new("DisplaceTexture", type='NOISE')
# テクスチャの設定
tex.use_color_ramp = True
# ディスプレイスモディファイアにテクスチャを割り当て
disp_mod.texture = tex
# ディスプレイスモディファイアの設定
disp_mod.strength = 0.5
【コピペ可能】モディファイアを活用したPython自動化処理の例
ここまで、Blenderのモディファイアに関するPython自動化処理の基本について解説してきました。
最後に、今回紹介したモディファイアを活用できるPython自動化処理の応用例を示します。以下のスクリプトでは、「サブディビジョンサーフェス」、「ベベル」、「ディスプレイス」モディファイアを使用しています。
Blenderのテキストエディタに以下のスクリプトを記述します。シーンには1つもメッシュが存在しない状態で実行してください。
import bpy
import bmesh
import math
# メッシュオブジェクトを作成
mesh = bpy.data.meshes.new("ComplexShape")
obj = bpy.data.objects.new("ComplexShape", mesh)
bpy.context.collection.objects.link(obj)
bpy.context.view_layer.objects.active = obj
obj.select_set(True)
# メッシュの形状を定義
bm = bmesh.new()
verts = []
for i in range(0, 360, 10):
angle = math.radians(i)
x = 5 * math.cos(angle)
y = 5 * math.sin(angle)
z = 5 * math.sin(angle * 2)
verts.append(bm.verts.new((x, y, z)))
bm.faces.new(verts)
bm.to_mesh(mesh)
bm.free()
# サブディビジョンサーフェスモディファイアを追加
subdiv_mod = obj.modifiers.new("Subdivision", "SUBSURF")
subdiv_mod.levels = 4
# ベベルモディファイアを追加
bevel_mod = obj.modifiers.new("Bevel", "BEVEL")
bevel_mod.segments = 4
bevel_mod.width = 0.05
# テクスチャを作成し、ディスプレイスモディファイアに適用
texture = bpy.data.textures.new("DisplaceTexture", "CLOUDS")
texture.noise_scale = 1.5
# ディスプレイスモディファイアを追加
displace_mod = obj.modifiers.new("Displace", "DISPLACE")
displace_mod.texture = texture
displace_mod.strength = 0.5
bpy.ops.object.shade_smooth() # 影を滑らかにする
## 以下復習 ##
# マテリアルを追加する
material_new = bpy.data.materials.new('Blue')
# 「ノードを使用」をオンにする
material_new.use_nodes = True
#「プリンシプルBSDF」のインスタンスを生成する
bsdf = material_new.node_tree.nodes["プリンシプルBSDF"] # English: "Principled BSDF"
#プリンシプルBSDFの各種パラメータを設定する
bsdf.inputs[0].default_value = (0,0,1,1) # 「ベースカラー」をランダムに設定
bsdf.inputs[6].default_value = 1 # 「メタリック」を1に設定
bsdf.inputs[9].default_value = 0 # 「粗さ」を0に設定
bsdf.inputs[17].default_value = 1 #「伝搬」を1に設定
# オブジェクトにマテリアルを追加する
bpy.context.object.data.materials.append(material_new)
上記のスクリプトを実行すると、以下の画像のように手動で作成するのは困難なオブジェクトが瞬時に生成されます。
まとめ
本記事では、Blenderのモディファイアを活用したPythonスクリプトの自動化処理について解説しました。
モディファイアを追加し、設定を変更する基本的な操作から、サブディビジョンサーフェス、配列、ベベルなどのモディファイアを組み合わせた複雑な処理まで、幅広い例を紹介しました。
これらのスクリプトを利用することで、3Dモデリング作業を効率化し、手間のかかる繰り返し作業を簡単に自動化することができます。Blender初心者やPythonに不慣れな方も、本記事の内容を参考にして、Blenderのモディファイアを活用した自動化処理を試してみてください。
体系的に学びたい方は、Python×Blenderの専門書籍を使った学習もオススメです。