Animation-Tags und XPresso: Die Cinema 4D-Tags – XPresso – Teil 09

Die XPresso-Nodes > Skript

In dieser Gruppe finden Sie nur zwei Nodes, nämlich für die C.O.F.F.E.E.- und die Python-Programmierschnittstelle von Cinema 4D. Die Vorteile dieser Nodes liegen darin, dass Sie selbst deren Funktion bestimmen können. Von simplen mathematischen Berechnungen bis hin zur Nutzung von Cinema 4D-Routinen ist fast alles möglich. Ich kann im Rahmen dieses Buchs jedoch nicht tiefer in die Beschreibung beider Programmiersprachen eingehen, denn das würde schlicht den Rahmen sprengen. Wenn Sie Interesse an der Programmierung haben, sollten Sie die Webseite www.plugincafe.com besuchen. Dort finden Sie die sogenannten SDKs aller unterstützter Programmiersprachen, also die Beschreibung aller verfügbaren Befehle. Die SDKs enthalten zudem auch Beispiele. Der Vorteil bei diesen beiden Programmiersprachen ist, dass kein spezielles Programm für die Ausführung oder Compilierung benötigt wird. Die Befehle lasen sich direkt in Cinema 4D eingeben.

Sie finden übrigens noch andere Stellen in Cinema 4D, wo derartige Skripte zum Einsatz kommen können. So lassen sich z. B. direkt Skript-Tags im Objekt-Manager anlegen. Sie finden diese nach einem Rechtsklick auf den Namen eines Objekts im Objekt-Manager unter Skript Tags. Alternativ hierzu kann natürlich auch das Tags-Menü des Objekt-Managers bemüht werden. Diese Tags werden wie auch die XPresso-Schaltung dann bei jeder Aktualisierung der Editoransicht oder des jeweiligen Objekts neu ausgeführt und eignen sich damit für Aufgaben, die permanent ausgeführt werden sollen. Eine andere Option bieten die Skripte, die über das Menü Skript > Skript-Manager angelegt werden können. Auch dort können Sie sich zwischen der MAXON eigenen Programmiersprache C.O.F.F.E.E. und dem offenen Standard Python entscheiden. Der Syntax ist jeweils grundverschieden und auch die verfügbaren Befehle unterscheiden sich stark. Hier angelegte Skripte lassen sich gezielt über Tastendruck auslösen, also wie ein Befehl benutzen. Die Ausführung erfolgt dann also nicht länger zyklisch und automatisch, wie bei den Tags oder den Skript-Nodes.

Die XPresso-Nodes > Logik

Die Nodes dieser Gruppe helfen uns dabei, Ordnung in komplexere Unterscheidungsprozesse zu bringen. Wenn Sie bereits etwas über Programmierung wissen, dann können Sie vielleicht auch etwas mit if-, else- und case-Befehlen anfangen. Ähnlich funktionieren einiger dieser Nodes. Es geht also um das Abfragen von Zuständen oder Werten und dann auf eine passende Reaktion darauf, wie z. B. bei der Umschreibung „wenn Aktion A passiert, dann muss die Aktion B folgen“.

Gleich-Node

Der Gleich-Node vergleicht beide Eingänge miteinander. Sind die Werte identisch, liefert der Node ein TRUE-Signal, bzw. 1 und kommt somit zu einem positiven Ergebnis. Sind die Eingänge ungleich, wird FALSE oder 0 ausgegeben. Wer diese Berechnung umkehren möchte, aktiviert einfach die Nicht gleich-Option des Nodes im Attribute-Manager. Nur bei ungleichen Werten wird dann TRUE und bei gleichen Werten ein FALSE-Ergebnis berechnet. Es lassen sich in jedem Fall auch mehr als nur zwei Eingänge miteinander vergleichen. Dazu fügen Sie über die blaue Schaltfläche am Node einfach weitere Ports auf der Eingangsseite hinzu.

Die Datentyp–Einstellung kennen Sie bereits von anderen Nodes. In der Regel werden Sie diesen passend zum Datentyp der Eingangswerte einstellen, damit diese nicht umgerechnet werden. Aber auch die gezielte Umrechnung, z. B. von Vektoren zu Real-Werten kann Sinn machen, um dann z. B. die Länge von Vektoren miteinander vergleichen zu können.

Mathematisch gesehen ist die Gleich-Abfrage jedoch oft etwas fragil, denn sobald sich ein Wert z. B. durch eine Rechenungenauigkeit oder Rundung an seiner sechsten Nachkommastelle leicht von einem anderen unterscheidet, ist die Gleichheit ja schon nicht mehr gegeben. In der Programmierung nutzt man daher öfter Deltas, Schwellwerte oder Thresholds, also praktisch einen Sicherheitsabstand um die Werte herum. Sie könnten dies so lösen, dass Sie den kleineren der beiden Werte von dem größeren abziehen und dann anhand der verbleibenden Differenz entscheiden, ob eine Gleichheit anzunehmen ist oder eben nicht. Auch für eine solche Überprüfung kommen Logik-Nodes, wie z. B. der gleich noch beschriebene Vergleich-Node zum Einsatz.

Ist Null-Node

Eine noch weiter eingeschränkte Variante des oben erläuterten Gleich-Node ist der Ist Null-Node. Ähnlich wie dieser liefert Ist Null nur Boole-Signale am Ausgang, nämlich TRUE, wenn die Werte am Eingang Null sind. In allen anderen Fällen liegt am Ausgang FALSE an. Falls Sie auf diese Weise mehr als nur einen Wert überprüfen möchten, lassen sich weitere Eingänge über die blaue Schaltfläche am Node aufrufen. Wie üblich haben Sie es über den Datentyp des Nodes, den Sie im Attribute-Manager einstellen können selbst in der Hand, welches Datenformat an den Eingängen erwartet wird. Beim Datentyp Farbe würde der Node z. B. TRUE liefern, wenn die RGB-Werte von schwarz, also 0, 0, 0 hineingeleitet würden. Bei einer Matrix müssten dafür alle Vektoren 0, 0, 0 sein. Beim Boole-Format wäre FALSE am Eingang nötigt um am Ausgang TRUE zu erhalten. Ich denke, das Prinzip wird damit hinreichend gut erklärt.

Reihenfolge-Node

Mithilfe dieses Nodes können Sie herausfinden, welcher der beiden Eingänge den größeren Wert liefert. Liegt am Eingang 1 eine höhere Zahl als an Eingang 2 an, wird 1 ausgegeben. Ist Eingang 2 größer als Eingang 1 resultiert der Wert -1 am Ausgang. Sind beide Eingänge identisch, wird 0 ausgegeben. Dabei gibt es jedoch einen Haken, denn der Node wandelt z. B. alle Vektor-Eingänge intern in Real-Zahlen um, selbst wenn der Datentyp im Attribute-Manager auf Farbe, Vektor oder Normale eingestellt wurde. Es werden also immer nur die Beträge der eingeleiteten Werte miteinander verglichen!

Dies führt dann z. B. dazu, dass eingeleitete Normalen stets nur 0 als Ergebnis liefern, weil diese nun einmal alle gleich lang sind. Dieser Node taugt daher, zumindest bei der Benutzung mit Vektoren, nur zum Vergleich der Vektorlängen und bei der Benutzung mit Farben nur zum Vergleich der Farbhelligkeiten. Bei den Datentypen Textur und String erfolgt der Vergleich basierend auf der Reihenfolge der Buchstaben im Alphabet. Die Zeichenfolge Abc läge dort z. B. vor Abd, wäre also mathematisch betrachtet kleiner. Die Datentypen Integer, Real und Zeit funktionieren hingegen wie gewohnt.

Animation in Cinema 4D - Der Vergleich-Node

Abbildung 2.106: Der Vergleich-Node

Vergleich-Node

Auch dieser Node vergleicht die eingeleiteten Werte miteinander, bietet jedoch weit mehr Optionen also der zuvor besprochene Reihenfolge-Node. Wie in Abbildung 2.106 zu erkennen, können Sie über ein Funktion-Menü unter zahlreichen logischen Beziehungen zwischen Werten auswählen. Sie finden dort so gängige Vergleiche, wie > (größer) oder <= (kleiner oder gleich). Das Symbol == steht für „identisch gleich“. Der Node überprüft dabei also, ob die Eingänge gleich groß sind. Mit != ist die Funktion „ist ungleich“ gemeint, also die Umkehrung der == Funktion. Unabhängig von der gewählten Funktion liefert der Node ein einfaches Boole-Ergebnis, also TRUE, wenn die Funktion zutrifft und FALSE, wenn der Vergleich nicht zutrifft. Bei der Frage, ob fünf größer als vier ist, also dem Einleiten von 5 am oberen und 4 am unteren Eingang des Nodes und der Funktionsauswahl > (größer), käme somit ein TRUE-Signal heraus. Wie bereits beim Reihenfolge-Node zuvor, gibt es aber auch bei diesem Node wieder etwas beim Umgang mit Vektoren zu beachten.

Der Vergleich-Node wandelt Vektoren nicht in Beträge bzw. Real-Werte um, sofern Vektor, Normale oder Farbe als Datentyp im Attribute-Manager ausgewählt wurden. Dies belegt auch noch einmal die Beispielschaltung in Abbildung 2.106. Sie sehen dort die beiden Vektoren 10, 11, 12 und 9.99, 11, 12.01 im Vergleich, wobei als Funktion < (kleiner) gewählt wurde. Obwohl der erstgenannte Vektor tatsächlich etwas kürzer ist, kommt der Node zu einem negativen Ergebnis. Die Einzelwerte der Vektoren werden von vorn nach hinten gelesen miteinander verglichen. Sofern bei der Funktion < auch nur eine der Vektorkomponenten größer oder gleich nur einem Bestandteil des anderen Vektors ist, liefert der Node FALSE als Ergebnis. Dies ist in diesem Beispiel gleich beim X-Anteil des Vektors der Fall, denn 10 ist eindeutig nicht kleiner als 9.99. Grundsätzlich ist dieser Node sehr gut für Fallunterscheidungen in Ihrer Schaltung geeignet. Sie können darüber sehr gut z. B. Positionen oder Winkel miteinander vergleichen und dann entsprechend auf das Ergebnis dieses Vergleichs reagieren. Auf eine Programmiersprache übersetzt käme wohl der if-Befehl diesem Node am nächsten. Um noch komplexere Vergleiche anstellen zu können, lassen sich die Ergebnisse mehrerer Vergleich-Nodes z. B. über Boole-Nodes auswerten.

Überprüfungen, wie z. B. „wenn X größer als A ist und gleichzeitig kleiner als B “ sind dann recht einfach zu realisieren. Sie finden dazu ein Beispiel bei der Beschreibung des Boole-Nodes. Verteiler-Node Diesen Node könnte man mit einer case-Anweisung oder mit verschachtelten if/else-Befehlen in der Programmierung vergleichen. Je nach Wert am Schalter-Eingang wird der dazu passende Eingang zum Ausgang des Nodes durchgeleitet. Dabei beginnt die Zählweise bereits bei 0 für den ersten Eingang. Zusätzliche Eingang-Ports lassen sich über die blaue Schaltfläche am Node aufrufen. Beachten Sie, dass der Schalter-Eingang des Nodes eine automatische Modulo-Berechnung durchführt. Sobald Sie also Werte für Schalter benutzen, die größer sind als die Anzahl der Eingänge am Node minus 1, beginnt der Node wieder mit der Ausgabe der ersten Eingänge. Ein Beispiel macht dies sicherlich deutlicher. In Abbildung 2.107 erkennen Sie einen Verteiler, dem ein zusätzlicher Eingang zugewiesen wurde.

Animation in Cinema 4D - Der Verteiler Node

Abbildung 2.107: Der Verteiler Node

Die drei Eingänge wurden dann mit den Zahlen eins bis drei gefüttert. Der Schalter-Wert Null leitet somit den ersten Eingang, der Wert 1 den zweiten Eingang und der Schalter-Wert 2 den dritten Eingang zum Ausgang weiter. Ab dem Schalter-Wert drei beginnt dieser Zyklus wieder von vorn. Wie in der Abbildung zu sehen, wird bei dieser Eingabe also wieder der erste Eingang zum Ausgang durchgeleitet. Negative Schalter-Werte sind übrigens davon ausgenommen. Diese führen durchweg zur Ausgabe des Werts, der am ersten Eingang anliegt. Lassen Sie sich zudem nicht von den Zahlenwerten verunsichern, die im Attribute-Manager hinter den Eingängen angezeigt werden. Diese Nummerierung weicht von der Zählweise ab, die durch den Schalter verwendet wird. Schließlich steht Ihnen natürlich auch noch ein Datentyp-Menü über den Attribute-Manager zur Verfügung, das diesmal sowohl die Eingänge als auch den Ausgang betrifft. Um mögliche Umrechnungen zu vermeiden, sollten Sie hier immer den zu den eingeleiteten Werten passenden Datentyp auswählen. Die XPresso-Nodes > Iterator

Unter einer Iteration versteht man eine Wiederholung. Hierüber lassen sich also z. B. Rechenschritte mehrfach wiederholen oder Listen abarbeiten. In der Programmierung spricht man dabei von Schleifen, die z. B. über for- oder while-Befehle realisiert werden können.

Dies sind für uns sehr praktische Nodes, denn mit ihrer Hilfe lassen sich große Datenmengen, wie z. B. alle Punkte eines Objekts oder eine vorgegebene Liste von Objekten in einem Arbeitsschritt beeinflussen.

Hierarchie-Node

An diesem Node finden wir viele Parallelen zum normalen Objekt-Node. Interessant wird es jedoch beim Parameter Iterations-Pfad, denn hiermit können wir z. B. eine Hierarchie automatisch durchlaufen. Aber der Reihe nach. Los geht es mit den Einstellungen im Attribute-Manager mit dem Eintrag Referenz. Damit ist praktisch der Startpunkt gemeint, auf den sich die nachfolgende Iteration bezieht. Der Referenz-Modus entscheidet darüber, wie die Referenz gefunden bzw. definiert wird. Bei Referenz-Modus Absolute Referenz wird exakt das bei Referenz eingetragene Objekt verwendet. Sie ziehen also in der Regel direkt ein Objekt aus dem Objekt-Manager in das Referenz-Feld hinein. Dies bedeutet aber auch, dass z. B. beim Kopieren der Schaltung in eine andere Szene jedes Mal die Referenz manuell ausgetauscht oder zumindest auf ihre Gültigkeit überprüft werden muss.

Animation in Cinema 4D - Einstellungen des Hierarchie-Nodes

Abbildung 2.108: Einstellungen des Hierarchie-Nodes

Wenn Sie die Schaltung flexibler halten wollen und die benutzten Objekte eventuell öfter tauschen möchten, ist die Relative Referenz als Referenz-Modus oft praktischer. Dabei wird das Feld Referenz-Pfad freigeschaltet, über das Sie nun über Buchstabenkürzel zu dem tatsächlich gewünschten Objekt navigieren können. Die Basis für diese Art der Navigation ist immer das Objekt in Ihrer Szene, welches das XPresso-Tag im Objekt-Manager trägt. Der Eintrag bei Referenz verliert in diesem Modus also seine Bedeutung!
Die folgenden Abkürzungen stehen Ihnen dafür als Pfadangabe in beliebiger Kombination und Anzahl zur Verfügung:

  • U für das englische „Up“, verschiebt die Referenz eine Hierarchiestufe höher
  • D für das englische „Down“, verschiebt die Referenz in die nächste Untergruppe
  • N für das englische „Next“, springt zum nächsten Element auf der gleichen Hierarchiestufe
  • P für das englische „Previous“, geht zum vorherigen Element auf der gleichen Hierarchiestufe
  • F für das englische „First“, springt zum ersten Objekt auf der aktuellen Hierarchiestufe
  • L für das englische „Last“, springt zum letzten Objekt auf der aktuellen Hierarchiestufe

Die Pfadangabe DNN findet also das dritte Objekt unter dem Objekt welches das XPresso-Tag trägt. Wem dies zu kompliziert ist, der kann sich auch einer Hilfestellung bedienen, denn der Referenz-Pfad lässt sich auch automatisch ausfüllen, wenn ein Objekt von der gewünschten hierarchischen Position direkt in das Referenz-Feld gezogen wird. Der Referenz-Modus wechselt dann zwar automatisch zurück auf Absolute Referenz, beim Umschalten auf Relative Referenz wird dann aber der passende Referenz-Pfad automatisch eingetragen.

Der dritte Referenz-Modus funktioniert ganz ähnlich. Auch in der Einstellung Startposition benutzen wird das Objekt mit dem XPresso-Tag als Basis für die Suche nach der Referenz benutzt. der Pfad kann jedoch nicht länger manuell angegeben werden. Stattdessen werden verschiedene Standardpfade unter dem Eintrag für Startposition angeboten. In der Regel ist dieser Modus also weniger flexibel, obwohl einige spezielle Startposition-Einstellungen auch sehr nützlich sein können. So kann dort z. B. über Erstes in Projekt bzw. Letztes in Projekt das jeweils oberste oder hierarchisch letzte Objekt aus dem Objekt-Manager ausgelesen werden. Dies sind auch die einzigen Einstellungen, bei denen die Platzierung des XPresso-Tags in der Hierarchie gar keine Rolle spielt. Erstes der Ebene und Letztes der Ebene holt sich das erste bzw. letzte Element auf der gleichen Hierarchieebene des Objekts, welches das XPresso-Tag dieser Schaltung trägt.

Nächstes Objekt bzw. Vorheriges Objekt navigieren zu den entsprechenden Objekten über oder unter dem Eintrag, der die Schaltung im Objekt-Manager trägt. Die gesuchte Referenz muss dabei also auf der gleichen Hierarchiestufe liegen. Hierarchie hoch und Hierarchie runter entsprechen den U und D Pfadangaben und steigen vom XPresso-Tag-Objekt aus eine Hierarchiestufe nach oben oder unten. Schließlich bezieht sich die Startposition Dieses Objekt exakt auf das Objekt, welches das XPresso-Tag trägt. Bei einigen dieser Startpositionen kann es aber natürlich auch dazu kommen, dass gar kein Objekt gefunden wird. Wenn z. B. unter dem Objekt, das das XPresso-Tag trägt keine anderen Objekte gruppiert wurden, wird Hierarchie runter zu keinem Ergebnis kommen können. Immer wenn ein Node aufgrund derartiger Vorgaben seine Aufgabe nicht erfüllen kann, erkennen Sie dies an einer Gelbfärbung seiner Titelzeile. Dieser Effekt ist keinesfalls auf Hierarchie- oder Objekt-Nodes beschränkt, sondern kann z. B. auch bei mathematischen Berechnungen in Schaltungen vorkommen, wenn dafür benötigte Ports nicht mit Werten bestück werden oder ungültige Eingaben gemacht wurden.

Bei einigen Startposition-Einstellungen besteht zusätzlich die Möglichkeit, mehrere Stufen auf einmal zu überspringen. Sie nutzen dafür den Start-Distanz-Wert. Dieser macht jedoch nur mit den Startpositionen Hierarchie runter/Hierarchie hoch bzw. Nächstes Objekt/Vorheriges Objekt Sinn. Diese Erläuterungen werden Ihnen vielleicht bereits bekannt vorkommen. Wir sind im Abschnitt Nodes und Ports bedienen auch anhand einiger Beispiele bereits auf die Referenzierung von Objekten u. a. beim Objekt-Node eingegangen. Das Prinzip war dort exakt das gleiche.

Die Neuerung des Hierarchie-Nodes gegenüber dem Objekt-Node liegen daher ausschließlich bei den Parametern Start-Pfad und Iterations-Pfad, einer zusätzlichen Abfolge von Zeichen also, mit der mehrere Objekte in einer Hierarchie gefunden werden können. Wie der Begriff Iteration schon aussagt, handelt es sich dabei um eine automatische Wiederholung der Suche. Der Iterations-Pfad wird also so oft wiederholt, bis kein Objekt mehr zu finden ist. Die verwendbaren Kürzel für den Iterations-Pfad sind mit denen des Referenz-Pfads identisch. Der Start-Pfad setzt dabei nur den Startpunkt relativ zur gewählten Referenz fest. Sie nutzen diesen also dafür, zum ersten Element der auszugebenden Objektliste zu navigieren. Bleibt der Start-Pfad leer, wird automatisch das unter Referenz gelistete Objekt verwendet. Ein mögliches Beispiel zum besseren Verständnis dieser Zusammenhänge soll Abbildung 2.109 wiedergeben.

Animation in Cinema 4D - Konfiguration des Hierarchie-Nodes

Abbildung 2.109: Konfiguration des Hierarchie-Nodes

Sie erkennen dort im Objekt-Manager eine Hierarchie von Objekten, die unter einem Würfel-Objekt beginnt, das auch das XPresso-Tag trägt. Durch die Wahl von Relative Referenz als Referenz-Modus ist dieser Würfel erst einmal als Träger der Schaltung das ursprüngliche Referenz-Objekt. Durch das Eintragen von DN für den Referenz-Pfad wird die Referenz zuerst eine Hierarchiestufe tiefer (D für Down) und dann dort auf das nachfolgende Objekt verschoben (N für Next). Die Referenz landet somit beim Zylinder-Objekt, das deshalb auch im Feld für Referenz auftaucht. Mit der Vorgabe D für den Start-Pfad landen wir ausgehend von diesem Zylinder eine Hierarchiestufe tiefer bei der obersten Kugel der Zylinder-Gruppe. Dieses Objekt wird also bei jeder Aktualisierung der Schaltung als erstes von dem Hierarchie-Node ausgegeben. Das Kürzel N steht bekanntlich für Next und sorgt als Iterations-Pfad dafür, dass nun nacheinander alle Objekte ausgegeben werden, die auf der gleichen Hierarchiestufe wie die erste Kugel liegen. Der Node wird also jedes Mal alle Objekte zwischen Kugel und Kugel.4 auswerfen. Wenn der Iterations-Pfad kein gültiges Ergebnis mehr liefert, also z. B. das Ende einer Objektgruppe erreicht ist, bricht der Hierarchie-Node automatisch ab. Wenn Sie die Anzahl der ausgegebenen Objekte manuell begrenzen möchten, benutzen Sie den Maximale Iterationen-Wert am Node, den Sie ebenfalls im Attribute-Manager finden können. Werte über Null führen dazu, dass höchstens noch die hier eingestellte Anzahl an Objekten ausgegeben wird. Dies kann hilfreich sein, um z. B. immer nur die ersten 10 Einträge einer Liste wiederzugeben, die mehrere hundert Einträge enthält.

Beachten Sie, dass bei einem Wert von 1 für Maximale Iterationen nur das über den Start-Pfad anvisierte Objekt ausgegeben wird. Die Wirkung des Iterations-Pfads ist in diesem Spezialfall also völlig deaktiviert. Eine weitere Möglichkeit der Selektion von Objekten einer Hierarchie bietet die Ausschließen-Liste, die Sie unterhalb der Eingabemöglichkeit für den Iterations-Pfad finden. Sie können in diesen Bereich Objekte aus dem Objekt-Manager hineinziehen, die dann bei der Wiedergabe durch den Node ausgelassen werden, obwohl Sie durch den Iterations-Pfad gefunden wurden. Der Hierarchie-Node wird dann einfach mit dem nächsten gültigen Eintrag fortfahren. Um bei dem Beispiel der Abbildung 2.109 zu bleiben, würde der Node z. B. nur noch Kugel, Kugel.1, Kugel.2 und Kugel.4 ausgeben, wenn Kugel.3 in die Ausschließen-Liste gezogen würde.

Über ein Boole-Signal am An-Eingang des Nodes lässt sich die Iteration steuern. Sofern dieser Eingang nicht angelegt wurde ist der Node automatisch immer aktiv. Wenn der An-Port aufgerufen wurde, müssen jedoch ein TRUE-Signal bzw. 1 angelegt sein, damit die Objekte ausgegeben werden. Wer zusätzlich einen Überblick über die Gesamtzahl der Objekte erhalten möchte, die über den Start- und den Iterations-Pfad gefunden werden, kann diese Information am Anzahl-Ausgang ablesen. Dieser muss manuell über die rote Schaltfläche des Nodes aufgerufen werden. Bitte beachten Sie, dass diese Anzahl nicht unbedingt der Anzahl der tatsächlich ausgegebenen Objekte entspricht! Wird die Ausschließen-Liste benutzt, werden die dort aufgeführten Objekte nicht von der Gesamtzahl der ausgegeben Objekte abgezogen. Die Maximalen Iterationen hingegen werden richtig interpretiert und führen zu einer Begrenzung des Anzahl-Werts, selbst wenn mehr Objekte durch den Iterations-Pfad gefunden werden könnten.

Iteration-Node

Dieser Node liefert ausschließlich eine Abfolge von Zahlen. Dabei beginnt die Wiedergabe mit dem Wert Iteration Start und endet mit Iteration Ende. Das könnten wir z. B. nutzen, um automatisch immer alle Punkte oder Polygone eines Objekts auszulesen. Das benutzte Datenformat ist dabei immer Integer, es sind also nur ganzzahlige Werte erlaubt. Dass dennoch ein Datentyp-Menü im Attribute-Manager zu finden ist hängt damit zusammen, dass weitere Iterator-Nodes durchgeschleift werden können. Diese Funktion nennt sich Äußerer Iterator. Dabei kann es sich wieder um einen Iterator-Node, aber auch um andere Nodes handeln, die pro Aktualisierung der Schaltung nacheinander mehrere Parameter ausgeben. Der Datentyp beeinflusst also nur den durchgeleiteten Wert des äußeren Iterators. Um diesen vollständig nutzen zu können, müssen die Ports für Äußerer Iterator auf der Eingangs- und Ausgangsseite des Nodes manuell ergänzt werden. Sie klicken dafür auf die blaue oder rote Schaltfläche am Node.

Um ein mögliches Beispiel für die Nutzung derart verschachtelter Iteratoren zu bringen, stellen Sie sich doch einfach eine typische Bitmap vor. Diese besteht aus Pixeln, die in einem regelmäßigen Raster angeordnet sind. Die Position jedes Pixels kann durch einen 2D-Vektor beschrieben werden, nämlich über die X- und die Y-Position jedes Bildpunkts. Ein Iterator könnte dann alle Zeilen der Bitmap durchgehen, also den Y-Wert verändern. Der zweite Iterator wäre für die X-Positionen zuständig. Da sich die X-Positionen der Pixel in jeder Bildzeile wiederholen, könnte der Y-Iterator in diesem Beispiel als Äußerer Iterator genutzt werden. Die folgende Abbildung 2.110 macht den prinzipiellen Aufbau sicher deutlicher.

Animation in Cinema 4D - Übertragung einer Bitmap auf eine Ebene
Abbildung 2.110: Übertragung einer Bitmap auf eine Ebene

Aufgrund der Breite der Schaltung gerät diese Abbildung im Druck leider etwas klein, aber ich hoffe, die folgenden Beschreibungen helfen beim Verständnis. Der Zweck dieser Schaltung soll sein eine Bitmap einzuladen und eine Ebene passend zu den Helligkeitswerten der Bitmap zu verformen. Die Schaltung beginnt auf der linken Seite mit einem Bitmap-Node, über den ein Bild geladen wurde. Die Breite und Höhe des Bilds werden als Ausgänge herausgeführt und in Mathe-Nodes jeweils um eins reduziert. Dies hat damit zu tun, dass die Indexnummer der Punkte bereits bei 0 beginnt. Die um eins reduzierte Höhe der Bitmap wird als Iteration Ende-Wert an einen Iterator-Node geleitet. Dessen Iteration-Ausgang wird als Äußerer Iterator durch einen zweiten Iterator-Node durchgeschleift. An diesem Iterator wird die um eins reduzierte Breite als Iterator Ende benutzt. Beide Iteratoren starten mit dem Wert Null.

Um nun die Farbwerte jedes Pixel aus der Bitmap auslesen zu können, rufen wir erneut einen Bitmap-Node auf und laden dort das gleiche Bild hinein, das auch schon im Bitmap-Node am Anfang der Schaltung benutzt wurde. Der Y-Eingang dieses neuen Nodes wird mit dem durchgeschleiften Port des Äußeren Iterators verbunden, da dieser Wert durch die Höhe der geladenen Bitmap vorgegeben wird. Der Eingang für die X-Koordinate wird mit dem Iteration-Ausgang des zweiten Iterator-Nodes verbunden. Durch Anhängen eines Allgemein-Nodes an den Farbe-Ausgang des zuletzt erzeugten Bitmap-Nodes erhalten wir die Helligkeit des gerade ausgewerteten Pixels an der Bitmap. Im Prinzip könnte auf diesen Node sogar verzichtet werden, da die Umrechnung vom Farbvektor zur Real-Zahl automatisch erfolgt, aber so schadet es auch nicht.

Wir müssen nun nur noch aus den durchlaufenden Iterator-Werten eine fortlaufende Zahl errechnen, mit der wir einen Punkt-Index füttern können. Dies erledigt ein einfacher Formel-Node, den Sie mittig in der Abbildung 2.110 erkennen können. Die Formel dort lautet IterationY*Breite+IterationX, wobei IterationY der Äußere Iterator und Breite die Anzahl der Pixel entlang der Breite der geladenen Bitmap ist. IterationX ist mit dem normalen Iteration-Ausgang des durchreichenden Iterator-Nodes verbunden. Das Ergebnis des Formel-Nodes verbinden Sie mit dem Punkt-Index-Eingang eines neuen Punkt-Nodes. Dessen Objekt-Eingang muss zusätzlich mit dem Objekt-Ausgang eines Objekt-Nodes verbunden sein, der auf unsere Ebene verweist. Dabei sollte die Auflösung der Bitmap der Punktanzahl an der Ebene entsprechen. Bei einer Bitmap mit 100 Pixeln in der Breite und Höhe sollte die Ebene also in X- und Y-Richtung je über 99 Segmente verfügen. Dies entspricht dann ebenfalls der Punktanzahl von 100 mal 100. Der Punkt-Position-Ausgang des Punkt-Nodes wird über eine Kombination aus Vektor zu Reale- und Reale zu Vektor-Nodes zuerst in seine Komponenten aufgespaltet, um dort die Y-Komponente durch den Ausgang des Allgemein-Nodes zu ersetzen, der die Helligkeit der Bildpixel wiedergibt.

Der so korrigierte Positionsvektor muss dann nur noch mittels eines weiteren Punkt-Nodes an die Ebene zurückgeschrieben werden. Dessen Punkt-Index-Eingang wird ebenfalls mit dem Ausgang des Formel-Nodes verknüpft. Soweit zumindest die Theorie, denn leider scheint es einen Fehler im Code des Iterator-Nodes zu geben, der die hier von uns benötigte Durchreichung eines Äußeren Iterators verhindert. Aus diesem Grund sahen Sie auch in Abbildung 2.110 bereits einige Nodes mit gelber Titelzeile, was generell auf Fehler in deren Ausführung hinweist. So schnell möchte ich jedoch nicht aufgeben und baue die Schaltung daher einfach etwas um. Vielleicht ist dieser Fehler ja auch in Ihrer Cinema 4D-Version bereits behoben, sodass das beschriebene Beispiel dort auch direkt fehlerfrei abläuft. Falls jedoch nicht, folgen Sie mir einfach beim Umbau der Schaltung (siehe Abbildung 2.111).

Animation in Cinema 4D - Umgebaute Schaltung

Abbildung 2.111: Umgebaute Schaltung

Wie Sie dort erkennen können, bleiben große Teile der hinteren Schaltung unverändert erhalten. Es geht ja auch nur darum, den fehlerhaften Teil mit den beiden Iteratoren zu ersetzen. Ich gehe dabei so vor, dass ich die Schaltung mit einem Iterator beginne, der alle Zahlen zwischen 0 und 9999 ausgibt. Dies entspricht also exakt 10000 Werten und somit der Punktanzahl meiner Ebene, die aus 99 Segmenten in Breite und Höhe besteht. Ein Mathe-Node mit der Funktion Modulo teilt die vom Iterator ausgeworfene Zahl durch die Höhe der geladenen Bitmap. Mein über den Bitmap-Node geladenes Bild hat eine Auflösung von 100 mal 100 Pixeln und passt daher genau zu der Punktanzahl der konvertierten Ebene. Am Ausgang des Mathe-Nodes erhalten wir durch die Modulo-Berechnung automatisch einen Wert, der als X-Koordinate in einen zweiten Bitmap-Node geleitet werden kann. Ein zweiter Mathe-Node mit der Funktion Dividieren teilt den Iteration-Ausgang durch die Breite der Bitmap.

Ein dort angehängte Allgemein-Node mit Dateityp Integer verkürzt das Ergebnis der Division auf den Vorkomma-Anteil und kann dadurch als Y-Koordinate am zweiten Bitmap-Node genutzt werden, der uns so nacheinander die Farbe aller Pixel ausgibt. Der Rest entspricht der ersten Schaltung. Wie in der Einblendung von Abbildung 2.111 zu erkennen, prägt sich nun tatsächlich das in den Bitmap-Nodes geladene Bild eines Smileys in die Ebene hinein. Die Höhe der Prägung könnte individuell noch durch Multiplikation der Farbwerte beeinflusst werden. Dies ist natürlich nur ein Beispiel dafür, für welche Aufgaben Iteratoren eingesetzt werden könnten.

Material-Node

Bei diesem Node lösen wir uns wieder etwas von den abstrakten Zahlen und werden konkreter. Hier geht es nämlich um das Ausgeben von Materialien, die im Material-Manager vorhanden sind. Über ein umfangreiches Material-Typ-Menü im Attribute-Manager wählen Sie aus, welcher Materialtyp dabei berücksichtigt werden soll. Das Kürzel Mat steht dabei für das normale Cinema 4D Standardmaterial (siehe Abbildung 2.112).

Animation in Cinema 4D - Konfiguration eines Material-Nodes

Abbildung 2.112: Konfiguration eines Material-Nodes

In der Grundeinstellung All können aber auch alle Materialien der Reihe nach ausgegebene werden, egal welchen Typ diese haben. Sollen einzelne Materialien bei der Ausgabe durch den Node ausgelassen werden, ziehen Sie diese einfach aus dem Material-Manager in die Ausschließen-Liste hinein, die Sie ebenfalls im Attribute-Manager finden können.

Um die Ausgabe der Materialien weiter einzuschränken kann am Node ein zusätzlicher Eingang für Erstes Material angelegt werden. Dieser Zahlenwert bezieht sich auf den ausgewählten Material-Typ und gibt die Anzahl der Materialien an, die am Anfang der Wiedergabe ausgelassen werden sollen. Die Einstellung Erstes Material 1 mit dem Material-Typ All startet die Wiedergabe also erst mit dem Material, das an zweiter Stelle im Material-Manager liegt. Bei Erstes Material 0 beginnt die Ausgabe der Materialien jeweils mit dem ersten Material, das dem Material-Typ entspricht. Die maximale Anzahl an Materialien, die durch den Material-Node ausgegeben werden können, lässt sich über den ebenfalls optionalen Eingang für Material-Anzahl vorgeben.

Wie bereits vom Hierarchie-Node her gewohnt, kann auch der Material-Node über ein Boole-Signal am An-Eingang manuell ein- und ausgeschaltet werden. Sofern dieser Eingang nicht manuell aufgerufen wurde ist der Node automatisch aktiv. Die Gesamtzahl der ausgegebenen Materialien kann zusätzlich über einen Anzahl-Ausgangsport abgefragt werden. Hierbei werden diesmal auch die über die Ausschließen-Liste übersprungenen Materialien korrekt berücksichtigt, was beim Hierarchie-Node nicht funktioniert hatte.

Dieser Iterator ist hilfreich, wenn es um das Abfragen oder Animieren von Materialeigenschaften geht. Sie hängen dann also einfach ein aus dem Material-Manager in den XPresso-Editor gezogenes Material mit dessen Objekt-Eingang an den Material-Ausgang des Material-Iterator-Nodes. Achten Sie nur darauf, dass das in die Schaltung gezogene Material auch den gleichen Typ hat, den Sie über die Material-Typ-Einstellung im Material-Iterator ausgeben lassen. Nur so können Sie auf die teilweise speziellen Eigenschaften der Materialien über die Ports zugreifen.

Objektliste-Node

Dieser Node eignet sich gut, wenn Sie nur eine kleine Anzahl an Objekten ausgeben möchten, oder wenn die benötigten Objekte unregelmäßig über den Objekt-Manager verteilt sind, also die Nutzung des Hierarchie-Nodes dadurch nicht möglich ist. Ziehen Sie die gewünschten Objekte einfach aus dem Objekt-Manager direkt in die Iterations-Liste des Nodes hinein, die Sie über den Attribute-Manager angezeigt bekommen (siehe auch Abbildung 2.113).

Animation in Cinema 4D - Der Objektliste-Node

Abbildung 2.113: Der Objektliste-Node

An den Instanz-Ausgang des Nodes können Sie direkt einen Objekt-Node über dessen Objekt-Eingang anschließen. Alternativ hierzu kann auch das Zwischenschalten eines Objekt-Index-Nodes sinnvoll sein. Dieser gibt Ihnen am Instanz-Ausgang ebenfalls die Möglichkeit zum Anschluss eines Objekt-Nodes. Zusätzlich informiert dessen Index-Port über die Nummer des gerade ausgegebenen Objekts, also darüber, an welcher Stelle der Iterations-Liste das gerade ausgeworfene Objekt zu finden ist. Die Zählweise beginnt dabei bereits bei Null für das erste Objekt in der Liste. Dies kann z. B. auch spannend sein in Verbindung mit einem Verteiler-Node oder einer simplen Multiplikation, um jedes Element der Objektliste mit einem anderen Parameter in Verbindung zu bringen. Sie finden ein dazu passende Beispiel bei der Besprechung des Spline-Nodes und der dortigen Abbildung 2.71. Siehe hier:

Animation-Tags und XPresso: Die Cinema 4D-Tags – XPresso – Teil 06

Der Objektliste-Node kann über einen eigenen An-Eingang jederzeit manuell ein- oder ausgeschaltet werden. Dazu muss dort nur ein Boole-Signal angelegt werden. Wurde der An-Eingang nicht aufgerufen, ist der Node automatisch immer aktiv. Wer mag, kann die Auflistung der Objekte auch über den optionalen Eingangs-Port der Iterations-Liste in den Node leiten. Dazu wäre z. B. ein Konstante-Node mit dem Datentyp Ein-/Ausschluss geeignet.

Selektion-Node

Dieser Node eignet sich zur Ausgabe der Indexnummern von selektierten Punkten, Kanten oder Polygonen, sofern diese Selektionen an dem Objekt in entsprechende Auswahl-Tags gespeichert wurden. Das Abspeichern von Selektionen wird über das Selektieren-Menü und den dortigen Befehl Selektion einfrieren ausgeführt. Im Objekt-Manager entsteht dadurch ein Punkt-, Kanten- oder Polygon-Auswahl-Tag hinter dem Objekt, je nachdem in welchem Betriebsmodus von Cinema 4D Sie die Selektion ausgeführt haben. Dieses Auswahl-Tag ziehen Sie dann aus dem Objekt-Manager in die Schaltung und verbinden dessen Objekt-Ausgang mit dem Tag-Eingang des Selektion-Nodes. An den Ausgängen des Selektion-Nodes stehen Ihnen dann die Anzahl der selektierten Elemente sowie deren Indexnummern zur Verfügung. Die Indexnummern werden nacheinander am Iteration-Ausgang ausgegeben. Diesen Ausgang könnten Sie also direkt mit dem Punkt-Index-Eingang eines Punkt-Nodes oder dem Polygon-Index-Eingang eines Polygon-Nodes verbinden. In der Praxis wird es wohl sinnvoller sein, nur mit Punkt- oder Polygon-Selektionen zu arbeiten, denn für Kanten steht uns kein eigener Node zur Verfügung. Die Indexnummern von selektierten Kanten und die Anzahl der selektierten Kanten können zwar über den Iterator ausgeworfen werden, dies bringt uns jedoch nicht allzu viel. Selbst der Struktur-Manager von Cinema 4D kann ja auch nur die Punkte und Polygone auflisten.

Wie üblich finden Sie am Selektion-Node auch wieder einen optionalen An-Eingang, den Sie nach einem Klick auf die blaue Schaltfläche in der Kopfzeile des Nodes aufrufen können. Durch Anlegen eines Boole-Signals kann die Ausführung des Nodes dann individuell aktiviert oder auch stillgelegt werden. Wurde dieser Eingang nicht aufgerufen, ist der Node automatisch immer aktiv.

Tag-Node

Der Tag-Node funktioniert vergleichbar zum Material-Node der Iterator-Gruppe, denn auch bei den Tags handelt es sich ja um eine lineare Liste ohne Verzweigungen. Das erste Tag hinter dem verlinkten Objekt macht also immer den Anfang. Von da aus geht es nach rechts bis zum Ende der Tag-Symbole weiter. Ob dabei alle Tags berücksichtigt werden sollen oder nur bestimmte Typen, legen Sie über das Tag-Typ-Menü am Tag-Node fest (siehe auch Abbildung 2.114).

Animation in Cinema 4D - Einstellungen am Tag-Node

Abbildung 2.114: Einstellungen am Tag-Node

Nur in der Einstellung All werden alle Tags der Reihen nach am Tag-Ausgang des Nodes ausgegeben, ansonsten eben nur die Tags, die dem gewählten Typ entsprechen. Sollen Tags trotz passendem Typ übersprungen werden, ziehen Sie diese aus dem Objekt-Manager in die Ausschließen-Liste des Nodes hinein.

Der Zahlenwert Erstes Tag lässt sich über einen optionalen Eingang am Node belegen und kann bei Werten über Null zum Weglassen von Tags am Anfang der Aufzählung benutzt werden. Mit Erstes Tag 2 würden also z. B. die ersten beiden Tags ausgelassen, die dem geforderten Tag-Typ entsprechen. Bei meinen Tests funktionierte das Weglassen der geforderten Anzahl von Tags zwar gut, aber nur solange, bis nur noch ein Tag des passenden Typs gefunden werden konnte. Die gleichen Probleme konnte ich bei der Ausschließen-Liste feststellen. Die Anzahl am gleichnamigen Ausgang wird jedoch irritierender Weise richtig angezeigt. Denken Sie also daran, dass in Summe mindestens zwei Tags durch den Tag-Node ausgegeben werden müssen. Dann gab es bei mir keinerlei Probleme.

Eine noch dramatischere Abweichung von der normalen Funktion dieses Nodes konnte ich bei Nutzung des Eingangs für Tag-Anzahl beobachten. Dieser Wert ist eigentlich dafür gedacht, die Gesamtzahl der ausgegebenen Tags beschränken zu können. Auch hier erkennen Sie sicherlich wieder die Parallelen zum Material-Node. Die Vorgabe einer bestimmten Anzahl an Tags zeigte bei mir jedoch gar keine Reaktion. Zwar wurde auch hier wieder die richtige Anzahl am Ausgang ausgegeben, aber es wurden dennoch alle Tags des passenden Typs ausgeworfen (siehe Beispiel in Abbildung 2.115).

Animation in Cinema 4D - Testschaltung des Tag-Nodes

Abbildung 2.115: Testschaltung des Tag-Nodes

In dem abgebildeten Beispiel hatte ich mehrere Textur-Tags hinter einem Würfel angelegt. Der Tag-Node ist über den Eingang für die Tag-Anzahl eigentlich so konfiguriert, dass insgesamt nur das erste Textur-Tag ausgegeben werden kann. Dies zeigt auch der Anzahl-Ausgang richtig an. Das Setzen der Namen der ausgegebenen Textur-Tags macht jedoch deutlich, dass alle Textur-Tags am Objekt ausgegeben wurden. Ich hoffe natürlich, dass derartige Fehler bei Ihnen bereits behoben sind, aber überprüfen Sie dies bitte selbst zur Sicherheit, bevor Sie diesen Node benutzen.

Über den Autor

Dieses Tutorial ist ein Auszug aus dem CINEMA 4D-Kompendium zur Animation von Arndt von Koenigsmarck. Das komplette C4D-Kompendium mit über 950 Seiten Know-how als Download (PDF) gibt es hier: CINEMA 4D-Kompendium – Die Animation.

Wir empfehlen:
Maxon BodyPaint 3D-Video-Training

Unsere Empfehlung für dich

Cinema 4D für Einsteiger – für R16/R17/R18

Cinema 4D für Einsteiger – für R16/R17/R18

Überschreite mit unserem neuen und sagenhaften Standardwerk für Cinema 4D die Grenzen der Wahrnehmung. Das Release 16 ist das beste Update, das Maxon je herausgebracht hat!

  • Neue Funktionen von R16, R17 und R18 im Detail erklärt
  • In über 15,5 Stunden Video-Training Cinema 4D von A bis Z ergründen
  • PLUS 850 PDF-Seiten und Arbeitsmaterialien
  • Maximales Kreativtraining: Nachbau des Covermotivs

Zum Training