MRが楽しい

MRやVRについて学習したことを書き残す

Blender2.8でpythonスクリプトを利用する

本日は Blender の技術調査枠です。
Blender2.8 の操作を python スクリプトを使って実行する手順を記事にします。
f:id:bluebirdofoz:20190902080359j:plain

Python APIの確認方法

Blender2.8 の Python API に関するマニュアルは以下になります。
docs.blender.org

または GUI 上で行いたい操作にマウスオーバーすると、その操作の Python API が表示されます。
f:id:bluebirdofoz:20190902080423j:plain

Blender2.79でのログウィンドウに当たる情報は[情報]ウィンドウを有効にすると確認できます。
f:id:bluebirdofoz:20190902080432j:plain

[情報]ウィンドウで実行した操作の一部を Python API で確認することができます。
f:id:bluebirdofoz:20190902080443j:plain

Pythonのコマンド実行

実際に Blender 上で Python スクリプトを実行してみます。
実行用のウィンドウを用意し、エディタータイプから[Pythonコンソール]を選択します。
f:id:bluebirdofoz:20190902080455j:plain

すると以下のエディタ画面が開きます。
f:id:bluebirdofoz:20190902080505j:plain

試しに Cube オブジェクトを削除してみます。
以下のコマンドでシーンの"Collection"に含まれた"Cube"オブジェクトの削除(リンク削除)が行えます。

bpy.context.scene.collection.children['Collection'].objects.unlink(bpy.data.objects['Cube'])

実行してみると、"Cube"オブジェクトが削除されました。
f:id:bluebirdofoz:20190902080515j:plain

Pythonのファイル実行

Python スクリプトのテキストファイルを実行する事も可能です。
何度も利用する処理はスクリプトファイルとして保存しておくと便利です。

例えば、以下のような全オブジェクトの削除処理をスクリプトファイルとして保存します。
・AllDelete.py

# bpyインポート
import bpy

# 全オブジェクト/メッシュ/マテリアル/コレクションの削除
# 引数
# 戻り値
def delete_all():
    for item in bpy.data.objects:
        bpy.data.objects.remove(item)
    for item in bpy.data.meshes:
        bpy.data.meshes.remove(item)
    for item in bpy.data.materials:
        bpy.data.materials.remove(item)
    for item in bpy.data.collections:
        bpy.data.collections.remove(item)
    return

# 関数の実行例
delete_all()

次に作成したスクリプトファイルを Blender 内で利用してみます。
ウィンドウのエディタ―タイプから[テキストディター]を選択します。
f:id:bluebirdofoz:20190902080634j:plain

ウィンドウが切り替わったら[開く]ボタンから先ほど作成したスクリプトを選択して読み込みます。
f:id:bluebirdofoz:20190902080644j:plain

ファイルが読み込まれたら[スクリプト実行]ボタンで処理を開始します。
f:id:bluebirdofoz:20190902080654j:plain

スクリプトが実行され、全てのオブジェクトが削除されました。
f:id:bluebirdofoz:20190902080704j:plain

Blender2.79とBlender2.8のPythonの差異

Blender2.8は過去バージョンの Python API と差異があり、互換性が一部ありません。
公式ページの説明が以下にあります。
wiki.blender.org

以下のページで日本語訳されています。
dskjal.com

本ブログでも理解できたものは適宜まとめていきます。