blender animation nodes
Mit den Animation Nodes lässt sich die Funktion anderer Addons in Blender nachbauen und in bestehende Setups integrieren. Dieses Beispiel wurde ursprünglich mit ARewO erstellt.
Featured

Blender Animation Nodes Reloaded- Artikel in Digital Production 1702

Das Add-on „Animation Nodes“ hat sich in der Motion Graphics-Fraktion inzwischen so weit etabliert, dass es aufgrund der hohen Nachfrage von Renderfarmen unterstützt wird. Währenddessen schreiten die Arbeiten an Version 2.0 voran, die neben deutlich besserer Performance auch neue, weniger technische Workflows bieten wird. Grund genug also für BlenderDiplom, mal wieder einen Blick darauf zu werfen, den Workshop aus Ausgabe 1604 fortzuführen und einen Ausblick auf die Zukunft der Animation Nodes zu werfen.

Die Animation Nodes in Blender erfüllen zuallererst den Zweck, Animationen prozedural zu erzeugen. Eher nebenbei sind Hilfsmittel für prozedurale Modellierung vorhanden. Eine große Anzahl der Nodes ist dafür gedacht, Attribute und Einstellungen in Blender auszulesen und zu schreiben. Damit sind die Animation Nodes auch ein mächtiger Ersatz für Driver. Zu guter Letzt fügen die Animation Nodes neue Funktionen hinzu und vereinfachen manche Aufgaben in Blender ganz extrem.

Einen Einblick darin haben wir bereits im Workshop in Ausgabe DP 04:2016 gegeben, wo die Text-Werkzeuge der Animation Nodes vorgestellt wurden. Mit deren Hilfe wurde die individuelle Animation von Buchstaben ein Kinderspiel.

blender animation nodes

blender animation nodes

blender animation nodes
Mit den Animation Nodes können Attribute global kontrolliert werden. In diesem Beispiel werden Shape Keys, Materialien und die Bewegung der Augen synchron animiert, zusätzlich bewegen sich die Augen dank Wiggle noch ein wenig auf und ab. Die Beleuchtung könnte aber mit wenigen Klicks ebenfalls integriert werden. Änderungen an der Animation werden so zum Kinderspiel. Ein Tutorial dazu finden Sie hier auf BlenderDiplom.

Clones

In dieser Ausgabe wollen wir ein weiteres Basiswerkzeug für Motion Graphics mittels Animation Nodes implementieren: Ein System zum Klonen von Objekten. Gegenüber dem Array Modifier in Blender wird das Ergebnis einige Vorteile bieten. Die kopierten Objekte werden Instanzen des Ursprungsobjekts bilden. Dadurch können diese effizient mit Cycles gerendert werden und verbrauchen fast keinen Speicher. Die Eigenschaften der Instanzen können zudem mit einer Art Delta bearbeitet werden, wie z.B. ein zufälliger Offset oder eine andere Farbe.

Da Animation Nodes sehr flexibel sind, kann der fertige Aufbau auch mit dem Setup zur individuellen Animation von Buchstaben aus der DP 04:2016 kombiniert werden.

Coin Stack

Als konkretes Beispiel für die Anwendung eines Array Modifiers mit Offset ziehen wir einen Stapel Münzen heran, der anhand eines Eingabewertes wachsen und schrumpfen kann. Konkret arbeiten wir mit Version 1.6 der Animation Nodes, die direkt von GitHub.com bezogen werden kann.

Wir starten mit einem Zylinder, den wir im Edit Mode auf 5% seiner Z-Höhe skaliert haben (S Z 0,05) und einem frischen Animation Nodes Tree. Auto Execution lassen wir eingeschaltet, das Häkchen bei „Always“ entfernen wir aber, damit die Animation Nodes nicht die komplette Zeit über einen CPU-Kern zu 100% auslasten. Stattdessen setzen wir Häkchen bei den drei übrigen Triggern, damit wir ein Update sehen, sobald wir etwas verändern.

Um das Klonen von Objekten kümmert sich der Node „Object Instancer“. Fügen Sie diesen hinzu (Object → Instancer) und wählen Sie den Zylinder bzw. die Münze im Objekt-Dropdown aus. Jetzt können Sie mittels „Instances“ eine beliebige Anzahl an Duplikaten erzeugen, diese sind aber alle am gleichen Ort wie das ursprüngliche Objekt. Sie können diesen Sachverhalt überprüfen, indem Sie im Viewport mehrfach versuchen, die Zylinder anzuwählen. Sie werden feststellen, dass sich jetzt mehrere Objekte an der gleichen Stelle befinden. Diese tragen Namen wie „instance_gbfos_0“. Sie können die Instanzen auch verschieben. Sie sehen dann auch die Parent-Linie von den Instanzen zu einem unsichtbaren Container-Objekt, welches das Elternteil aller von den Animation Nodes erzeugten Objekte ist und die Bezeichnung „Animation Nodes Object Container“ trägt. Dadurch bleibt nicht nur der Outliner aufgeräumt, Sie können damit auch, wenn nötig, die gesamte Szene von den durch die Animation Nodes erzeugten Objekten reinigen.

Manuelles Verschieben ist aber nicht das, wofür die Animation Nodes entwickelt wurden. Um die erzeugten Münzen platzieren zu können, benötigen wir eine Schleife bzw. einen Loop, der über die Liste der Objekte iteriert. Dass die Ausgabe des Object Instancer-Nodes eine Liste ist, erkennt man daran, dass der Ausgabe-Socket ein wenig durchsichtig ist, was für alle Listen in den Animation Nodes gilt.

Iterator

Einen Iterator über eine Liste erzeugt man in den Animation Nodes in zwei Schritten. Zuerst erstellt man ein sogenanntes „Subprogram“ und wählt dort „Loop“ aus. Dann erzeugt man einen Node, mit dem die so erzeugte Funktion aufgerufen werden kann.

Fügen Sie ein Loop-Subprogram hinzu (Subprograms → Loop). Dem neu erzeugten Node kann man ganz unten einen Namen geben, z.B. „Placer“. Das sollten Sie auch gleich machen, damit Sie später anhand des Namens die Funktion aufrufen können.

Um die Position der Instanzen zu verändern, wird ein „Object Transforms Output“-Node benötigt (Object → Transforms Output). Fügen Sie diesen hinzu und verbinden Sie den Eingang bei „Object“ mit dem Ausgang „New Iterator“ des „Loop Input“-Nodes. Der „Object Transforms Output“-Node hat seine Farbe geändert zu der Farbe, die auch der „Loop Input“-Node hat. Durch die automatische Farbkodierung können Sie leicht erkennen, welche Nodes zu welchen Funktionen bzw. Unterprogrammen gehören.

Noch ist aber nichts im 3D-View passiert. Das hat zwei Gründe. Zum einen wird das erzeugte Unterprogramm noch nicht aufgerufen, zum anderen ändert der „Object Transforms Output“-Node noch nichts.

Um das Unterprogramm aufzurufen fügen Sie einen „Invoke Subprogram“-Node hinzu (Subprograms → Invoke Subprogram). Sie können das Unterprogramm entweder direkt in der Liste auswählen oder zunächst eine allgemeine „Invoke Subprogram“-Node hinzufügen und dann die Funktion in dem Node mittels „Choose“ auswählen. Wählen Sie in beiden Fällen die eben erzeugte Schleife.

Der „Invoke Subprogram“-Node hat jetzt einen neuen Eingang erhalten und die gleiche Farbe wie die Nodes, die die Schleife definieren. Verbinden Sie den Ausgang des „Object Instancer“-Nodes mit dem Eingang. Jetzt iteriert die Schleife über die instanziierten Objekte, ohne diese zu verändern.

Um die Position der Klone zu modifizieren, muss zunächst bei dem „Object Transforms Output“-Node eingeschaltet werden, dass dieser die Position verändert. Wählen Sie die drei Häkchen bei „Location“ an und ein neuer Eingangs-Socket erscheint. Es handelt sich dabei um einen Vektor, der die gewünschte Position der Klone annimmt.

Jetzt bleibt noch die Frage, woher diese Position genommen werden soll? Der „Index“-Ausgang des „Loop Input“-Nodes bietet sich dafür an, denn er gibt für jedes Objekt eine andere Zahl aus (0 für das erste, 1 für das zweite usw.).

Verbinden Sie „Index“ mit „Location“. Es wird automatisch ein Node zwischengeschaltet, da der Index ein Integer ist, die Location hingegen ein Vektor. Der zwischengeschaltete Node „Combine Vector“ erzeugt einen Vektor aus den drei Eingaben. Sie sehen jetzt bereits, dass sich die Münzen entlang der X-Achse verteilen, denn der Index wird automatisch mit dem obersten Socket, sprich dem Wert für die X-Achse, verbunden. Verbinden Sie den Index stattdessen mit dem Eingang für die Z-Achse, damit sich die Münzen nach oben stapeln.

Noch finden sich große Lücken zwischen den Münzen. Für einen richtigen Stapel muss der Abstand verkleinert werden. Das erreichen Sie mit einem Mathematik-Node (Number → Math). Setzen Sie diesen zwischen „Index“ und „Combine Vector“. Er ist bereits auf „Multiply“ eingestellt. Wenn Sie die untere Zahl ändern, verändert sich der Abstand entsprechend. Setzen Sie den Abstand z.B. auf 0,11, damit die Münzen fast aufeinander aufliegen.

Sie haben jetzt einen Stapel Münzen, dessen Höhe Sie über die „Instances“ des „Object Instancer“-Nodes beeinflussen können. Was jetzt noch fehlt, ist eine Option, mit der die Münzen leicht versetzt gestapelt werden können. Diese Erweiterung lässt sich mit wenig Aufwand realisieren.

blender animation nodes
Der Münzstapel kann bereits nach Oben wachsen, es fehlt aber noch der zufällige Offset. Links oben im Bild die empfohlenen Einstellungen für Auto Execution, rechts oben ist der Animation Nodes Object Container im Outliner selektiert und ausgeklappt, so dass man seine Kind-Objekte sieht.

Offset

Der Offset soll zufällig in X- und Y-Richtung gehen, dafür eignet sich ein randomisierter Vektor, denn der besteht quasi aus drei zufälligen Zahlen von denen wir zwei brauchen. Fügen Sie einen „Random Vector“-Node hinzu (Vector → Randomize) und verbinden Sie den Eingang von „Seed“ mit dem „Index“ des „Loop Input“-Nodes. Jetzt erhält jede Münze einen eigenen, zufälligen Vektor mit maximaler Länge wie unter „Scale“ angegeben. Dank der automatischen Konvertierung bei Animation Nodes können Sie den „Vector“-Ausgang direkt mit dem „X“-Eingang des „Combine Vector“-Nodes verbinden. Wie durch Zauberhand erscheint ein neuer Node dazwischen: „Separate Vector“. Noch sind lediglich die beiden X-Komponenten verbunden, verbinden Sie zudem noch die Y-Komponenten, so verschieben sich die Münzen zufällig auf dem Stapel, allerdings noch viel zu extrem. Reduzieren Sie die „Scale“ des „Random Vector“-Nodes, z.B. auf 0,10, damit die Münzen lediglich ein klein wenig verschoben sind.

blender animation nodes
Mit einer kleinen Erweiterung sind die Münzen zufällig auf der X- und Y-Achse verschoben.

Rotation

Die Rotation der Münzen kann ebenfalls zufällig variieren. Das sollte aber nur entlang der Z-Achse geschehen. Setzen Sie in dem „Object Transforms Output“-Node daher bei Rotation nur das dritte Häkchen. Wenn Sie den Node ein wenig breiter ziehen, werden sie feststellen, dass neben den Boxen jeweils die Achse angegeben ist, in diesem Fall die Z-Achse. Es erscheint ein neuer Eingang mit drei Werten. Da Sie aber nur das Häkchen bei Z gesetzt haben, wird nur der dritte Kanal einen Einfluss haben.

Der Eingangs-Socket ist dunkelblau. Das bedeutet, dass er eine Rotation erwartet. Im Nodes-Menü finden Sie unter „Rotation“ den Eintrag „Random Euler“. Fügen Sie diesen hinzu und verbinden Sie „Seed“ wieder mit dem „Index“-Ausgang des „Loop Input“-Nodes. Da Sie die Rotation in dem „Objects Transforms Output“-Node auf die Z-Achse beschränkt haben, können Sie den „Euler“-Ausgang direkt mit dem „Rotation“-Eingang verbinden. Jetzt werden alle Münzen zufällig entlang der Z-Achse rotiert. Der Wert „Scale“ der „Random Euler“-Node nimmt Radianten als Eingabe. Wenn Sie dort „2*pi“ eingeben, erhalten Sie die Entsprechung für eine maximale Rotation von 360 Grad in Radianten, denn das Eingabefeld funktioniert wie ein Taschenrechner. Das ist praktisch bei allen Eingabefeldern für Zahlen in Blender der Fall.

blender animation nodes
Auch die Rotation entlang der Z-Achse lässt sich randomisieren.

Ausblick

Die nächste Version der Animation Nodes (Version 2.0) wird zwei große Neuerungen bereitstellen. Zum einen wird sie nicht mehr ausschließlich in Python, sondern an Performance-kritischen Stellen auch in Cython implementiert sein. Das bedeutet, dass man sich nicht mehr einfach nur das Add-on herunterladen und installieren kann. In Zukunft wird man auf das Betriebssystem achten müssen. Sprich, es wird eine Version der Animation Nodes für Windows, eine für Linux und eine für Mac OS geben. Im Gegenzug wird man mit einem deutlichen Zuwachs an Performance belohnt.

Weiterhin wird ein Feature Einzug halten, das bei einigen Aufgaben die Anzahl der benötigten Loops reduzieren und damit die Arbeit erleichtern wird: Falloffs. Manche Nodes werden eine Art Einflussbereich erhalten, der z.B. über Empties kontrolliert werden kann. Das erleichtert die Erstellung gängiger Motion Graphics wie einfliegende Buchstaben oder die Bewegung einer großen Anzahl von Objekten relativ zu einem Controller-Element. Preview-Builds finden sich auf Graphicall.org als Animation Nodes Version 1.7.

blender animation nodes falloff
In diesem Beispiel kontrolliert ein Empty die Skalierung und Rotation hunderter Einzelteile, die per Cell Fracture aus einem Objekt erstellt wurden. Damit kann eine Animation erstellt werden, wie sich ein Objekt aus zahllosen Scherben wieder zusammensetzt (oder umgekehrt). Dabei wird keine einzige Schleife benötigt, da die Nodes für Zufallswerte jetzt auch Listen ausgeben können (der Node für zufällige Rotationen leider noch nicht, weshalb in diesem Beispiel ein Vektor-Node mit dazugeschaltetem Konverter eingesetzt wird). Die neu hinzugekommenen Offset-Nodes iterieren automatisch über die Listen anhand eines Falloffs, der sehr frei definiert werden kann. Hier erfolgt das über ein Objekt, das das Zentrum des Falloffs angibt. Wie genau er abfällt, wird über eine Interpolationskurve beschrieben. Vielen Dank an Jacques Lucke, den Entwickler der Animation Nodes, für das Beispiel.

blender animation nodes
Ein weiteres Feature der Animation Nodes, dass es zu evaluieren lohnt: Die Inhalte von Textdateien oder Text-Blöcken in Blender können eingelesen werden. Die Möglichkeiten zum Parsen sind allerdings noch sehr low-level. Man kann sich aber z.B. einen eigenen CSV-Reader zusammenklicken. Das von Kmeirlaen und Rohan Dalvi inspirierte Beispiel nutzt ein reguläres Säulendiagramm, eine Erweiterung des Münzenstapels ist aber ebenfalls denkbar.

Fazit

Einen Array Modifier mit Offset – das wünschen sich viele für Blender. Mit den Animation Nodes wird dieser Wunsch Wirklichkeit und lässt sich noch um zusätzliche Features erweitern. Der Artikel zeigt aber mal wieder nur einen winzigen Teil der Mächtigkeit des Add-ons auf. Die Spitze der Spitze des Eisbergs sozusagen.

Dieser Artikel erschien im Magazin Digital Production, Ausgabe 1702. Herunterladen können Sie ihn hier als PDF.