[PYTHON] [Blender] Verwenden Sie OpenGL aus dem Skript heraus

Wollten Sie schon immer Ihre eigene Benutzeroberfläche erstellen, während Sie Blender-Add-Ons entwickeln? Beim Erstellen einer Benutzeroberfläche müssen Bilder usw. in Blender angezeigt werden. Glücklicherweise stellt die Blender-API eine API für den Zugriff auf OpenGL bereit. Wenn Sie diese API zusammen mit den in den folgenden Artikeln vorgestellten Mausereignissen verwenden, können Sie Ihre eigene Benutzeroberfläche erstellen, ohne der Blender-spezifischen Benutzeroberfläche zu folgen.

[Blender] Umgang mit Maus- und Tastaturereignissen in Blender-Skripten

Obwohl APIs bereitgestellt werden, werden nicht alle OpenGL-Funktionen bereitgestellt. Daher können Sie nur den von Blender bereitgestellten API-Bereich nutzen. Wenn es sich jedoch um einen einfachen Zeichenvorgang wie die Benutzeroberfläche eines Add-Ons handelt, reicht die bereitgestellte API meiner Meinung nach aus.

In diesem Artikel zeige ich Ihnen ein Beispiel für das Zeichnen eines Rechtecks in View3D und zeige Ihnen, wie Sie OpenGL von Blender verwenden.

Beispielcode

opengl_on_blender.py



import bpy
import bgl    #Erforderlich, um OpenGL in Blender zu verwenden


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):
    """Zeichne ein Quadrat"""
    
    bl_idname = "view3d.rect_renderer"
    bl_label = "Rect renderer"

    __handle = None    #Zeichenfunktion
    
    #Registrieren Sie die Zeichenfunktion des Bereichs "View3D"
    @staticmethod
    def handle_add():
        RectRenderer.__handle = bpy.types.SpaceView3D.draw_handler_add(
            RectRenderer.render_rect,
            (), 'WINDOW', 'POST_PIXEL')

    #Heben Sie die Registrierung der Zeichenfunktion im Bereich "View3D" auf
    @staticmethod
    def handle_remove():
        if RectRenderer.__handle is not None:
            bpy.types.SpaceView3D.draw_handler_remove(
                RectRenderer.__handle, 'WINDOW')
            RectRenderer.__handle = None
    
    #Zeichnungsfunktionskörper im Bereich "View3D"
    @staticmethod
    def render_rect():
        #Zeichenbereich erstellen
        positions = [
            [10.0, 10.0],     #Unten links
            [10.0, 600.0],    #Oben links
            [600.0, 600.0],   #Oben rechts
            [600.0, 10.0]     #Rechts unten
            ]

        #Mit OpenGL ein Quadrat zeichnen
        bgl.glEnable(bgl.GL_BLEND)    #Aktivieren Sie Alpha Blend
        bgl.glBegin(bgl.GL_QUADS)    #Beginnen Sie mit dem Zeichnen eines Vierecks
        bgl.glColor4f(0.7, 0.5, 0.3, 0.6)    #Geben Sie die Farbe des zu zeichnenden Quadrats an
        for (v1, v2) in positions:
            bgl.glVertex2f(v1, v2)    #Registrierung von Eckpunkten
        bgl.glEnd()    #Beenden Sie das Zeichnen des Vierecks


#Verarbeitung zum Zeitpunkt der Skriptinstallation
def register():
    bpy.utils.register_module(__name__)
    RectRenderer.handle_add()


#Verarbeitung bei der Deinstallation des Skripts
def unregister():
    bpy.utils.unregister_module(__name__)
    RectRenderer.handle_remove()


if __name__ == "__main__":
    register()

Wie benutzt man

  1. Installieren Sie das Plug-In unter Bezugnahme auf die Blender-Wiki-Seite.
  2. Vergewissern Sie sich, dass das Quadrat in View3D angezeigt wird.

20150722.jpg

Erläuterung des Beispielcodes

Die grundlegende Erklärung des Blender-Skripts wird im folgenden Artikel vorgestellt. Daher konzentrieren wir uns hier auf die Erklärung der neu hinzugefügten Elemente. [\ Blender ] So erstellen Sie ein Blender-Plug-In

Bgl-Modul importieren

Um die von Blender bereitgestellte OpenGL-API verwenden zu können, müssen Sie das Modul `` `bgl``` importieren.

import bgl

Registrierung der Zeichenfunktion "View3D"

Rufen Sie bei der Installation des Skripts `RectRenderer.handle_add ()` auf, um die Zeichenfunktion zu registrieren. Dadurch kann das Rechteck nach der Installation des Skripts gezeichnet werden.

#Verarbeitung zum Zeitpunkt der Skriptinstallation
def register():
    bpy.utils.register_module(__name__)
    RectRenderer.handle_add()

RectRenderer.handle_add()Wird als statische Methode implementiert.



#### **`bpy.types.SpaceView3D.draw_handler_add()Ist eine Funktion, die eine Zeichenfunktion für den Bereich "View3D" registriert.`**

Geben Sie im ersten Argument ** Zeichnungsfunktionskörper ** und ** Parameter ** an, die an das im ersten Argument im zweiten Argument angegebene Zeichnungsfunktionsargument übergeben werden sollen. Speichern Sie den ** Handler **, den Rückgabewert von `bpy.types.SpaceView3D.draw_handler_add ()`, in der Variablen `` __handle```, falls Sie die registrierte Zeichenfunktion freigeben möchten. Ich werde.

    #Registrieren Sie die Zeichenfunktion des Bereichs "View3D"
    @staticmethod
    def handle_add():
        RectRenderer.__handle = bpy.types.SpaceView3D.draw_handler_add(
            RectRenderer.render_rect,
            (), 'WINDOW', 'POST_PIXEL')

Heben Sie die Registrierung der Zeichenfunktion "View3D" auf

Rufen Sie bei der Deinstallation des Skripts `RectRenderer.handle_remove ()` auf, um die Registrierung der Zeichenfunktion aufzuheben. Verhindert, dass das Rechteck nach der Deinstallation des Skripts gezeichnet wird.

#Verarbeitung bei der Deinstallation des Skripts
def unregister():
    bpy.utils.unregister_module(__name__)
    RectRenderer.handle_remove()

RectRenderer.handle_remove()Wird als statische Methode implementiert.



#### **`bpy.types.SpaceView3D.draw_handler_remove()Ist eine Funktion, die die für den Bereich "View3D" registrierte Zeichenfunktion abbricht.`**

Übergeben Sie als erstes Argument den ** Handler **, der den Rückgabewert von `bpy.types.SpaceView3D.draw_handler_add ()` ist.

    #Heben Sie die Registrierung der Zeichenfunktion im Bereich "View3D" auf
    @staticmethod
    def handle_remove():
        if RectRenderer.__handle is not None:
            bpy.types.SpaceView3D.draw_handler_remove(
                RectRenderer.__handle, 'WINDOW')
            RectRenderer.__handle = None

Zeichnungsfunktionskörper "View3D"

Die Zeichnungsverarbeitung wird dem Zeichnungsfunktionskörper hinzugefügt. Wie jeder, der OpenGL verwendet hat, sofort weiß, ist es der Verwendung von OpenGL in C-Sprache sehr ähnlich. Beachten Sie jedoch, dass der Funktion `bgl.``` vorangestellt wird, da das Modul` bgl``` verwendet wird. Es gibt viele Informationen zur Verwendung von OpenGL in C-Sprache im Web, daher werde ich hier nicht auf die spezifische Verwendung von OpenGL eingehen. Für das diesmal gezeigte Beispiel wird der spezifische Verarbeitungsinhalt als Kommentar im Quellcode beschrieben. Überprüfen Sie ihn daher bitte. Die von Blender veröffentlichte OpenGL-API kann unter der folgenden URL bestätigt werden. http://www.blender.org/api/blender_python_api_2_60_4/bgl.html

    #Zeichnungsfunktionskörper im Bereich "View3D"
    @staticmethod
    def render_rect():
        #Zeichenbereich erstellen
        positions = [
            [10.0, 10.0],     #Unten links
            [10.0, 600.0],    #Oben links
            [600.0, 600.0],   #Oben rechts
            [600.0, 10.0]     #Rechts unten
            ]

        #Mit OpenGL ein Quadrat zeichnen
        bgl.glEnable(bgl.GL_BLEND)    #Aktivieren Sie Alpha Blend
        bgl.glBegin(bgl.GL_QUADS)    #Beginnen Sie mit dem Zeichnen eines Vierecks
        bgl.glColor4f(0.7, 0.5, 0.3, 0.6)    #Geben Sie die Farbe des zu zeichnenden Quadrats an
        for (v1, v2) in positions:
            bgl.glVertex2f(v1, v2)    #Registrierung von Eckpunkten
        bgl.glEnd()    #Beenden Sie das Zeichnen des Vierecks

Recommended Posts

[Blender] Verwenden Sie OpenGL aus dem Skript heraus
Verwenden Sie die Flickr-API von Python
[Blender] Weisen Sie Ihren eigenen Funktionen im Skript Tastenkombinationen zu
Verwenden Sie Django aus einem lokalen Python-Skript
Verwenden Sie die Kaggle-API in einem Docker-Container
Verwenden Sie das nghttp2 Python-Modul von Homebrew aus pyenvs Python
Greifen Sie über REPL auf die im Skript definierten Variablen zu
Übergeben von Argumenten beim Aufrufen von Python-Skripten über Blender in der Befehlszeile
Holen Sie sich den Rückkehrcode eines Python-Skripts von bat
Ich wollte die Python-Bibliothek von MATLAB verwenden
Abgeschlossenes Blender-Skript (2.8), das nur den Rock löscht
Der erste Schritt, um Blender von Python verfügbar zu machen
Verwenden Sie thingspeak aus Python
Verwenden Sie fließend Python
Verwenden Sie MySQL aus Python
Verwenden Sie MySQL aus Python
Verwenden Sie BigQuery aus Python.
Verwenden Sie mecab-ipadic-neologd von Python
[Teil 4] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
[Teil 1] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
[Teil 3] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
Greifen Sie über das Ausführungsskript mit einem relativen Pfad auf die Datei zu.
Erstellen Sie mit dem Blender 2.80-Skript eine beispielhafte spielähnliche Phase
[Teil 2] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern