Blenderプラグインの作り方
Blenderを使っていると、標準で備わっていない機能があって困るときが(よく)ある。
嬉しいことに、Blenderは自由にプラグインが作成できるようになっているため、たいてい調べれば欲しい機能が見つかったりする。
しかし探してもプラグインが見つからない場合、「諦める」「Blender開発者に依頼する」「自作する」といった選択肢から選ぶことになる。
そこでこの記事では、Blenderのプラグインを作る方法について紹介する。
Blenderプラグインとは
Blenderは機能を拡張するため、さまざまなAPIを公開している。
APIを利用することで、例えば「現在選択されている面」「オブジェクトの頂点の位置」など、Blenderが内部で使用しているデータを取得することができる。
APIから取得できる情報は様々で、公開されているAPIは例えば以下から確認することができる。
http://www.blender.org/documentation/blender_python_api_2_67_release/contents.html
Blenderのプラグインは、これら提供されているAPIに対して処理を実行しているプログラムであると言える。
プラグイン作成に必要なこと
APIはすべてPythonベースであり、ユーザ向けのものではないため以下の知識が必要である。
一見するとかなり敷居が高そうに見えるが、実際はBlenderを作って何かしら作品を作ったことのある人なら問題ないと思う。(逆に、3DCG関連のプログラミングに慣れている方にとっては、相当簡単に思えるかも。)
スケルトンコード
# Blender内部のデータ構造にアクセスするために必要 import bpy # プラグインに関する情報 bl_info = { "name" : "Hoge Plugin", # プラグイン名 "author" : "Piyo", # 作者 "version" : (0,1), # プラグインのバージョン "blender" : (2, 6, 5), # プラグインが動作するBlenderのバージョン "location" : "UV Mapping > Hoge", # Blender内部でのプラグインの位置づけ "description" : "Hoge Fuga Piyo", # プラグインの説明 "warning" : "", "wiki_url" : "", # プラグインの説明が存在するWikiページのURL "tracker_url" : "", # Blender Developer OrgのスレッドURL "category" : "UV" # プラグインのカテゴリ名 } # オペレータ「Hoge」の処理を実施するクラス class CHoge(bpy.types.Operator): bl_idname = "uv.hoge" # add_to_menuで使用 bl_label = "Hoge Menu" # ラベル名 bl_description = "Hoge Piyo" # クラスの説明 bl_options = {'REGISTER', 'UNDO'} # 実際にプラグインが処理を実施する処理 def execute(self, context): return {'FINISHED'} # 成功した場合はFINISHEDを返す # オペレータ「Hoge」を登録する関数 def menu_func(self, context): self.layout.operator("uv.hoge") # 登録したいクラスの「bl_idname」を指定 # プラグインをインストールしたときの処理 def register(): bpy.utils.register_module(__name__) bpy.types.VIEW3D_MT_uv_map.append(menu_func) # プラグインをアンインストールしたときの処理 def unregister(): bpy.utils.unregister_module(__name__) bpy.types.VIEW3D_MT_uv_map.remove(menu_func) # メイン関数 if __name__ == "__main__": register()
スケルトンプラグインの解説
- bpyモジュールのimport
# Blender内部のデータ構造にアクセスするために必要 import bpy
Blenderの内部データにアクセスするためには、bpyと呼ばれるモジュールをインポートする必要がある。
- プラグインに関する情報(bl_info)
# プラグインに関する情報 bl_info = { "name" : "Hoge Plugin", # プラグイン名 "author" : "Piyo", # 作者 "version" : (0,1), # プラグインのバージョン "blender" : (2, 6, 5), # プラグインが動作するBlenderのバージョン "location" : "UV Mapping > Hoge", # Blender内部でのプラグインの位置づけ "description" : "Hoge Fuga Piyo", # プラグインの説明 "warning" : "", "wiki_url" : "", # プラグインの説明が存在するWikiページのURL "tracker_url" : "", # Blender Developer OrgのスレッドURL "category" : "UV" # プラグインのカテゴリ名 }
プラグインに関する情報を記述する。ソースコードのコメントがそのまま説明となっているため、ここでは特に何も説明しない。プラグインをblenderのwikiに公開したい場合は、WikiページのURLやBlender Deverloper OrgのURLを記載したほうが良いだろう。ただし個人で利用する場合は、locationやcategoryに気をつければ問題ない。参考までに私が作成したプラグインのWikiページとBlender Developer OrgのURLを以下に示しておく。
[Wiki] http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/UV/Copy_Paste_UVs
[Blender Developer Org] https://developer.blender.org/T38460
- オペレータ用のクラス
# オペレータ「Hoge」の処理を実施するクラス class CHoge(bpy.types.Operator): bl_idname = "uv.hoge" # add_to_menuで使用 bl_label = "Hoge Menu" # ラベル名 bl_description = "Hoge Piyo" # クラスの説明 bl_options = {'REGISTER', 'UNDO'} # 実際にプラグインが処理を実施する処理 def execute(self, context): return {'FINISHED'} # 成功した場合はFINISHEDを返す
実際にプラグインの処理を記載するクラス。bpy.types.Operatorクラスを継承する必要がある。executeメソッドに実行したい処理を記述し、戻り値は成功した場合、「FINISHED」にする必要がある。他に戻り値に指定できるものとして、エラーが生じた場合に操作を打ち切る「CANCELLED」などがある。詳しくは以下を参照のこと。
http://www.blender.org/documentation/blender_python_api_2_67_1/bpy.types.Operator.html
「bl_idname」「bl_label」「bl_description」は自由に変更してよい。
- プラグインのインストール・アンインストール時の処理
# オペレータ「Hoge」を登録する関数 def menu_func(self, context): self.layout.operator("uv.hoge") # 登録したいクラスの「bl_idname」を指定 # プラグインをインストールしたときの処理 def register(): bpy.utils.register_module(__name__) bpy.types.VIEW3D_MT_uv_map.append(menu_func) # プラグインをアンインストールしたときの処理 def unregister(): bpy.utils.unregister_module(__name__) bpy.types.VIEW3D_MT_uv_map.remove(menu_func)
プラグインをインストールしたときに実行される処理を「register」関数、アンインストールしたときに実行される処理を「unregister」関数に記述する。bpy.utils.register_moduleとbpy.utils.unregister_moduleでプラグインの登録を行う。bpy.types.VIEW3D_MT_uv_map.appendとbpy.types.VIEW3D_MT_uv_map.removeは「UV Map」のメニューに項目を追加・削除するというものである。登録したいクラス内で定義された「bl_idname」をself.layout.operatorの引数に渡した処理を記載した関数を作成(ここではmenu_func)し、bpy.types.VIEW3D_MT_uv_map.appendの引数に渡すことで、「UV Map」のメニューにbl_labelで指定された項目が追加される。bpy.types.VIEW3D_MT_uv_map.removeの引数に渡すと追加した項目が削除される。
- main関数
# メイン関数 if __name__ == "__main__": register()
main関数では、register関数を呼び出すだけでよい。
プラグインの実行
上記のスケルトンプラグインを実際に動作させてみよう。プラグインのインストールの手順は以下のとおり。なお、インストール手順についてはBlenderのWikiページにも記載されている。
http://wiki.blender.org/index.php/Doc:JA/2.6/Manual/Extensions/Python/Add-Ons
- 「File」-「User Preferences」を選択
- 「Addons」タブを選択
- 「Install from File...」ボタンを押す
- インストールしたいプラグインを選択
- インストールされたプラグインの横のチェックボックスをオン
- 「Edit Mode」で「U」を押す
- 「Hoge Menu」と表示されていることを確認する
- 「Hoge Menu」をクリックすると処理が実行される(今回の場合は特に何も処理を行っていないので、何も起こらない)
うまくインストールできれば、各画面で以下のように確認することができる。
- 「User Preferences」-「Addons」
- 「Edit Mode」で「U」を押したときの様子
参考文献
- https://developer.blender.org/
- http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts
- http://www.blender.org/documentation/blender_python_api_2_65_9/contents.html
- http://matosus304.blog106.fc2.com/blog-entry-257.html
[2014.11.23追記]
Qiitaに本内容を投稿しました。
http://qiita.com/nutti/items/a836391723bd28cd3e4c