読者です 読者をやめる 読者になる 読者になる

趣味プログラマによるOSS開発日誌

趣味で作っているOSSソフトウェアの紹介や関連技術の紹介、楽曲製作、Webデザイン勉強状況を紹介します。

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関連のプログラミングに慣れている方にとっては、相当簡単に思えるかも。)

  • Pythonの知識(入門レベルでも問題ない)
  • モデリングやCGなどの3DCGの知識(UV座標・法線などの基本的な知識は最低限必要)
  • 数学・物理の知識(物理演算などのプラグインを作成する場合は必要)
  • 英語(リファレンスや開発者サイトはすべて英語だが、高校レベルの英語力があれば問題ない)

ケルトンコード

Blenderプラグインのスケルトンコードを以下に示す。

# 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 = {
    "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"                   # プラグインのカテゴリ名
}

プラグインに関する情報を記述する。ソースコードのコメントがそのまま説明となっているため、ここでは特に何も説明しない。プラグインblenderwikiに公開したい場合は、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関数を呼び出すだけでよい。

プラグインの実行

上記のスケルトプラグインを実際に動作させてみよう。プラグインのインストールの手順は以下のとおり。なお、インストール手順についてはBlenderWikiページにも記載されている。
http://wiki.blender.org/index.php/Doc:JA/2.6/Manual/Extensions/Python/Add-Ons

  1. 「File」-「User Preferences」を選択
  2. 「Addons」タブを選択
  3. 「Install from File...」ボタンを押す
  4. インストールしたいプラグインを選択
  5. インストールされたプラグインの横のチェックボックスをオン
  6. 「Edit Mode」で「U」を押す
  7. Hoge Menu」と表示されていることを確認する
  8. Hoge Menu」をクリックすると処理が実行される(今回の場合は特に何も処理を行っていないので、何も起こらない)

うまくインストールできれば、各画面で以下のように確認することができる。

  • 「User Preferences」-「Addons」

  • 「Edit Mode」で「U」を押したときの様子