こんにちは、管理人のウノケンです。
今回は、
BlenderをPythonで簡単に操作する方法について初心者向けに解説
していきます。
Blenderは、3Dモデリングやアニメーション制作などに利用されるオープンソースの3Dアプリケーションです。Pythonとの親和性も高く、うまく使いこなすことができれば手作業による面倒な反復作業を自動化することが可能です。
この記事では、画像を豊富に用いてPythonスクリプトを使ったBlender操作の基本について解説していきます。3Dモデリング初心者の方や、Pythonになじみのない方でもコピペで操作を実行することができるので、ぜひ自分でも操作して自動化の利便性を感じてみてください。
それでは見ていきましょう!
YouTubeでも動画でわかりやすく解説しています!
この記事の内容は、YouTubeでより詳しく解説しています。記事とあわせて活用してみてください。
「Pythonを使ったBlenderの自動化」の基本
そもそもBlenderって?
Blenderは、アニメやゲーム、映画の制作に使用されるオープンソースの3DCGソフトです。誰でも無料で使えるソフトながら、非常に高度で豊富な機能を備えています。
メタバースやVTuberをはじめとする3D制作需要の高まりに伴って使用するユーザ数が急増している、いま注目のソフトウェアです。
その導入のしやすさから、Blenderは3Dプリンター用のデータ作成にも用いられています。3Dプリントすることによって、モデリングしたオリジナルキャラを、PCの中だけでなく現実世界で楽しむことが可能です。
Blender Python APIを使ってできること
Blenderは、プログラミング言語であるPythonを使って多くの操作を自動化することが可能です。Blender Python APIと呼ばれるインターフェースを用いることで、GUIを使わずにPythonスクリプトから直接Blenderの機能を操作することができます。
通常はBlenderのGUI上でマウスやキーボードのショートカットキーを使って実行している操作も、Pythonスクリプトを賢く用いることで、自動化や高速なバッチ処理が可能になります。
Blender Python APIを使ってできることは、簡単なオブジェクトの配置や移動だけではありません。マテリアルやアニメーションの設定、ファイル入出力といった、さまざまなタスクを処理することが可能です。
この記事の後半では、Blender Python APIを使ってできる多くの具体的な操作について、基本事項を中心に解説しています。
Pythonを使ってBlenderを自動化する際の準備【画像あり】
個別の操作の解説に入る前に、BlenderをPythonスクリプトで操作するための準備について簡単に説明していきます。
BlenderとPythonのインストール
BlenderをPythonスクリプトで操作するためには、Blenderのソフトウェア自体をインストールする必要があります。公式ページからダウンロードすることが可能なので、使用するPCのOS(Mac/Windows/Linux)に合わせて適切なものをダウンロードしましょう。
Pythonは個別にインストールする必要はありません。BlenderをインストールしてしまえばデフォルトでPythonスクリプトを使用することが可能です。
Pythonスクリプトの記述
「Scripting」ワークスペースに移動
画面上部中央の「Scripting」をクリックし、「Scripting」ワークスペースに移動します。
デフォルトでは3Dビューポートが左上に小さく表示され、左下に対話形式のPythonコンソールが表示されます。
「新規」を押してPythonスクリプトを記述
つづいて、画面上部中央の「新規」ボタンをクリックします。
中央のテキストエディタがアクティブになり、Pythonスクリプトを記述できるようになります。
「実行ボタン▷」を押して実行
試しに簡単な操作を実行してみましょう。後述する「既存のメッシュを削除」するスクリプトを記述し、実行してみます。
無事立方体(Cube)メッシュが削除されました。
Blender Python APIを使用する際の注意点
Blender Python APIを使用する際には、バージョンアップに伴う仕様変更に注意しましょう。
例えば、バージョン2.Xとバージョン3.X、バージョン4.Xでは「プリンシプルBSDF」の各パラメータに対応するインデックスが異なります。後述する「マテリアルの設定」のスクリプトにおいて、バージョンにあわせて適切に設定する必要が生じる項目です。
このように、Blenderのバージョンアップに応じて仕様変更になる項目が存在するため、注意しておきましょう。
【バージョン4以降対応】Pythonを使ったBlender自動化の基本操作7選
Pythonを使ったBlender自動化の基本操作を7つ取り上げて解説してきます。
「Pythonを使ってBlenderを自動化する際の準備」の項目まで準備ができていれば、以下の項目はすべてコピペで実行することが可能です。Blender初心者の方や、Pythonに不慣れな方もぜひ手元の環境で実行してみてください。
基本操作の紹介の最後で、これらの基本操作を組み合わせて実行できる自動化処理の例も掲載しています。
既存のオブジェクトを削除
Blenderを起動したときにデフォルトで表示されている立方体(Cube)を削除したいときなどに使用します。
import bpy
for mesh in bpy.data.meshes:
bpy.data.meshes.remove(mesh)
メッシュの追加
新しくメッシュを追加する際に使用するスクリプトの一例を示します。引数に「セグメント」や「リング」、「半径」といったパラメータを指定することも可能です。
# UV球を追加
bpy.ops.mesh.primitive_uv_sphere_add()
# パラメータを指定してUV球を追加する場合
bpy.ops.mesh.primitive_uv_sphere_add(segments=32, ring_count=16, radius=1.0, calc_uvs=True, enter_editmode=False, align='WORLD', location=(0.0, 0.0, 5.0), rotation=(0.0, 0.0, 0.0), scale=(5.0, 1.0, 1.0))
UV球以外のメッシュを追加する際の関数の例は以下の通りです。
- 平面を追加:bpy.ops.mesh.primitive_plane_add()
- 立方体を追加:bpy.ops.mesh.primitive_cube_add()
- ICO球を追加:bpy.ops.mesh.primitive_ico_sphere_add()
- 円柱を追加:bpy.ops.mesh.primitive_cylinder_add()
- トーラスを追加:bpy.ops.mesh.primitive_torus_add()
(参考:Mesh Operators — Blender Python API)
オブジェクトの移動
オブジェクトを移動させるスクリプトは以下の通りです。引数value
にはxyz方向のそれぞれに対する所望の移動量を指定します。
bpy.ops.transform.translate(value=(1,2,3))
実行すると、x方向に1、y方向に2、z方向に3だけオブジェクトが移動します。
(参考:Transform Operators — Blender Python API)
オブジェクトの回転
オブジェクトを回転させるスクリプトは以下の通りです。引数value
には回転量(単位:ラジアン)、orient_axis
には回転軸を指定します。
bpy.ops.transform.rotate(value=3.1415/2 ,orient_axis='X')
実行すると、オブジェクトがx軸回りにπ/2(=90°)だけ回転します。
(参考:Transform Operators — Blender Python API)
オブジェクトのリサイズ(拡大・縮小)
オブジェクトをリサイズ(拡大・縮小)するスクリプトは以下の通りです。引数value
にはxyz方向のそれぞれに対する所望の拡大倍率を指定します。
bpy.ops.transform.resize(value=(3.0,0.5,1.0))
実行すると、x方向は3.0倍、y方向は0.5倍、z方向は1.0倍にオブジェクトがリサイズされます。
(参考:Transform Operators — Blender Python API)
マテリアルを追加し、パラメータを設定する【バージョン4以降変更あり】
新しいマテリアルを追加するスクリプトは以下の通りです。引数にマテリアルに設定したい名称を指定します。
material_new = bpy.data.materials.new('Blue')
この時点ではマテリアルの雛形が生成されただけの状態です。ちょうどGUI上の「マテリアルプロパティ」から「新規」ボタンをクリックした状態に相当します。
いくつかの設定を実行するため、引き続き以下のコードを実行します。
# 「ノードを使用」をオンにする
material_new.use_nodes = True
#「プリンシプルBSDF」のインスタンスbsdfを生成する
bsdf = material_new.node_tree.nodes["プリンシプルBSDF"]
#プリンシプルBSDFの各種パラメータを設定する
bsdf.inputs[0].default_value = (0, 0, 1, 1) # 「ベースカラー」を青色に設定
bsdf.inputs[2].default_value = 0 # 「粗さ」を0に設定
bsdf.inputs[17].default_value = 1 #「伝搬」を1に設定
inputs
のインデックスとパラメータの対応はシェーダーエディターで確認することができます。また、以下のスクリプトを実行することで、インデックスとっ買うパラメータの対応をコンソールに表示させることも可能です。
# 新しいマテリアルを作成し、ノードを使用するように設定
material_new = bpy.data.materials.new(name="New_Material")
material_new.use_nodes = True
# プリンシプルBSDFノードのインスタンスを取得
bsdf = material_new.node_tree.nodes.get("Principled BSDF")
# プリンシプルBSDFノードのすべての入力名をリスト表示
if bsdf:
for index, input in enumerate(bsdf.inputs):
print(f"{index} {input.name}")
else:
print("Principled BSDF node not found")
出力結果の例は以下の通りです。
0 Base Color
1 Metallic
2 Roughness
3 IOR
4 Alpha
5 Normal
6 Weight
7 Subsurface Weight
8 Subsurface Radius
9 Subsurface Scale
10 Subsurface IOR
11 Subsurface Anisotropy
12 Specular IOR Level
13 Specular Tint
14 Anisotropic
15 Anisotropic Rotation
16 Tangent
17 Transmission Weight
18 Coat Weight
19 Coat Roughness
20 Coat IOR
21 Coat Tint
22 Coat Normal
23 Sheen Weight
24 Sheen Roughness
25 Sheen Tint
26 Emission Color
27 Emission Strength
28 Thin Film Thickness
29 Thin Film IOR
オブジェクトにマテリアルを追加する
作成したマテリアルをオブジェクトに追加するには、以下のスクリプトを実行します。
bpy.context.object.data.materials.append(material_new)
上記を実行すると、マテリアルプレビューモードで表示した際に、マテリアルが適切に設定されたことを確認することができます。
【コピペ可能】基本操作を組み合わせた自動化処理の例
最後に、今回紹介した基本操作を組み合わせて実現できる自動化処理の例を示します。Blenderのテキストエディタに以下のスクリプトを記述します。
import bpy
import numpy as np
import random
# パラメータtに応じて(x, y, z)座標を返す関数を定義する
def lissajous(t):
x = np.cos(t * 3)*6
y = np.sin(t * 3)*6
z = np.cos(t * 5)*6
return((x, y, z))
# 既存のオブジェクトを削除する
for mesh in bpy.data.meshes:
bpy.data.meshes.remove(mesh)
# 100個のオブジェクトを繰り返し作成する
ts = np.linspace(0, 2* np.pi, 100)
for i in range(len(ts) - 1):
# オブジェクトを配置するxyz座標を設定する
pos = lissajous(ts[i])
# パラメータ設定に使用するランダム値を生成する
rand1 = random.random()
rand2 = random.random()
rand3 = random.random()
# トーラスを追加する
bpy.ops.mesh.primitive_torus_add()
# 設定したxyz座標にオブジェクトを移動する
bpy.ops.transform.translate(value=pos)
# オブジェクトをx軸・y軸・z軸回りに回転させる
bpy.ops.transform.rotate(value=3.1415*rand1 ,orient_axis='Y')
bpy.ops.transform.rotate(value=3.1415*rand2 ,orient_axis='Z')
bpy.ops.transform.rotate(value=3.1415*rand3 ,orient_axis='X')
# x方向、y方向、z方向のそれぞれにランダムな倍率でオブジェクトをリサイズする
bpy.ops.transform.resize(value=(0.5+rand1/2,0.5+rand2/2,0.5+rand3/2))
# マテリアルを追加する
material_new = bpy.data.materials.new('Random')
# 「ノードを使用」をオンにする
material_new.use_nodes = True
#「プリンシプルBSDF」のインスタンスを生成する
bsdf = material_new.node_tree.nodes["プリンシプルBSDF"]
#プリンシプルBSDFの各種パラメータを設定する
bsdf.inputs[0].default_value = (rand1, rand2, rand3, 1) # 「ベースカラー」をランダムに設定
bsdf.inputs[1].default_value = 1 # 「メタリック」を1に設定
bsdf.inputs[2].default_value = 0 # 「粗さ」を0に設定
bsdf.inputs[17].default_value = 1 #「伝搬」を1に設定
# オブジェクトにマテリアルを追加する
bpy.context.object.data.materials.append(material_new)
これを実行すると、以下のようにマテリアルの設定されたオブジェクトが自動生成されます。
サイズや回転角、色の異なる多数のオブジェクトを何個も生成することは、手作業で行うにはあまりにも大変です。このように、マウスとキーボードで実施するには長い時間のかかる操作も、コードさえ書いておけば一瞬で実行することが可能です。
まとめ
今回は、BlenderをPythonで簡単に操作する方法について初心者向けに解説してきました。
今回紹介した操作は、Blender Python APIを用いたほんの一部の機能です。さらに幅広い機能を使いこなせるようになると、ライティングやレンダリング、アニメーションの設定を実行できることはもちろんのこと、オリジナルのアドオンを作成したりすることも可能になります。
Blender Python APIに関する日本語の情報は少ないです。もっと詳しい技術について興味のある方は、以下のようなBlender×Pythonの専門書籍を用いた学習も検討してみてください。
今回は「オブジェクトモード」における操作が基本でした。Pythonによる「編集モード」の操作についても知りたい!という方は以下の記事もご参照ください。