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.
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.
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()
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. |
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
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
# ...
** 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.
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. |
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?
Recommended Posts