
bpy モジュールを使ってみよう
Python で始める Blender 第2回
Published: 6/10/2019
Updated: 8/17/2019
約12分
更新履歴
- 2019/08/17: 記事の内容を Blender 2.80 に対応させました。
Blender を Python で操作するシリーズ第 2 回です。
今回は、前回用意したBlenderを実際に使って見るので、
まだ用意できていない方は前回の記事を参考に Blender を準備してきて下さい。
Blender を起動してみよう
早速、Blender を起動してみましょう。
好きな端末を使って
好きな端末を使って
blender コマンドを実行することで起動することができます。-h | --help オプションを付けることで、
使用可能なオプションの一覧を確認できます。
私がよく使用するのは以下の2つです。-b | --background: GUI を表示せず、バックグラウンド実行する-P | --Python <filename>: 実行する Python スクリプトを指定する
さて、コマンドを実行すると以下のような画面が立ち上がると思います。

画面のそれぞれのメニューやパネルで何ができるかは、
ここでは説明しませんが、
画面右上のメニューに、
現在編集中の File に存在しているオブジェクトの一覧が表示されていることは覚えておくと良いと思います。
特に何も設定せずに起動すると、
この画像のように Camera・Cube・Lamp が用意されて Blender が起動します。
Camera はレンダリングやアニメーション動画の撮影をするオブジェクトで、
Lamp は光源オブジェクトです。
また、Python での操作を行う際に必ず知っておく必要がある事として、
GUI の操作と Python のメソッドとの関連付けがあります。
GUI 操作と対応する Python のメソッドを知るためには、
操作を知りたい GUI パーツの上にマウスを載せ、
しばらくすると対応する Python のメソッドが書かれたツールチップが表示されることを覚えていて下さい。

例えば上の画像は、
Camera オブジェクトを使ってシーンを切り取る時に
使用する Render ボタンに対応する Python コードを調べた例です。
Camera の Render ボタンをクリックしたときと同じ操作を行うには、
Python では
bpy.ops.render.render() と、書けば良いことが分かります。2019/08/17 追記
Blender 2.80 から、
上記 Python コマンドの Tooltip を表示するためにはオプションの有効化が必要になりました。
対象のオプションは、
画面左上の Edit → Preferences をクリックし、
Interface → Display → Python Tooltips になります。
有効化したい場合はチェックを入れてください。
bpyモジュールとは
2019/08/17 追記
2.80 から
msgbus というモジュールが増えていますが、
Document も見当たらず詳細が分かりませんでした。
分かり次第追記するかもしれません。先程の Render の例のように、Blender では、
GUI で操作できることの殆どは対応する Python のメソッドが用意されており、
bpy という名前のモジュールで提供されています。bpy には一体何が含まれているのか見てみましょう。
bpy モジュールを import して、以下のようなコードで確認してみます。import bpy
for attr_bpy in dir(bpy):
print(attr_bpy)ファイル名は
listup_bpy.py としてみました。
そして、blender コマンドを用いて実行すると、
以下のような出力が得られました。$ blender -b -P listup_bpy.py
Blender 2.80 (sub 75) (hash f6cb5f54494e built 2019-07-29 09:44 AM)
Read prefs: C:\Users\****\AppData\Roaming\Blender Foundation\Blender\2.80\config\userpref.blend
AL lib: (EE) SetChannelMap: Failed to match front-center channel (2) in channel map
found bundled python: C:\Users\****\scoop\apps\blender\current\2.80\python
__all__
__builtins__
__cached__
__doc__
__file__
__loader__
__name__
__package__
__path__
__spec__
app
context
data
msgbus
ops
path
props
types
utils
Blender quit実際に使う事になりそうなのは、
14 行目~ 21 行目の 8 つになります。
1 つずつどのようなモジュールなのか説明していきます。
app : Application Data (bpy.app)
app モジュールは、
実行中に変化しないアプリケーションの値を保持しているモジュールです。
ハンドラとかあるみたいなので、
Blender 起動時や終了時等に実行する関数をフックしたりできるかもしれません。context : Context Access (bpy.context)
このモジュールで取得できる利用可能なコンテキストのメンバは、
現在アクセスされている Blender のエリアによって異なります。
全てのコンテキストの値は読み取り専用ですが、
後に説明する
data モジュールや ops モジュールを使用した操作の
実行によって値が変化するかもしれません。data:Data Access (bpy.data)
このモジュールは全ての Blender/Python のアクセスに使用され、
Blender の内部データにアクセスする際に使用します。
本当によく使います。
ops:Operators (bpy.ops)
Blender 内での操作を提供するモジュールになります。
先程例に上げた
render() もこのモジュールに含まれていましたね。
間違ったコンテキストでこのモジュールを使用すると、
RuntimeError が raise されてプログラムが停止します。
このErrorをcatchするためには poll() メソッドを使用すれば良いらしいですが、
使ったことないので詳しくは知りません。path:Path Utilities (bpy.path)
このモジュールは、
Python の標準に含まれている
os.path と似たようなスコープを持っており、
Blender のパスを扱うためのユーティリティ関数を含んでいます。
Blender では編集中のデータを .blend 拡張子のファイルで保存できるのですが、
ざっと見た感じそれらの操作関連の関数が纏められてるみたいです。props:Property Definitions (bpy.props)
使ったことないので詳しくは分かりませんが、
Blender の内部データを拡張するためのプロパティが定義されているようです。
サンプルを眺めた感じだと、
既存のクラスに新しいプロパティを追加したり、
他のモジュールの関数からも呼べるように、
このモジュールを使ってプロパティが定義された独自のクラスを作成したりできるようです。
types:Types (bpy.types)
Blender を構成するデータの定義が纏められてるみたいです。
プログラムの中で直接使うことは少なさそうですが、
このリファレンスページはよく見に来ることになりそうです。
utils:Utilities (bpy.utils)
読んで字の如くといった感じもしますが、
一応説明すると、
Blender に固有ではあるが、
Blender の内部データとは関連しない様なユーティリティ関数が纏められているようです。
ざっと説明しましたが、とりあえず
data モジュールと ops モジュールを
押さえてもらえれば良いと思います。bpy モジュールを使ってみる
それでは試しに、
bpy モジュールを使用して、
先程表示した起動画面のオブジェクトの一覧を確認してみましょう。
その後、Cube オブジェクトを消去してみましょう。Cube や Camera 等の Blender 内で管理されるものの多くは
Objectクラス として管理されており、
その一覧は
bpy.data.objectsで管理されています。以下のソースコードで確認してみましょう。
import bpy
for obj in bpy.data.objects:
print(obj)実行できましたか?
フォーマットは整っていませんが、
先程挙げた Camera・Cube・Lamp の文字が確認できたと思います。
この中からCubeを削除してみましょう。
削除の方法は幾つかありますが、
今回は
bpy.data.objects.remove()
を使用してみましょう。このメソッドを使ってオブジェクトを消去するには、
消去したいオブジェクトのインスタンスを引数に渡す必要があります。
インスタンスは
bpy.data.objects[key] で取得できます。
key には 'Camera'・'Cube'・'Lamp' 等を指定しましょう。さて、実際に消去できるか以下のコードで実験してみましょう。
import bpy
def print_objects():
for obj in bpy.data.objects:
print(obj)
print('--- before remove ---')
print_objects()
bpy.data.objects.remove(bpy.data.objects['Cube'])
print('--- after remove ---')
print_objects()削除後には一覧から Cube のオブジェクトが消えているのを確認できましたか?
-b オプションを付けずに実行して、実際に GUI でも消えているのを確認しても良いです。
まとめ
今回は Blender の実行から、
Blender を Python で操作する際に必要となる
bpyモジュールの紹介と、
実際に使って見るところまでやりました。次回はカメラオブジェクトについてと、
注視点を位置ベクトルで指定してカメラの方向を操作する方法について説明します。
