Blenderのプログラミングの解説を、簡単なサンプルコードを使って紹介する。
プログラミングを覚えるには 「コードを打ち込めば、ほんの少しでもなにかが変わる」という楽しさを実際に体感するのがよいと考えているので、まずはサンプルコードをコンソールにコピペして使う。
手打ちするよりまずコピペして、コレを使うとなにが起きるのかを把握しながらやること。
手打ちは打ち損じや文法ミスの元なので、コピペで作っていくほうが堅実。
もくじ
準備
コンソールエディターを開く
コードを打つためのコンソールエディターを開いておく。
ヘッダーにあるWorkspaceを、一番右端にある[Scripting]に切り替えておく。
コンソールと情報エディター・テキストエディターが用意されて出てくる。
Workspaceの切り替えでなくても、ウィンドウエリアの1つをコンソールに変えて、コードを打ち込める状況にしておけばよい。
- ウィンドウの左上のアイコンからエディタ切り替え → [Python Console]
Cubeオブジェクトを作っておく
サンプルコードでは、シーン内にあるCubeを使うため、Cubeという名前のオブジェクトがシーンになければ、作っておくこと。
- 追加(Shift + A) → Mesh → [Cube] から、Cubeオブジェクトを作成
オートコンプリート機能を利用する
ヘッダーにある [オートコンプリート]を実行すると、現在書いている内容から予想される続きを、自動補完することができる。
今できることが一覧表示されるので、迷ったらとりあえず使ってみると良い。
逆にこれで続きが出てこない場合は、書き方が間違っている場合が多い。
bpy.data.objects[’ とまで書いた状態で実行すると、Blendファイル内に存在するオブジェクトをリストすることができる。
bpy.~
必須のまえがきみたいなもの。(BlenderPythonの略?)
単体では使わないので、とりあえず最初にいるものと思っておけばいい。
bpy.ops.~
あらかじめBlenderが用意した機能を実行できる。
オペレーター(operator)の略。
普通にBlenderを操作している時に実行されるもののほとんどはこれのため、プログラミングをしないユーザーには一番身近ではないだろうか。
注意点
このbpy.opsは利用できる状況が限定されていたり(特定のエディターでなければ動作しない・編集モードだと実行できないなど)、動作した結果を取得できなかったりする(オブジェクトの新規追加はできるが、追加したオブジェクトデータを直接確認できないなど)。
このため、bpy.opsを利用したソースコードはあまりよくない。
選択オブジェクトを削除
bpy.ops.object.delete()
全選択
bpy.ops.object.select_all()
()にプロパティを追記
コードを見ると、行末にカッコ()がついていることがわかる。
ここに、用意されたプロパティ(オプション)の設定を記入することができる。
それぞれのオペレーターごとに様々なプロパティがあり、どんなプロパティがあるかを詳しく調べるには、BlenderのAPIで検索して閲覧するとよい。
TOGGLE
切り替え。デフォルトではこれSELECT
選択DESELECT
選択解除INVERT
選択を反転
bpy.ops.object.select_allの検索結果 - BlenderAPI
全選択解除
全選択は、デフォルトで全選択と全選択解除が切り替わるようになっているため、常に全選択解除のみにするプロパティ。
bpy.ops.object.select_all(action='DESELECT')
Operator をコピーする方法
情報エディターから実行履歴を見ることができるため、そこからコピーしてコンソールで実行することができる。
他にも、下記の開発者用オプションをオンにしておけば、ボタンを右クリックしたときにPythonコマンドをコピーすることができる。
bpy.data.~
Blendファイル内に存在するデータそのものにアクセスできる。
主に全データにアクセスする時に使うことが多い。
サンプルコード
Cubeにアクセスする
"Cube"という名前のオブジェクトにアクセスする
bpy.data.objects['Cube']
Cubeを選択する
bpy.data.objects['Cube'].select_set(True)
Cubeの名前を「HOGE」に名前変更する
bpy.data.objects["Cube"].name = "HOGE"
すべてのオブジェクトを確認する
for obj in bpy.data.objects: obj.name
bpy.context.~
現在のシーン内での状態から、データにアクセスできる。
オブジェクトやシーンの設定の状態などにアクセスすることができる。
重要なのは、状況によって内容が随時変わるものだということ。
サンプルコード
現在選択中の全てのオブジェクトにアクセスする
bpy.context.selected_objects
現在選択中のアクティブオブジェクトにアクセスする
色々あるが、全部同じ
bpy.context.object bpy.context.active_object bpy.context.view_layer.objects.active
スナップ機能を有効にする
# スナップ機能を有効にする bpy.context.scene.tool_settings.use_snap = True