LoginSignup
8

More than 5 years have passed since last update.

[Blender] スクリプトの内部からOpenGLを利用する

Posted at

Blenderのアドオンを開発していると独自にUIを作りたいと思ったことはありませんか?
UIを作るとなるとBlender内で画像などを表示する必要があるのですが、幸いなことにBlender APIには、OpenGLにアクセスするためのAPIが公開されています。
このAPIと以下の記事で紹介しているマウスイベントをあわせて使えばBlender専用のUIに従わず独自のUIを構築することができます。

[Blender] Blenderスクリプトでマウスやキーボードのイベントを扱う方法

ただしAPIが用意されているとは言っても、OpenGLの全ての機能に対してAPIが用意されているわけではありません。
そのため、できることがBlenderが用意しているAPIの範囲内に限られてしまいますが、アドオンのUIくらいの簡単な描画処理ならば、用意されているAPIだけでも十分事足りると思います。

この記事では、View3Dに四角形を描くサンプルを紹介し、BlenderからOpenGLを利用する方法を説明します。

サンプルコード

opengl_on_blender.py

import bpy
import bgl    # OpenGLをBlender内部から利用するために必要


bl_info = {
    "name": "Tutorial: OpenGL on Blender",
    "author": "Nutti",
    "version": (1, 0),
    "blender": (2, 74, 0),
    "location": "View3D > Tutorial: OpenGL on Blender",
    "description": "Tutorial: Use Blender's OpenGL API.",
    "warning": "",
    "support": "COMMUNITY",
    "wiki_url": "",
    "tracker_url": "",
    "category": "3D View"
}


class RectRenderer(bpy.types.Operator):
    """四角形を描画する"""

    bl_idname = "view3d.rect_renderer"
    bl_label = "Rect renderer"

    __handle = None    # 描画関数

    # 「View3D」領域の描画関数を登録
    @staticmethod
    def handle_add():
        RectRenderer.__handle = bpy.types.SpaceView3D.draw_handler_add(
            RectRenderer.render_rect,
            (), 'WINDOW', 'POST_PIXEL')

    # 「View3D」領域の描画関数を登録解除
    @staticmethod
    def handle_remove():
        if RectRenderer.__handle is not None:
            bpy.types.SpaceView3D.draw_handler_remove(
                RectRenderer.__handle, 'WINDOW')
            RectRenderer.__handle = None

    # 「View3D」領域の描画関数本体
    @staticmethod
    def render_rect():
        # 描画領域の作成
        positions = [
            [10.0, 10.0],     # 左下
            [10.0, 600.0],    # 左上
            [600.0, 600.0],   # 右上
            [600.0, 10.0]     # 右下
            ]

        # OpenGLによる四角形の描画
        bgl.glEnable(bgl.GL_BLEND)    # アルファブレンドの有効化
        bgl.glBegin(bgl.GL_QUADS)    # 四角形の描画を開始
        bgl.glColor4f(0.7, 0.5, 0.3, 0.6)    # 描画する四角形の色を指定
        for (v1, v2) in positions:
            bgl.glVertex2f(v1, v2)    # 頂点の登録
        bgl.glEnd()    # 四角形の描画を終了


# スクリプトインストール時の処理
def register():
    bpy.utils.register_module(__name__)
    RectRenderer.handle_add()


# スクリプトアンインストール時の処理
def unregister():
    bpy.utils.unregister_module(__name__)
    RectRenderer.handle_remove()


if __name__ == "__main__":
    register()

使い方

  1. Blender Wikiページを参考にプラグインをインストールします。
  2. View3Dに四角形が表示されていることを確認します。

20150722.jpg

サンプルコードの解説

Blenderスクリプトの基本的な解説は以下の記事で紹介しているので、ここでは新しく追加された要素の解説に絞ります。
[Blender] Blenderプラグインの作り方

bglモジュールのインポート

Blenderが用意しているOpenGLのAPIを利用するためには、 bgl モジュールをインポートする必要があります。

import bgl

「View3D」描画関数の登録

スクリプトをインストールする時に、描画関数を登録するため RectRenderer.handle_add() を呼びます。
これにより、スクリプトのインストール後に四角形が描画されるようになります。

# スクリプトインストール時の処理
def register():
    bpy.utils.register_module(__name__)
    RectRenderer.handle_add()

RectRenderer.handle_add() は、静的メソッドとして実装します。
bpy.types.SpaceView3D.draw_handler_add() は、「View3D」領域に対する描画関数を登録する関数です。
第1引数に 描画関数本体 、第2引数に 第1引数に指定した描画関数の引数に渡すパラメータ を指定します。
登録した描画関数を解除するときのために、 bpy.types.SpaceView3D.draw_handler_add() の戻り値である ハンドラ を、変数 __handle に保存します。

    # 「View3D」領域の描画関数を登録
    @staticmethod
    def handle_add():
        RectRenderer.__handle = bpy.types.SpaceView3D.draw_handler_add(
            RectRenderer.render_rect,
            (), 'WINDOW', 'POST_PIXEL')

「View3D」描画関数の登録解除

スクリプトのアンインストール時には、描画関数の登録を解除するために RectRenderer.handle_remove() を呼びます。
スクリプトがアンインストールされた後に、四角形が描画されないようにします。

# スクリプトアンインストール時の処理
def unregister():
    bpy.utils.unregister_module(__name__)
    RectRenderer.handle_remove()

RectRenderer.handle_remove() は、静的メソッドとして実装します。
bpy.types.SpaceView3D.draw_handler_remove() は、「View3D」領域に対して登録した描画関数を解除する関数です。
第1引数に bpy.types.SpaceView3D.draw_handler_add() の戻り値である ハンドラ を渡します。

    # 「View3D」領域の描画関数を登録解除
    @staticmethod
    def handle_remove():
        if RectRenderer.__handle is not None:
            bpy.types.SpaceView3D.draw_handler_remove(
                RectRenderer.__handle, 'WINDOW')
            RectRenderer.__handle = None

「View3D」描画関数本体

描画関数本体には描画処理を追加します。
OpenGLを利用したことがある方であればすぐ分かると思いますが、C言語でのOpenGLの使い方と非常に良く似ています。
ただし bgl モジュールを利用するため、 bgl. を関数の先頭につけることに注意してください。
C言語でのOpenGLの使い方はWeb上にたくさん情報がありますので、OpenGLの具体的な使い方はここでは説明しません。
今回示したサンプルについては、ソースコード内に具体的な処理内容をコメントとして記載しているので、確認してみてください。
なお、Blenderで公開されているOpenGLのAPIは、以下のURLから確認することが出来ます。
http://www.blender.org/api/blender_python_api_2_60_4/bgl.html

    # 「View3D」領域の描画関数本体
    @staticmethod
    def render_rect():
        # 描画領域の作成
        positions = [
            [10.0, 10.0],     # 左下
            [10.0, 600.0],    # 左上
            [600.0, 600.0],   # 右上
            [600.0, 10.0]     # 右下
            ]

        # OpenGLによる四角形の描画
        bgl.glEnable(bgl.GL_BLEND)    # アルファブレンドの有効化
        bgl.glBegin(bgl.GL_QUADS)    # 四角形の描画を開始
        bgl.glColor4f(0.7, 0.5, 0.3, 0.6)    # 描画する四角形の色を指定
        for (v1, v2) in positions:
            bgl.glVertex2f(v1, v2)    # 頂点の登録
        bgl.glEnd()    # 四角形の描画を終了

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8