Hier machen wir erste Gehversuche mit Python als Skriptsprache in Blender
Wie viele andere Softwarepakete im Bereich der Medienproduktion lässt sich Blender mit der Programmiersprache Python automatisieren. Blender wird dazu mit einer eigenen Python-Distribution ausgeliefert und installiert (diese liegt im Blender-Installationsverzeichnis in einem eigenen python
Unterverzeichnis). Obwohl Blender selbst in den Programmiersprache C und C++ geschrieben wurde, ist der gesamte Source-Code eng mit Python verzahnt. Nahezu jede Funktionalität, die sich in Blender über das User Interface auslösen lässt, kann auch mit Python-Befehlen aus einem Skript aufgerufen werden. Darüber hinaus sind sämtliche Daten innerhalb von Blender über Python-Strukturen zugreifbar. Dazu zählen u.a.
- Szenen und Objekte
- Geometrie
- Kamera und Beleuchtung
- Materialien
- Texturen
Für allererste Schritte in Python innerhalb von Blender eignet sich die in Blender als eigener Editor eingebaute Python Konsole. Mit dieser kann wie mit dem python
-Befehl von der Kommandozeile des Betriebssystems interaktiv Python-Code Zeile für Zeile eingegeben werden.
- Startet Blender -> Die Standard-Szene mit einem Würfel erscheint
- Falls nicht geschehen: Selektiert den Würfel.
- Wechselt den Editor am unteren Rand vom Timeline Editor in den Python Console Editor, in dem ihr im Editor Header ganz unten links auf das Icon klickt.
- Gebt folgenden Befehl in der interaktiven Blender-Python-Console ein:
>>> bpy.ops.transform.translate(value=(0, 2, 0))
- Ergebnis: Der Würfel wird um zwei Einheiten entlang der Y-Achse verschoben (transliert).
Was fällt uns hier ins Auge?:
-
Alles, was Blender für das Skripten zur Verfügung stellt, ist über das Python-Modul
bpy
abrufbar. Unterhalb vonbpy
gibt es eine weitere hierarchische Aufteilung, so dass Blender-Kommandos in Python folgende Struktur haben:bpy.abc.def.[...].command()
Das Kommando
bpy.ops.transform.translate()
verwendet aus der Gesamtheit aller Blender-Python-Funktionalität (bpy
) die Untergruppe der Operatoren (ops
), dort wird dann aus der Untergruppe der Transformations-Operatoren (transform
) die Methodetranslate
aufgerufen. -
Funktionen (Methoden), die Parameter entgegen nehmen, verwenden meist named Paramter. Im Beispiel oben muss daher der Verschiebungsvektor, der an die Methode
translate
übergeben wird, mitvalue=...
explizit benannt werden. Bislang haben wir bei Python-Methoden die aus anderen Programmiersprachen bekannten positional Parameter kennen gelernt, bei denen die Position in der Parameterliste eindeutig bestimmt, welcher Parameter gemeint ist. -
Vektoren werden in einer 3D-Anwendung an allen möglichen Stellen verwendet. So auch in Blender, z.B. für die Angaben von Verschiebungen, Positionen, Normalen, Euler-Winkel, Textur-Koordinaten usw.. Diese können in Blender Python als Tupel (Siehe Lektion 2 - Datentypen) angegeben werden.
Wie in anderen Programmiersprachen auch, lassen sich in Python Bibliotheken anlegen, die abrufbare Funktionalität in vordefinierten Klassen und Methoden (Funktionen) bereit halten. Diese heißen in Python Module. Um in Python-Skripten für Blender auf die von Blender vorgehaltene Funktionalität zugreifen zu können, steht in Blender-Python-Skripten das Modul bpy
(Abk. f. Blender Python) zur Verfügung.
In Blender-Skripten muss dieses Modul wie jedes andere Modul auch zunächst mit einer import
-Anweisung eingebunden werden:
import bpy
# Rest des Skripts...
Wird die in Blender eingebaute interaktive Python-Konsole verwendet, ist dies automatisch schon geschehen, d.h. es kann direkt auf alles, was bpy
bietet, zugegriffen werden.
Das Modul bpy
bietet die gesamte skript-bare Blender-Funktionalität in acht "Unterebenen" an.
- Gebt auf der Blender-Python-Console nur
bpy.
ein und drückt dannStrg
-Leertaste
, bzw. den Button "Autocomplete"- → Es werden die acht möglichen "Unterebenen" angezeigt.
Von diesen acht Gruppen unterhalb von bpy
sollen hier die folgenden drei näher betrachtet werden:
bpy.ops
bpy.context
bpy.data
Da man sich unmöglich alle Ebenen und Unterebenen der unterhalb con bpy
aufgespannten Hierarchie merken kann, bietet Blender an zwei Stellen Unterstützung für Skript-Autoren an:
-
Der Arbeitsbereich des Info-Editors (Hauptmenüzeile) listet in Python-Klartext ein Protokoll sämtlicher Benutzer-Aktionen auf. Um diesen zu sehen, muss der untere Rand des normalerweise nur aus der Hauptmenü-Titelzeile bestehenden Info-Editors nach unten gezogen werden. Die hier gelisteten Python-Befehle können auch direkt zeilenweise selektiert werden und dann per Copy-and-Paste in die interaktive
-
Die Tool-Tips, die beim Verweilen mit der Maus über UI-Elementen erscheinen, zeigen an, wie man per Skript auf das jeweilige UI-Element zugreifen kann. Das funktioniert auch in Abhängigkeit davon, was in der Szene gerade selektiert ist.
Klassen und Methoden unterhalb von bpy.context
erlauben den Zugriff auf die aktuelle Auswahl wie z.B. Objekte, Faces, Kanten u. Vertices
bpy.data
ermöglicht den Zugriff auf die interne Datenstruktur der gerade in Blender geöffneten Datei. Letztendlich wird hier das ".blend"-Datenformat abgebildet. Auf alles, was in einer .blend-Datei enthalten ist, kann mit bpy.data
Zugegriffen werden. Einen Überblick darüber, was das ist, liefert der Outliner-Editor, wenn man ihn von "All Scenes" auf "Blender File" oder "All Data Blocks" umstellt. Python-Kommandos aus den Tool-Tips, die über Benutzerschnitsstellenelemente von Blender Zugriff auf Daten der Szene ermöglichen, sind meistens über bpy.data
.
bpy.ops
steht für "Operatoren". Hierunter verbergen sich die Kommandos, die über Tastenkombinationen oder Menüeinträge eingegeben werden können. Die Kommandos, die im Arbeitsbereich des Info-Editors angezeigt werden, stammen meistens aus bpy.ops
.
Implemeniert ein Skript zum unten beschriebenen "Matrix Extrude":
Insbesondere beim Box Modelling kommt folgende Abfolge von Bearbeitungsschritten auf einer Fläche häufig vor
- Fläche wird in Richtung der Flächennormalen um eine Länge extrudiert.
- Die extrudierte Fläche wird skaliert (z.B. verkleinert).
- Die extrudierte Fläche wird rotiert.
Durch mehrfaches Wiederholen der o.g. Schritte lassen sich sehr gut "Auswüchse" aus einem bestehenden Box-Modell erzeugen, wie z.B. Arme, Beine, Tentakel u.ä.
Schreibt ein Skript, das die aktuell selektierten Flächen eines Mesh um einen bestimmten Betrag entlang der Normalen extrudiert, die Flächen um einen bestimmten Betrag skaliert und rotiert. Packt diese drei Anweisungen in eine Schleife, die eine definierte Anzahl von durchläufen wiederholt wird.
Tipp: Führt oben genannten Arbeitsschritte von Hand aus und schaut im Arbeitsbereich des Info-Editors, welche Python-Befehle sich dahinter verbergen. Die im Info-Editor angezeigten Befehele enthalten immer den vollen Parametersatz. Davon können viele Einstellungen weggelassen werden, wenn sie sowieso die voreingestellten Standardwerte sind. Dünnt die Aufrufe in Eurem Code aus.
Packt die vom Benutzer zu verändernden Werte wie Rotationswinkel/Achse, Skalierungsfaktor, Extrusions-Strecke und Anzahl der Wiederholungen in Variablen, die zentral am Anfang des Skriptes stehen und dort bequem geändert werden können.
-
Arbeitet das einleitende Kapitel der offiziellen Blender-Python-Dokumentation durch.
- Was ist das besondere an den
bpy
-Collections? - Wie wird ein neues Mesh erzeugt?
- Wie setze ich das aktuell selektierte Objekt in Python?
- Was ist das besondere an den
-
Sucht im Internet sinnvolle Python-Code-Schnipsel für die Verwendung der drei oben genannten "Untermodule"
bpy.context
,bpy.data
,bpy.ops
. -
Probiert die Code-Schnipsel selbst aus.
-
Variiert den Code und schaut was sich ändert
-
Lest die Referenz-Doku u. ggf. andere Quellen zu den verwendeten Befehlen nach.
-
Gibt es im jweiligen Untermodul ähnliche Befehle? Welche Funktion haben diese