Blender で Python スクリプトを実行
【概要】Blenderは3次元コンピュータグラフィックス・アニメーションソフトウェアであり、Pythonスクリプトを使用してオブジェクト操作やレンダリングを自動化できる。本記事では、Blenderの起動からPythonコンソールの使用方法、オブジェクトやライト、カメラの設定、レンダリング実行までの基本的な操作手順を解説する。
【サイト内の関連ページ】
- Blender の機能の説明、実演など: 別ページにまとめ
- Windows での Blender 4 のインストール: 別ページで説明
- Ubuntu での Blender 3 のインストールは、別ページで説明
【関連する外部ページ】
- Blender の公式ページ: https://www.blender.org/
前準備
前準備として、Blender のインストールが終わっていること。
Blender の Python コンソール
Blender での画面ワークスペースの切り替え
- Blender のワークスペース(作業目的に特化した画面レイアウト)を「スクリプト作成」(Blender 4では「Scripting」)に変える操作
画面ワークスペースとして「スクリプト作成」(Blender 4では「Scripting」)を選択する。
- Blender の画面ワークスペースを元に戻す操作
画面ワークスペースとして「レイアウト」を選択する。
Blender Python コンソールで Python スクリプトを実行してみる
- Blender を起動する
- Blender Python コンソール(Blenderに組み込まれたPythonプログラミング環境)を開くために、Blender のワークスペースを「スクリプト作成」(Blender 4では「Scripting」)に変更する
- コンソール画面が開くので確認する
コンソール画面の中では、IPython シェル(対話的にPythonコードを実行できる環境)が動作している。
- 試しにBlender オブジェクト(シーン内の3Dモデルやカメラ、ライトなどの要素)の一覧表示を行ってみる。
コンソール画面で次のコードを実行する。
D = bpy.data for i in D.objects: print(i.name)
Blender オブジェクトが確認できる(下の実行結果例では Camera、Cube、Light の 3つ)。
- 試しに立体(タイプが「MESH」であるオブジェクト)(メッシュ:頂点、辺、面で構成される3Dオブジェクト)の一覧表示を行ってみる。
コンソール画面で次のコードを実行する。
D = bpy.data for i in D.objects: if i.type == "MESH": print(i.name)
- 今度は、Blender 画面の一覧表示を行ってみる。
コンソール画面で次のコードを実行する。
D = bpy.data for i in D.screens: print(i.name)
画面名が確認できる。
- 自動補完を試してみる
コンソール画面で「bpy.data.」(BlenderのPython APIのデータアクセスモジュール)と入力したあとで、「オートコンプリート」をクリックする。
補完の候補が表示される。
Blender で Python を使ってみる
レンダリング
Windows の場合は、環境変数 HOMEPATH を使用する。
Linux の場合は、「HOMEPATH」の代わりに「HOME」を使用する。
import os
bpy.ops.render.render()
D = bpy.data
D.images['Render Result'].save_render(filepath = os.environ['HOMEPATH'] + '/hoge.png')

できあがった画像ファイル hoge.png は次の通りである。

ライトの設定
Pythonスクリプトでライト(光源)を設定する。
import os
pi = 3.141592
lamp = { "location" : (20, 0, 10), "rotation_euler" : (0, 0.2, 0.4), "falloff_type" : 'INVERSE_LINEAR', "shadow_method" : 'RAY_SHADOW' }
# Blender 4では shadow_methodの値が異なる場合がある
# lamp = { "location" : (20, 20, 10), "rotation_euler" : (0, 0.2, 0.4), "falloff_type" : 'INVERSE_LINEAR', "shadow_method" : 'NOSHADOW' }
D = bpy.data
lamp_obj = D.objects['Light']
lamp_obj.location = lamp["location"]
lamp_obj.rotation_euler = lamp["rotation_euler"] # オブジェクトの回転角度(ラジアン単位)
lamp_obj.data.falloff_type = lamp["falloff_type"]
# Blender 4では以下のようにシャドウ設定が変更されている場合がある
# lamp_obj.data.shadow_method = lamp["shadow_method"]
bpy.ops.render.render()
D.images['Render Result'].save_render(filepath = os.environ['HOMEPATH'] + '/hoge.png')

できあがった画像ファイル hoge.png は次の通りである。

カメラの設定
Pythonスクリプトでカメラ(シーン撮影用の視点)を設定する。
pi = 3.141592
camera = { "location" : (15, 0, 15), "rotation_euler" : (0, 1, 0), "type" : 'PERSP', "angle" : 50.0 * (pi/180.0) }
D = bpy.data
scene = D.scenes["Scene"]
scene.camera.location = camera["location"]
scene.camera.rotation_euler = camera["rotation_euler"]
scene.camera.data.type = camera["type"] # 'PERSP'(透視投影)または'ORTHO'(平行投影)
scene.camera.data.angle = camera["angle"] # カメラの画角(ラジアン単位)
bpy.ops.render.render()
D.images['Render Result'].save_render(filepath = os.environ['HOMEPATH'] + '/hoge.png')

できあがった画像ファイル hoge.png は次の通りである。

データアクセスを行う Python プログラム
【関連する外部ページ】https://docs.blender.org/api/blender_python_api_2_63_release/bpy.data.html
https://docs.blender.org/api/blender_python_api_2_63_release/bmesh.html
オブジェクトの一覧
D = bpy.data
for i in D.objects:
print(i.name)

シーン名の一覧
D = bpy.data
print(D.scenes.keys())

立体のメッシュの取得
D = bpy.data
if "Cube" in D.meshes:
mesh = bpy.data.meshes["Cube"]
for i in mesh.edges:
print(i)
for i in mesh.vertices:
print(i)
for i in mesh.polygons:
print(i)
