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

Wenn Sie ein Blender-Plug-In erstellen, möchten Sie Ereignisse über die Maus oder die Tastatur verarbeiten und interaktivere Funktionen bereitstellen. Die Funktion zum Ändern der Größe eines Objekts durch einfaches Bewegen der Maus, wenn die S-Taste im Objektmodus gedrückt wird, ist nur ein Beispiel für die Behandlung eines Ereignisses mit der Maus, und das Bedienungsgefühl ist gut.

Dieses Mal zeige ich Ihnen, wie Sie mit Blender-Skripten und Beispielen mit Maus- und Tastaturereignissen umgehen.

Stichprobe

Wieder wird das Beispiel zuerst gezeigt. Dieses Beispiel kann das Objekt entsprechend der Position der Maus vergrößern / verkleinern. Wir haben uns mit den folgenden Ereignissen befasst, damit Sie das Muster der Eingabeereignisse in Blender verstehen können.

Quellcode

mouse_keyboard_event_test.py


import bpy

bl_info = {
    "name" : "Mouse/Keyboard event test",
    "author" : "Nutti",
    "version" : (0,1),
    "blender" : (2, 7, 0),
    "location" : "UV > Mouse/Keyboard event test",
    "description" : "Mouse/Keyboard event test.",
    "warning" : "",
    "wiki_url" : "",
    "tracker_url" : "",
    "category" : "UV"
}

running = False     #True, wenn das Ereignis erfasst wird

class MouseKeyboardEventTest(bpy.types.Operator):
    """Mouse/Keyboard event test."""
    
    bl_idname = "uv.mouse_keyboard_event_test"
    bl_label = "Mouse/Keyboard event test"
    bl_description = "Mouse/Keyboard event test"
    bl_options = {'REGISTER', 'UNDO'}
    
    obj_scale = 1.0     #Objektvergrößerung
    orig_x = 0.0        #X-Koordinate beim Drücken der Taste
    orig_scale = []     #Objektvergrößerung beim Drücken der Taste

    def modal(self, context, event):
        global running
    
        #Beenden, wenn nicht funktioniert
        if running is False:
            return {'PASS_THROUGH'}
        
        #Wenden Sie eine Vergrößerung auf Objekte an
        active_obj = bpy.context.active_object
        active_obj.scale[0] = self.orig_scale[0] * self.obj_scale
        active_obj.scale[1] = self.orig_scale[1] * self.obj_scale
        active_obj.scale[2] = self.orig_scale[2] * self.obj_scale
        
        #############################################
        #Maus/Verarbeitung zur Behandlung von Tastaturereignissen
        #############################################
        
        #Mausbewegung-Stellen Sie die Vergrößerung des Objekts basierend auf der X-Koordinate der Maus ein
        if event.type == 'MOUSEMOVE':
            factor = 1.0 / 100.0
            self.obj_scale = 1.0 + (event.mouse_x - self.orig_x) * factor
            return {'RUNNING_MODAL'}
        #Wenn Sie die Leertaste drücken-Geben Sie die Vergrößerung zurück, wenn Sie die Taste drücken
        elif event.type == 'SPACE':
            if event.value == 'PRESS':
                self.orig_x = event.mouse_x
                return {'RUNNING_MODAL'}
        #Wenn Sie mit der rechten Maustaste klicken-Bestätigen Sie das geänderte Vergrößerungsverhältnis und beenden Sie den Vorgang
        if event.type == 'RIGHTMOUSE':
            if event.value == 'PRESS':
                running = False
                return {'FINISHED'}
        
        return {'RUNNING_MODAL'}
    
    def invoke(self, context, event):
        global running
        
        if context.area.type == 'VIEW_3D':
            #Akzeptieren Sie jedes Ereignis, wenn die Taste gedrückt wird, während sie nicht ausgeführt wird
            if running is False:
                running = True
                #Einstellung des Anfangszustands
                self.obj_scale = 1.0
                self.orig_x = event.mouse_x
                active_obj = bpy.context.active_object
                self.orig_scale = [
                    active_obj.scale[0],
                    active_obj.scale[1],
                    active_obj.scale[2]
                ]
                #Modal-Handler-Einstellungen
                context.window_manager.modal_handler_add(self)
                return {'RUNNING_MODAL'}
        return {'CANCELLED'}
        
# 'N'Platzieren Sie eine Schaltfläche im Menü, das auf der rechten Seite von VIEW 3D angezeigt wird, wenn Sie eine Taste drücken
class OBJECT_PT_MKET(bpy.types.Panel):
    bl_label = "Mouse/Keyboard Event Test"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    
    def draw(self, context):
        sc = context.scene
        layout = self.layout
        #Platzierung der Tasten
        layout.operator(MouseKeyboardEventTest.bl_idname, text="Start", icon="PLAY")


def register():
    bpy.utils.register_module(__name__)


def unregister():
    bpy.utils.unregister_module(__name__)


if __name__ == "__main__":
    register()

Wie benutzt man

Führen Sie die folgenden Schritte aus, um das Skript zu installieren. Blender Wiki

Wenn Sie im Menü "Maus- / Tastaturereignistest" des rechts angezeigten Menüs auf die Schaltfläche "Start" klicken, während Sie in View 3D die Taste "N" drücken, werden die folgenden Vorgänge akzeptiert.

Operation Verhalten an Objekten
Mausbewegung Bewegen Sie die Maus rechts vom Bildschirm, von wo aus Sie auf die Schaltfläche geklickt haben, um das ausgewählte Objekt zu vergrößern, und bewegen Sie es zum Verkleinern links vom Bildschirm.
Leertaste Stellt die Größe des Objekts wieder her, als auf die Schaltfläche geklickt wurde.
Rechtsklick Bestätigen Sie die Größe des geänderten Objekts und beenden Sie den Vorgang.

Beispielerklärung

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-Plugin

Tastenregistrierung

Fügen Sie dem Menü auf der rechten Seite eine Schaltfläche hinzu, die angezeigt wird, wenn Sie in View 3D die Taste 'N' drücken. Die Registrierung von Schaltflächen geht über den Rahmen dieses Artikels hinaus. Betrachten Sie sie daher vorerst als solche.

# 'N'Platzieren Sie eine Schaltfläche im Menü, das auf der rechten Seite von VIEW 3D angezeigt wird, wenn Sie eine Taste drücken
class OBJECT_PT_MKET(bpy.types.Panel):
    bl_label = "Mouse/Keyboard Event Test"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    
    def draw(self, context):
        #Platzierung der Tasten
        # ...

Methode aufrufen

** Die Methode, die aufgerufen wird, wenn die Klasse aufgerufen wird **. In diesem Beispiel wird es aufgerufen, wenn auf die Schaltfläche geklickt wird.

    def invoke(self, context, event):
        global running
        
        if context.area.type == 'VIEW_3D':
            #Akzeptieren Sie jedes Ereignis, wenn die Taste gedrückt wird, während sie nicht ausgeführt wird
            if running is False:
                running = True

                #Einstellung des Anfangszustands
                # ....

                #Modal-Handler-Einstellungen
                context.window_manager.modal_handler_add(self)
                return {'RUNNING_MODAL'}
        return {'CANCELLED'}

In der Funktion "context.window_manager.modal_handler_add" wird ein Handler (ein Objekt mit einer "modalen" Methode) angegeben, um Mausereignisse nach dem Klicken auf die Schaltfläche zu akzeptieren. Geben Sie hier "self" an, da die Klasse gleichzeitig eine "invoke" -Methode und eine "modal" -Methode hat. Zusätzlich werden verschiedene Anfangszustandseinstellungen vorgenommen.

Wenn Sie hier einen Handler festlegen, wird die modale Methode weiterhin ** nach ** aufgerufen. Daher haben wir eine Variable "running" vorbereitet, um Operationen am Objekt zu eliminieren, selbst wenn ein Ereignis beim Stoppen auftritt.

modale Methode

Wenn Sie einen Handler mit der Funktion context.window_manager.modal_handler_add in der Methode invoke registrieren, wird er ** aufgerufen, wenn ein Ereignis über die Maus oder die Tastatur ** auftritt.

    def modal(self, context, event):
        global running

        #Beenden, wenn nicht funktioniert
        if running is False:
            return {'PASS_THROUGH'}

        # ....
        
        #Mausbewegung-Stellen Sie die Vergrößerung des Objekts basierend auf der X-Koordinate der Maus ein
        if event.type == 'MOUSEMOVE':
            factor = 1.0 / 100.0
            self.obj_scale = 1.0 + (event.mouse_x - self.orig_x) * factor
            return {'RUNNING_MODAL'}
        #Wenn Sie die Leertaste drücken-Geben Sie die Vergrößerung zurück, wenn Sie die Taste drücken
        elif event.type == 'SPACE':
            if event.value == 'PRESS':
                self.orig_x = event.mouse_x
                return {'RUNNING_MODAL'}
        #Wenn Sie mit der rechten Maustaste klicken-Bestätigen Sie das geänderte Vergrößerungsverhältnis und beenden Sie den Vorgang
        if event.type == 'RIGHTMOUSE':
            if event.value == 'PRESS':
                running = False
                return {'FINISHED'}
        
        return {'RUNNING_MODAL'}

Die "modale" Methode behandelt jedes Ereignis wie folgt.

Veranstaltung wird bearbeitet
Mausbewegung Ruft die aktuelle Position ab und berechnet die laterale Differenz zwischen der aktuellen Position und der Anfangsposition, um die Vergrößerung des Objekts einzustellen.
danach,{'RUNNING_MODAL'}Wird zurückgegeben und die Verarbeitung fortgesetzt.
Rechtsklick {'FINISHED'}Gibt den Vorgang zurück und beendet ihn.
Leertaste Ändern Sie das Vergrößerungsverhältnis des Objekts auf den Anfangswert.
danach,{'RUNNING_MODAL'}Wird zurückgegeben und die Verarbeitung fortgesetzt.
Andere {'RUNNING_MODAL'}Wird zurückgegeben und die Verarbeitung fortgesetzt.

Am Ende

Ich habe Ihnen gezeigt, wie Sie mit Ereignissen von Maus und Tastatur in Blender-Skripten umgehen. Wenn ich die Ereignisse von Tastatur und Maus kenne, denke ich, dass mit Skripten mehr erreicht werden kann. Warum also nicht versuchen, sie zu verwenden?

Referenzinformationen

Recommended Posts

[Blender] Umgang mit Maus- und Tastaturereignissen in Blender-Skripten
Umgang mit Sitzungen in SQLAlchemy
[Blender] So erstellen Sie Blender-Skripte mehrsprachig
Ausführen externer Shell-Skripte und -Befehle in Python
Umgang mit Japanisch mit Python
So führen Sie vom Server gesendete Ereignisse in Django durch
Verwendung ist und == in Python
So schreiben Sie den richtigen Shebang in Perl-, Python- und Ruby-Skripten
So generieren Sie eine Sequenz in Python und C ++
Datenbereinigung Umgang mit fehlenden und Ausreißern
Wie man mit dem Datum / Uhrzeit-Typ in Pythons SQLite3 umgeht
Wie man Autokorrelation und partielle Autokorrelation mit Python zeichnet
Wie Sie das aktuelle Verzeichnis in Python in Blender kennen
So definieren Sie Decorator und Decomaker mit einer Funktion
Wie klicke ich mit der rechten Maustaste über die Tastatureingabe in RPA?
[Python] So sortieren Sie Diktate in Listen und Instanzen in Listen
Wie man Decorator in Django benutzt und wie man es macht
Umgang mit JSON in Ruby, Python, JavaScript, PHP
So erhalten Sie RGB- und HSV-Histogramme mit OpenCV
[Python] Wie man mit inf und NaN bei numpy Durchschnitt, Standardabweichung, Maximum / Minimum umgeht
Ein Skript, das bis zu 5 Sekunden zählt und in Blenders Python stoppt
Ausländer sprechen: Wie man Klassen und Methoden auf Englisch benennt
Wie Sie pyenv und pyenv-virtualenv auf Ihre eigene Weise verwenden
[Einführung in die Udemy Python3 + -Anwendung] 36. Verwendung von In und Not
Erstellen und Verwenden von statischen / dynamischen Bibliotheken in C-Sprache
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
So erhalten Sie alle Schlüssel und Werte im Wörterbuch
[TF] Laden / Speichern von Modell und Parameter in Keras
Wie man in Python entwickelt
Umgang mit Datenrahmen
So erstellen Sie einen Datenrahmen und spielen mit Elementen mit Pandas
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Kopieren und Einfügen von Befehlszeileninhalten mit bash unter Linux oder Mac ohne Maus
So stellen Sie die Ausgabeauflösung für jeden Keyframe in Blender ein
So aktualisieren Sie die App Store-Beschreibung in Google Spreadsheets und Fastlane automatisch
So installieren Sie OpenCV in Cloud9 und führen es in Python aus
So vergleichen Sie Listen und rufen allgemeine Elemente in einer Liste ab
Repeated @ app.callback in Dash So schreiben Sie Input und State ordentlich
Geben und meinen Sie die Einschränkungsoption in scipy.optimize.minimize
Verwendung von Funktionen in separaten Dateien Perl-Version und Python-Version
<Pandas> Umgang mit Zeitreihendaten in der Pivot-Tabelle
[ROS2] Beschreibung der Neuzuordnung und der Parameter beim Start des Python-Formats
So zeigen Sie Bytes in Java und Python auf die gleiche Weise an
[Python] Wie man PCA mit Python macht
Verwendung von Klassen in Theano
Wie man nüchtern mit Pandas schreibt
So sammeln Sie Bilder in Python
So aktualisieren Sie Spyder in Anaconda
Wie man CSS in Django reflektiert
So installieren und konfigurieren Sie Amsel
Verwendung von .bash_profile und .bashrc
Wie man Prozesse in großen Mengen abbricht
So installieren und verwenden Sie Graphviz
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
[Blender] So erstellen Sie ein Blender-Plug-In
Verwendung von PubChem mit Python
So führen Sie TensorFlow 1.0-Code in 2.0 aus