Animation-Tags und XPresso: Die Cinema 4D-Tags – XPresso – Teil 08 – Die XPresso-Nodes > Berechne

Tutorials 4. Januar 2016 – 0 Kommentare

Diese Gruppe an Funktionsknoten enthält vorrangig kleine mathematische Helferlein. Wir können hierüber z. B. Werte addieren oder auch das etwas komplexere Kreuzprodukt zweier Vektoren errechnen. Viele dieser Funktionen werden Ihnen auch aus dem Mathe-Schulunterricht bekannt vorkommen, z. B. wenn es um die Berechnung des Cosinus oder des Tangens geht. Ich werde wieder versuchen, Ihnen zumindest die etwas komplexeren Nodes anhand von Beispielen begreiflicher zu machen.

Absolut-Node

Von einem absoluten Wert spricht man, wenn dieser ein positives Vorzeichen trägt. Dieser Node sorgt also nur dafür, dass am Ausgang immer eine positive Variante des eingeleiteten Werts ankommt (siehe Abbildung 2.85).

Animation in Cinema 4D - Der Absolut-Node

Abbildung 2.85: Der Absolut-Node

Ob der Datentyp am Ausgang Real oder Integer sein soll legen Sie über den Attribute-Manager fest. In gewissen Grenzen rechnet dieser Node also auch Datentypen um, wenn z. B. die Zahl -3,2 hineingeleitet wird, der Node jedoch den Datentyp Integer, also ganzzahlig benutzt. In diesem Fall würde dann die Zahl 3 ausgegeben. Beachten Sie, dass bei der Umwandlung einer Real-Zahl zu einem Integer-Wert nicht gerundet wird. Der Nachkomma-Anteil wird einfach nur weggelassen.

Abstand-Node

Im Prinzip könnte dieser Node auch durch einen Mathe-Node mit angehängtem Spion- oder Allgemein-Node ersetzt werden, denn es wird einfach nur ein Vektor von einem anderen abgezogen und dann die Länge des resultierenden Vektors ausgerechnet (siehe Abbildung 2.86). Wenn Sie zwei Position-Vektoren an die Eingänge anschließen, erhalten Sie also den Abstand zwischen diesen beiden Positionen. daher auch der Name des Nodes. Nichtsdestotrotz ist dieser Node natürlich sehr praktisch, da viele Schaltungen die Abstände zwischen Punkten oder Objekten benutzen.

Animation in Cinema 4D - Der Abstand-Node

Abbildung 2.86: Der Abstand-Node

Begrenzen-Node

Wenn Sie sich an das Beispiel des Boole-Nodes erinnern, dort hatten wir Vergleich-Nodes benutzt, um die Positionierung eines Objekts beschränken zu können. Noch kompakter ließen sich solche und ähnliche Aufgaben über den Begrenzen-Node lösen. Je nach im Attribute-Manager eingestelltem Datentyp kann dieser mit Real- oder Integer-Werten umgehen. Ihnen stehen zwei Eingänge für die vorgegebenen Grenzen zur Verfügung, nämlich Min und Max. Liegt der eingeleitete Wert über dem Max-Wert wird am Ausgang Max ausgegeben. Liegt der Wert niedriger als Min, liegt am Ausgang Min an. Ansonsten wird der Wert unverändert durchgeleitet. Auch hier gilt wie beim Absolut-Node, dass bei Einleitung von Real-Werten und Nutzung des Datentyps Integer keine Rundung der Werte erfolgt, sondern nur der ganzzahlige Anteil des Werts mit Min und Max verglichen wird.

Die Abbildung 2.87 gibt ein Beispiel zur Nutzung dieses Nodes-Typs. Dort wird die globale Position eines Würfels über einen Vektor zu Reale-Node in seine Bestandteile aufgespalten. Diese werden dann über Begrenzen-Nodes mit eingeleiteten Min- und Max-Werten verglichen und dabei ggf. korrigiert. Die drei derart bearbeiteten Werte fügt ein Reale zu Vektor-Node wieder zu einem Vektor zusammen, der dann als korrigierte globale Position an den Würfel zurückgeschrieben wird. Diese Funktion entspricht exakt der eines Schutz-Tags mit aktiver Begrenzen-Option für die Position. Das Schutz-Tag bezieht sich jedoch immer nur auf lokale Koordinaten und Winkel. Da sind wir mit unserer Schaltung sehr viel flexibler. Nach dem gleichen Prinzip ließen sich natürlich auch Winkel, Größen, Farben etc. begrenzen.

Animation in Cinema 4D - Nutzung von Begrenzen-Nodes

Abbildung 2.87: Nutzung von Begrenzen-Nodes

Bereichswandler-Node

Dieser Node ist sehr praktisch, wenn Werte umgerechnet werden müssen. Wenn Sie sich an den Anfang dieses Kapitel zurückerinnern, dort kam der Bereichswandler bereits einmal kurz vor, denn er wird ebenfalls bei den automatisch erzeugten Anführer / Verfolger-Schaltungen verwendet.

Im Prinzip handelt es sich hier nur um einen mathematischen Dreisatz, wenn Ihnen dieser Begriff etwas sagt. Wir geben also zwei Werte für den Eingang und zwei Werte für den Ausgang vor. Stellen Sie sich z. B. vor, Sie erwarten in einer Schaltung Real-Werte zwischen 0 und 150 möchten diese aber gern in einen Wertbereich zwischen 1 und 2 umgerechnet haben. Nichts leichter als das!

Sie tragen am Bereichswandler-Node 0 für Kleinster Eingang und 150 für Größter Eingang ein. Für Kleinster Ausgang verwenden Sie 1 und für Größter Ausgang 2. Damit sind Sie bereits fertig. Über den Eingang-Port des Nodes leiten Sie nun Ihre Werte hinein und am Ausgang erhalten Sie automatisch die umgerechneten Ergebnisse. Die Berechnung erfolgt dabei standardmäßig linear, d. h. dass Sie bei Einleitung eines Werts der exakt in der Mitte zwischen Kleinster und Größter Eingang liegt auch ein Ergebnis erhalten, das exakt in der rechnerischen Mitte zwischen Kleinster und Größter Ausgang liegt. Das muss aber nicht so bleiben denn Ihnen steht in den Parameter-Einstellungen des Nodes im Attribute-Manager auch ein Spline-Dialogfeld zur Verfügung (siehe Abbildung 2.88).

Animation in Cinema 4D - Dialog eines Bereichswandler-Nodes

Abbildung 2.88: Dialog eines Bereichswandler-Nodes

Durch Strg/Ctrl-Klicks in dieses Fenster können Sie neue Punkte setzen und so einen beliebigen Kurvenverlauf erzeugen. Sie kennen dieses Dialogelement bereits von anderen Stellen im Programm, wie z. B. vom Sweep-Objekt. Eine links unten startende diagonale Linie, die in der rechten oberen Ecke des Spline-Fensters endet würde exakt wieder dem linearen Umrechnungsverhältnis entsprechen, das Sie bereits ohne Nutzung eines Splines vorfinden.

Der Verlauf von links nach rechts, also die X-Achse des Spline-Graphen entspricht dabei dem Eingangsbereich am Node. Ganz links wird die Kurve also von Kleinster Eingang und ganz rechts von Größter Eingang flankiert. Die Höhe der Kurve über dem unteren Rand des Spline-Fensters, also die Y-Achse des Graphen entspricht dem Ausgangsbereich. Ganz unten finden Sie also Kleinster Ausgang und oben Größter Ausgang. Lassen Sie sich dabei nicht von den Zahlenwerten am Rand des Graphen verunsichern. Diese laufen generell nur zwischen 0 und 1 in X- und Y-Richtung, auch wenn Ihre Werte natürlich ganz andere Größenordnungen haben können. Das Beispiel in der folgenden Abbildung 2.89 macht diesen Zusammenhang vielleicht noch deutlicher. Dort wurde eine Kurve benutzt, die bereits in der Mitte des Eingangsbereichs den oberen Rand, also das Maximum des Ausgabebereichs erreicht und danach wieder auf die Höhe Null absinkt.

Animation in Cinema 4D - Beispielhafte Umrechnungskurve

Abbildung 2.89: Beispielhafte Umrechnungskurve

So erkennen Sie in Abbildung 2.89, dass ich dort einen Eingangsbereich zwischen 5 und 10, sowie einen Ausgangsbereich zwischen 100 und 200 gewählt habe. Eingeleitet wird der Wert 7.5, der somit exakt in der Mitte zwischen Kleinster Eingang und Größter Eingang liegt. Folglich schaut der Bereichswandler entlang der horizontalen X-Achse nach, welche Höhe die Kurve über der entsprechen Stelle hat. Dies betrifft hier also die X-Koordinate 0.5 in dem Graphen. Dort sehen wir, dass die Kurve exakt die Y-Position 1.0, also den oberen Rand des Graphen erreicht. Der obere Rand entspricht exakt dem Wert für Größter Ausgang. Folglich liefert der Node den Wert 200 am Ausgang. Höhere und niedrigere Eingang-Werte führen somit entsprechend der Kurve zu einer Ausgabe, die wieder näher zu Kleinster Ausgang tendiert.

Ich hoffe Sie verstehen anhand dieses Beispiels, wie nützlich dieser Node sein kann. Denken Sie z. B. an eine Feder, die sich unter Krafteinwirkung erst nur wenig und dann plötzlich immer stärker verformt. Durch die Option, Tangenten an der Kurve zu nutzen, kann aber auch bei schon annähernd linearen Verläufen ein Ease Ease-Verhalten nachgebildet werden, so wie wir es im ersten Kapitel oft bei den Animationskurven benutzt haben.

Damit wäre bereits erläutert, wie die eingeleiteten Werte innerhalb des definierten Eingangsbereichs umgerechnet werden. Was passiert jedoch, wenn wir Werte benutzen, die außerhalb der Grenzen von Kleinster Eingang und Größter Eingang liegen? Dafür müssen wir uns mit den Optionen des Bereichswandlers beschäftigen, die Sie in der Rubrik Node-Eigenschaften im Attribute-Manager finden. Los geht es dort jedoch mit einem alten Bekannten, nämlich dem Datentyp. Sie haben nur die Wahl zwischen Real und Vektor, wobei dies ja eigentlich auch alles abdecken sollte, was an Umrechnungen in einer Schaltung zu leisten ist. Die folgenden beiden Menüs bieten sogenannte Standardintervalle für den Eingang und den Ausgang an. Dazu gehören z. B. Gradzahlen, Winkel in Radians oder Prozentwerte. Im Prinzip lassen sich diese Bereiche natürlich auch direkt von Hand eintragen, aber manchmal findet sich hier für das Eingang-Intervall oder das Ausgang-Intervall ja auch gleich der gewünschte Wertbereich. Beachten Sie, dass beim Umschalten dieser Menüs eventuell bereits eingetragene Werte umgerechnet werden. Interessanter im Hinblick auf Werte, die außerhalb des Bereichs zwischen Kleinster Eingang und Größter Eingang liegen, sind jedoch die folgenden Optionen.

Die Optionen für Unten begrenzen und Oben begrenzen funktionieren wie ein Begrenzen-Node, sorgen also dafür, dass die eingeleiteten Werte immer exakt im festgelegten Eingangsbereich zwischen Kleinster Eingang und Größter Eingang bleiben (siehe auch Abbildung 2.90).

Animation in Cinema 4D - Optionen des Bereichswandlers

Abbildung 2.90: Optionen des Bereichswandlers

Größere Werte werden also einfach durch Größter Eingang ersetzt. Werte, die kleiner als Kleinster Eingang sind, werden auf den Betrag von Kleinster Eingang erhöht. Wie lösen wir jedoch Aufgaben, bei denen Werte zyklisch umgerechnet werden müssen? Stellen Sie sich z. B. den Zeiger einer Uhr vor, der permanent rotiert. Die Winkel erhöhen sich also laufend, obwohl die tatsächliche Stellung des Zeigers eigentlich nur Winkel zwischen 0° und 360° einnimmt. Derartige Umrechnungen lassen sich über die Option Modulo automatisieren. Beachten Sie nur, dass Modulo keinen Sinn mehr macht, wenn Unten begrenzen und Oben begrenzen aktiv sind. Wir benötigen schließlich Eingangswerte die auch außerhalb des vordefinierten Eingangsbereichs liegen können.

Sofern Modulo aktiv ist, wird der Betrag des Eingang-Werts auf ein Vielfaches des vorgegebenen Eingang-Intervalls umgelegt. Stellen Sie sich z. B. ein Eingang-Intervall zwischen 0 und 1 vor und einen Eingang-Wert von 1,5. Die Modulo-Funktion würde hier erkennen, dass ein Überhang von 0,5 entsteht und diesen Wert an die Bereichswandler-Berechnung weiterleiten. Das gleiche Resultat würde in diesem Beispiel bei Eingangswerten von 2,5 oder z. B. 12,5 errechnet. Ein sich ständig erhöhender Wert läuft also jeweils in Richtung der Grenze von Größter Eingang. Wird dieser Wert überschritten, wird die größtmögliche Anzahl von Größter Eingang vom Eingangswert abgezogen. Übrig bleit eine Zahl, die nun wieder in den ursprünglichen Wertbereich hineinpasst. Das gleiche passiert natürlich auch wenn Kleinster Eingang unterschritten wird, es sei denn, die Optionen für Unten begrenzen oder Oben begrenzen sind zusätzlich aktiv.

Bleibt nur noch die Umkehren-Option übrig. Diese tauscht im Prinzip nur die Werte von Kleinster Ausgang und Größter Ausgang für die Umrechnung aus. Ein Eingangswert in der Größenordnung von Größter Eingang wird dann ein Resultat in Höhe von Kleinster Ausgang liefern. Dies kann jedoch nur so funktionieren, wenn Sie keine eigene Splinekurve benutzen. Über den Spline hätten Sie ansonsten ja sowieso jederzeit die Möglichkeit, die Umrechnung zu beeinflussen. So entspräche z. B. eine von links oben nach rechts unten verlaufende Gerade dort exakt der Benutzung der Umkehren-Option ohne Spline.

Die Spline benutzen-Option ist standardmäßig zwar immer aktiv, beeinflusst das Ergebnis jedoch nicht, solange Sie nicht selbst eine Kurve in dem entsprechenden Bereich angelegt haben. Trotz Spline benutzen erfolgt also standardmäßig eine lineare Umrechnung der Werte, solange kein Spline vorhanden ist. Ansonsten hatten wir die möglichen Effekte eines Splines bei diesem Node ja bereits besprochen.

Farbraum-Node

Dieser Node hilft uns dabei, Farben aus den verschiedenen Farbräumen umzurechnen, also z. B. einen RGB-Farbwert in den entsprechenden Vektor des HSV-Farbsystems. Cinema 4D selbst bietet in den Dialogen jeweils nur das RGB- und das HSV-System an. Der Farbraum kann jedoch auch in das dem HSV verwandte HLS-System umgerechnet werden. Zum Verständnis möchte ich kurz auf die Unterschiede zwischen den Farbräumen eingehen. Vorweg sein festgehalten, dass die Größe des Farbraums bei allen drei angebotenen Systemen natürlich gleich ist. Sie haben also keinen Vorteil durch die Nutzung eines bestimmten Farbraums. Das RGB-System definiert eine Farbe aus der Mischung zwischen den Grundfarben Rot, Grün und Blau. Beim HSV-System stehen die drei Buchstaben für den Farbwinkel (Hue), die Sättigung der Farbe (Saturation) und für den Wert der Helligkeit (Value). Dies hat für uns in Dialogen den Vorteil, dass der gewünschte Farbton mit nur einem Regler eingestellt werden kann. Ebenso kann die Sättigung oder Helligkeit direkt über einen Regler gesteuert werden. Beim RGB-System müssen immer drei Regler bedient werden, um den Farbwert, die Sättigung oder die Helligkeit einzustellen. Werden nur Grauwerte benötigt, kommt man bei diesem System sogar nur mit dem Helligkeitswert aus, wenn die Sättigung auf 0.0 belassen wird.

Das im Node ebenfalls angebotene HLS-System arbeitet ebenfalls mit dem Farbwinkel (Hue), die Farbhelligkeit wird jedoch bereits als zweiter Wert dieses Vektors geführt und zudem auf einen relativen Grauwert von 50% bezogen (Luminance). Der dritte Wert steht für die gewohnte Sättigung (Saturation). Streng genommen ist das HLS-System für uns noch angenehmer, da durch die Anhebung der Helligkeit gleichzeitig die Sättigung reduziert erscheint. Sie können diesen Effekt oben an Abbildung 2.91 beobachten.

Animation in Cinema 4D - Oben der HSV-Farbraum, darunter der HLS-Farbraum, jeweils bei einer Sättigung von 100%

Abbildung 2.91: Oben der HSV-Farbraum, darunter der HLS-Farbraum, jeweils bei einer Sättigung von 100%

Ich habe dort jeweils eine Sättigung von 100% verwendet. Die Farben im oberen Teil wurde jedoch durch den Farbraum-Node im Modus HSV zu RGB berechnet. Bei 100% Helligkeit erreichen dort die Farbwerte ihre maximale Strahlkraft. Wie die untere Hälft der Abbildung zeigt ist dies bei der Umrechnung von HLS zu RGB bereits bei einer Helligkeit von 50% der Fall. Größere Helligkeiten führen zu dem bereits angesprochenen Verlust an Sättigung.

Die Farbverläufe in Abbildung 2.91 wurden übrigens direkt mit Cinema 4D erstellt, natürlich mit der Hilfe einer kleinen XPresso-Schaltung (siehe Abbildung 2.92).

Animation in Cinema 4D - Schaltung zur automatischen Färbung des Polygonrasters

Abbildung 2.92: Schaltung zur automatischen Färbung des Polygonrasters

Ich habe dazu zuerst 36000 kleine Polygon-Grundobjekte in 100 Reihen zu je 360 Kopien erstellt. Dies lässt sich einfach über das MoGraph-Modul realisieren. Anschließend wurde das Klon-Objekt zu einem Null-Objekt konvertiert, um alle Polygone als einzelne Objekte zu erhalten. Ein Hierarchie-Node läuft dann in der Schaltung automatisch über diese Kopien und benutzt deren X- und Y-Positionen, um daraus Farbwert- und Helligkeitsinformationen umzurechnen, die in einem Farbraum-Node zu RGB-Werten werden. Die beiden Bereichswandler nutze ich dort nur, um die Positionswerte in X- und Y-Richtung jeweils auf die Wertbereiche zwischen 0.0 und 1.0 umzurechnen. Wie bereits beschrieben, habe ich die Sättigung der zu berechnenden Farben einfach mit 100% bzw. dem Wert 1.0 vorgegeben. Um die Farben direkt auf den Polygonen rendern zu können, übertrage ich den berechneten Farbwert auf den Farbe(Ansicht)-Parameter, den jedes der benutzten Objekte in seinen Basis-Einstellungen führt. Wie der Hierachie-Node genau funktioniert erfahren Sie ansonsten natürlich noch etwas später. Dieser ist in der Gruppe der Iteratoren zu finden.

Formel-Node

Wie der Name dieses Nodes schon andeutet, lassen sich hiermit komplexere Berechnungen sehr kompakt abarbeiten. Sie haben ja in vergangenen Beispielen bereits den Mathe-Node in Aktion gesehen. Dieser ist zwar sehr praktisch, bietet jedoch immer nur eine Funktion auf einmal an, also z. B. das Multiplizieren oder Addieren zweier Zahlen. Etwas komplexere Funktionen können zwar theoretisch durch das Verknüpfen mehrerer solcher Mathe-Nodes berechnet werden, das wird jedoch schnell unübersichtlich und nimmt zudem sehr viel Platz im XPresso-Editor ein. In solchen Fällen bietet sich der Formel-Node an, zumal dort auch komplexere Berechnungen, wie z. B. das Ziehen einer Wurzel oder die Berechnung des Sinus möglich sind. Zudem erlaubt der Formel-Node beliebig viele Eingänge, die in die Formel eingearbeitet werden können. Diese Eingänge legen Sie wie gewohnt über die blaue Schaltfläche am Node an.

Wenn Sie bei selektiertem Node einen Blick in den Attribute-Manager werfen, so finden Sie dort wie gewohnt die angelegten Eingänge in der Parameter-Rubrik. Hinter den Namen der Eingänge werden Sie zusätzliche Zahlen entdecken können, die in eckigen Klammern geschrieben stehen. Diese Ziffern lassen sich in Verbindung mit einem $-Zeichen direkt in der Formel verwenden, um die Werte der entsprechenden Eingänge dort abzufragen. Die Formel $1*SQRT($2) würde dann dazu führen, dass der Wert1-Eingang mit der Wurzel aus dem Wert2-Eingang multipliziert wird. Daran sehen Sie bereits, dass die Formel weit über das einfache Addieren von Werten hinausgehen kann.

Animation in Cinema 4D - Einstellungen im Formel-Node

Abbildung 2.93: Einstellungen im Formel-Node

So können Sie z. B. Abkürzungen, wie SQRT, SIN, COS, TAN, ACOS, ASIN, ATAN, EXP oder auch Konstanten, wie PI direkt in der Formel benutzen. Diese Kürzel stehen der Reihe nach für das Ziehen einer Wurzel, den Sinus, Cosinus, Tangens, Arcuscosinus, Arcussinus, Arcustangens, eine Exponentialfunktion und natürlich für die Kreiszahl pi. Dabei ist es übrigens egal, ob Sie ausschließlich Groß- oder Kleinbuchstaben verwenden. Beide Schreibweisen sind in Formeln zugelassen.

Um Ihnen einen vollständigen Überblick über die möglichen Abkürzungen und Zeichen zu geben, führe ich diese hier einmal auf. Sicherlich geläufig sollten Ihnen dabei die Zeichen +, -, *, / für die Grundrechenarten, sowie die runden Klammern () zum Abgrenzen zusammengehörender Terme innerhalb einer Formel sein. Die oben bereits aufgezählten Kürzel zur Berechnung eines Sinus- oder Cosinuswerts, bzw. die jeweiligen Arcus-Funktionen zur Umkehrung eines Sinus, Cosinus oder Tangens sollten Sie ebenfalls bereits kennen. Zusätzlich stehen aber auch noch SINH, COSH und TANH für den Sinus Hyperbolicus, Cosinus Hyperbolicus und Tangens Hyperbolicus zur Verfügung.

Wir haben ja bereits mehrfach festgestellt, dass bei der Umwandlung des Datentyps Real zu Integer es nur zu einem Weglassen des Nachkomma-Anteils kommt. Wenn Sie eine echte Rundung benötigen, werden Sie schnell die folgenden Befehle schätzen lernen. Mit FLOOR erhalten Sie eine abgerundete Zahl. FLOOR(5.7) liefert daher 5 als Ergebnis. CEIL bewirkt das Gegenteil, rundet also immer zur nächsten Integerzahl auf: CEIL(5.2)=6. Das Ihnen sicherlich bekanntere Runden verbirgt sich hinter dem Befehl ROUND. Ab einem Nachkomma-Anteil von ,5 wird aufgerundet, alles darunter abgerundet: ROUND(5.49)=5 und ROUND(5.5)=6.

Das Kürzel ABS kennen wir bereits als Absolut-Node. Der angehängte Klammerterm wird also immer zu einem positiven Wert umgerechnet: ABS(-11.2)=11.2. Mit SQR quadrieren Sie eine Zahl, nehmen diese als hoch 2: SQR(3)=9. Die Umkehrung dieses Quadrats ist die Quadratwurzel SQRT. SQRT(16) liefert somit als Ergebnis 4.

Als Exponentialfunktion bezeichnet man die Eulersche Zahl e=2,718281… hoch dem gewünschten Wert. Als Formel ausgeschrieben wäre dies also z. B. EXP(5) für e5 und ergibt somit als Ergebnis ca. 148,41316. Der Logarithmus zur Basis e wird als LOG abgekürzt, der Logarithmus zur Basis 10 als LOG10. Der Logarithmus ist die Umkehrung der Potenzierung. 102 wäre so eine Potenzierung, bei der wir als Ergebnis natürlich 100 erhielten. Nimmt man diesen Wert in Form von LOG10(100) in die Formel, erhalten wir als Ergebnis den Exponenten 2.

Es gibt aber noch komplexere Funktionen, wie z. B. RND, durch die wir Zufallszahlen erzeugen können. Der Syntax lautet dabei so: RND(max. Wert; Startwert). Der max. Wert stellt dabei die Obergrenze für die generierten Zufallswerte dar, die generell über 0 liegen. Der Startwert liefert wie üblich die Basis für die Zufallsberechnung. Die Nutzung des Startwerts ist zwar optional, aber von mir dringend empfohlen, um tatsächlich bei jedem Bildwechsel komplett neue Zufallswerte zu erhalten. Denken Sie nur daran, beide Zahlen oder Port-Namen mit einem Semikolon voneinander zu trennen. Es bietet sich an, einen Eingang des Formel-Nodes mit dem Bild-Ausgang des Zeit-Nodes zu verbinden. Für noch stärkere Variationen multiplizieren Sie die Bildnummer zusätzlich mit einer hohen Zahl, wie z. B. 6531 bevor Sie dieses Ergebnis als Startwert in der RND-Funktion benutzen.

Der TRUNC-Befehl funktioniert wie die Umwandlung von Real zu Integer, unterschlägt also einfach den Nachkomma-Anteil. Aus TRUNC(5.4312) wird dadurch 5,0. POW steht für Power, also die Potenz einer Zahl. 34 würde also zu POW(3;4) und somit zu 81. Den Modulo hatten wir ebenfalls schon besprochen, als es um den Bereichswandler-Node ging. In diesem Fall liefert der MOD-Befehl den Rest, nachdem eine Zahl b maximal oft in die Zahl a gesetzt wurde. Ein Beispiel macht dies sicher deutlicher. Wie oft können wir 6 in 15 unterbringen? Richtig, zwei Mal. Welcher Rest verbleibt dadurch? Wieder richtig, nämlich drei. Exakt zu dem gleichen Ergebnis kommt der Befehl MOD(15;6).

Der CLAMP-Befehl funktioniert exakt wie unser Begrenzer-Node. Sie geben eine Unter- und eine Obergrenze vor, zwischen denen sich ein dritter Wert bewegen darf. Der Syntax lautet also CLAMP(min. Wert; max. Wert; Wert). Ist Wert kleiner als min. Wert wird eben auch nur min. Wert ausgegeben. Entsprechend liefert der Befehl max. Wert wenn Wert über dieser Grenze liegt. Ansonsten wird Wert unverändert durchgereicht. Mit den Befehlen MIN und MAX können Sie die niedrigste bzw. größte zweier Zahlen errechnen lassen. MIN(2;3) ergibt also 2 und MAX(2;3) als Ergebnis 3.

Schließlich kann auch noch LEN hilfreich sein, um damit die Länge eines Vektors zu berechnen. Der Syntax lautet LEN(x;y;z), wobei auch nur ein 2D-Vektor erlaubt wäre, der dritte Zahlenwert dann also auch entfallen kann.

Die Konstanten hatte ich bereits kurz angesprochen. Dazu gehören z. B. die Kreiszahl PI=3,1415… oder die schon benutzte Eulersche Zahl E=2,71828…, aber auch Vielfache von PI sind bereits als Konstanten vorbelegt. PI05 liefert so z. B. 0.5* PI und PI2 ergibt das Doppelte von PI. PI spielt oft eine wichtige Rolle in Formeln und Berechnungen, weil wir damit z. B. Winkel in Grad umrechnen können. In Radians-Winkel, mit denen Cinema 4D intern rechnet, entsprechen 360° dann nämlich 2.0*PI bzw. PI2.

In diesem Zusammenhang bietet sich auch die Besprechung des Menüs für den Winkel-Typ an, das Sie ebenfalls im Attribute-Manager finden. Wir haben nun ja bereits viele Funktionen und Befehle besprochen, die mit Winkel rechnen, wie z. B. SIN für den Sinus eines Winkels. Die Formel muss nun aber wissen, ob wir mit Grad-Winkeln oder in Radians arbeiten möchten. SIN(180) oder SIN(PI) können dann jeweils das gleiche Resultat ergeben, wenn der entsprechende Winkel-Typ ausgewählt wurde. Schließlich findet sich am Node auch noch eine Option für Port-Namen benutzen. Ist diese aktiv, lassen sich die Namen der Ports direkt in der Formel verwenden. Dies kann natürlich sehr viel übersichtlicher sein, zumal Sie die Namen der Ports ja nach Belieben editieren können.

Funktion-Node

Am Beispiel des Formel-Nodes haben wir bereits gängige mathematische Funktionen besprochen. Diese lassen sich auch separat über einen Funktion-Node aufrufen. Dabei können diese Funktionen direkt über ein Menü im Attribute-Manager aufgerufen werden. Im Prinzip kennen Sie diese also bereits:

  • Exp: Die Exponentialfunktion mit der eulerschen Zahl als Basis (e=2,71828…). Exp(5) entspricht dabei also e5
  • Ln: Der natürliche Logarithmus, liefert die Umkehrung der Exp-Funktion. Ln(Exp(5))=5
  • Ln10: Der Logarithmus zur Basis 10. Die Umkehrung der Potenzierung. Ln10(104)=4
  • Sqrt: Die Quadratwurzel. Sqrt(9)=3, weil 32=9
  • Floor und Ceil: Runden einen Wert auf die nächste Integerzahl ab (Floor) oder auf (Ceil)
  • Pow: Potenziert eine Zahl mit sich selbst, also z. B. 22=Pow(2) oder 55=Pow(5)
  • Pow2: Quadriert eine Zahl, also z. B. 32=Pow2(3) oder 52=Pow2(5)

Gemische Mathe-Node

Dieser Node ist eng verwandt mit dem später noch beschriebenen Mathe-Node, geht jedoch mit den Datentypen strenger um. Der am Eingang Fließkomma Wert verbundene Wert wird immer in eine Real-Zahl umgewandelt. Aus einem Vektor wird also z. B. der Betrag seiner Länge. Dies ist unabhängig von dem Datentyp, den Sie im Attribute-Manager einstellen können. Dieser Datentyp legt nur das am Ausgang des Nodes anliegende Ergebnis fest. Zudem wird am Eingang-Port ebenfalls ein Wert im dazu passenden Format erwartet. Falls dieser nicht anliegt, erfolgt dort eine automatische Umrechnung in das ausgewählte Datenformat.

Über ein Funktion-Menü wählen Sie schließlich die gewünschte mathematische Funktion aus, also z. B. Addieren, Subtrahieren, Multiplizieren oder Dividieren. Gerade bei der Nutzung von Vektoren und dazu gehören aus den verfügbaren Datentypen ja auch Farbe und Normale, sind einige mathematische Grundlagen hilfreich, wie eine Kombination mit einer Real-Zahl aussieht. Beim Addieren wird z. B. die Fließkommazahl zu jeder Komponente des Vektors hinzuaddiert.

Aus (1; 2; 3)+5 wird dann (6; 7; 8). Entsprechend funktioniert das Subtrahieren. (1; 2; 3)-5 resultiert dann in dem Vektor (-4; -3; -2). Beim Multiplizieren wird jede Komponente des Vektors einzeln mit dem Fließkommawert multipliziert. Aus (1; 2; 3)*5 wird dadurch der Vektor (5; 10; 15). Gleiches gilt für die Division: Aus (1; 2; 3)/5 wird der Vektor (0,2; 0,4; 0,6).
Im Prinzip ließe sich der Gemischte Mathe-Node auch problemlos durch einen Mathe-Node mit vorgeschaltetem Allgemein-Node mit Datentyp Real am zweiten Eingang ersetzen, aber so ist es natürlich für einige Schaltungen viel kompakter.

Invertieren-Node

Auch dieser Node lässt sich oft durch eine mathematische Division ersetzen, denn hier wird beim im Attribute-Manager ausgewählten Datentyp Real einfach nur die Formel 1/Eingangswert abgearbeitet. Die Invertierung des Werts 5 ergibt also 1/5 und somit 0,2 als Ergebnis. Es ist daher auch besondere Sorgfalt bei Eingangswerten in der Nähe von Null angesagt, denn eine Division durch Null ist mathematisch nicht definiert, bzw. ergibt eine unendlich große Zahl. In diesem Fall produziert der Node einen Fehler und zeigt dies durch eine gelb gefärbte Titelzeile an. Viel interessanter für uns ist jedoch der Datentyp Matrix, denn durch die Invertierung einer Matrix lassen sich globale in lokale Koordinaten umrechnen. Stellen Sie sich z. B. vor, sie kennen eine globale Position und würden diese nun gern in eine Koordinate innerhalb eines beliebigen Objekts umrechnen lassen. In diesem Fall müssen Sie die globale Matrix des Objekts invertieren und dann mit der globalen Position multiplizieren. Für diese Fälle ist sogar ein extra Node in der Berechne-Rubrik enthalten, der Matrix mal Vektor-Node. Wir kommen also dort noch einmal auf dieses Beispiel zurück.

Kreuzprodukt-Node

Wir haben eingangs zu diesem Kapitel bereits über die verschiedenen Datentypen und in diesem Zusammenhang auch über die Besonderheiten der Matrix gesprochen. Diese besteht ja neben dem Offset-Vektor auch noch aus den drei Vektoren, die die Größe und Richtung des Achsensystems wiedergeben. Wir hatten bereits besprochen, dass diese Vektoren in der Regel nur eine Einheit lang sind und jeweils senkrecht auf den anderen beiden Achsvektoren stehen. Wenn wir so eine Matrix selbst konstruieren wollten, wäre diese Bedingung wohl eine der schwierigsten Aufgaben, denn wie können wir Vektoren so berechnen lassen, dass diese automatisch senkrecht aufeinander stehen? Genau hier kommt das Kreuzprodukt ins Spiel. Entsprechend lassen sich auch nur Vektor-Datentypen im Attribute-Manager auswählen, von denen besonders Vektor und Normale für uns hilfreich sind.

Ich glaube, ich muss Sie hier gar nicht lange mit der Mathematik der Kreuzprodukt-Berechnung langweilen. Viel wichtiger für uns ist, was wir davon haben. Im Prinzip leiten Sie immer zwei Vektoren in den Node hinein. Diese Vektoren werden nicht als Positionen, sondern als Richtungen ausgelegt. Im einfachsten Fall könnten dies also z. B. die Vektoren 1; 0; 0 und 0; 1; 0 sein, also die Richtung der Welt-X- und Y-Achsen. Das Kreuzprodukt liefert in dem Fall automatisch den Vektor 0; 0; 1, also die fehlende Z-Richtung. Es kommt bei der Verschaltung dieser Vektoren jedoch auch noch auf die Reihenfolge an. Würden unsere Vektoren an den Eingängen vertauscht, erhielten wir die negative Z-Richtung 0; 0; -1. Beachten Sie daher folgende Regeln, um richtig ausgerichtete Achsen zu erhalten:

  • X=Y kreuz Z; -X=Z kreuz Y
  • Y=Z kreuz X; -Y=X kreuz Z
  • Z=X kreuz Y; -Z=Y kreuz X

Genial daran ist, dass die eingeleiteten Vektoren nicht bereits senkrecht aufeinander stehen müssen. Es wird nämlich lediglich eine räumliche Ebene durch diese beiden Richtungen definiert.

Dies funktioniert also in jedem Fall, solange die Vektoren nicht exakt in die gleiche Richtung laufen. Werfen wir dazu mal einen Blick auf die Abbildung 2.94.

Animation in Cinema 4D - Berechnung des Kreuzprodukts

Abbildung 2.94: Berechnung des Kreuzprodukts

Ich habe dort zwei Pfeile stellvertretend für zwei Richtungsvektoren beliebig in den Raum gedreht. Über eingeblendete Benutzerdaten dieser Objekte können Sie auf der linken Seite der Abbildung direkt die entsprechenden Vektoren ablesen. Was Benutzerdaten sind und was diese mit XPresso zu tun haben lernen Sie noch am Ende dieses Kapitels. Was Sie jedoch jetzt schon erkennen können ist, dass diese beiden Richtungen nicht senkrecht aufeinander stehen, denn beide Vektoren haben einen Y-Anteil in der Richtung, wobei der grüne Pfeil exakt senkrecht steht und daher der Welt-Y-Achse entspricht. Das spielt jedoch für das Kreuzprodukt gar keine Rolle, denn dieses interessiert sich nur für die in der Abbildung weiß markierte Fläche zwischen den Vektoren. Um einen auf dieser Fläche senkrecht stehenden Vektor zu erhalten benutzen wir also den Kreuzprodukt-Node und bestücken diesen mit den Richtungsvektoren des roten und des grünen Pfeils. Als Ergebnis erhalten wir eine Richtung, die auf der rechten Seite der Abbildung als bläulicher Pfeil zu erkennen ist. Ja nach Sortierung der Eingänge am Kreuzprodukt-Node kann aber auch ein Pfeil in exakt entgegengesetzter Richtung herauskommen. Denken Sie am besten immer an das Welt-Achsensystem und dessen Achsrichtungen, dann haben Sie einen Anhaltspunkt, in welcher Richtung und Reihenfolge die Vektoren aufeinander stehen.

Wenn Sie die Richtungen und die von mir schon passend gewählten Farben der Pfeile in der Abbildung 2.94 betrachten, so könnte der senkrechte Pfeil ja für die Y-Richtung stehen. Der rote Pfeil zeigt grob entgegen der normalen X-Richtung. Folglich liefert hier das Kreuzprodukt aus X und Y, also der Vektor des roten Pfeils am oberen und die Richtung des roten Pfeils am unteren Eingang des Kreuzprodukt-Nodes, die natürliche Richtung der Z-Achse senkrecht zur XY-Ebene eines Achsensystems, in diesem Fall also nach vorne.

Was wir zu dem aktuellen Zeitpunkt feststellen können ist also, dass die blaue Richtung senkrecht auf der grünen und auf der roten Richtung steht. Um aus den drei Pfeilen eine für Objekte brauchbare Matrix formen zu können, müssen jedoch alle drei Richtungen senkrecht aufeinander stehen. Es liegt daher an uns zu entscheiden, welche der Pfeilrichtungen nun noch korrigiert werden muss. Im Prinzip kommen da nur entweder die grüne oder die rote Richtung infrage, denn der blaue Pfeil ist ja bereits senkrecht zu den beiden anderen berechnet worden. Falls wir uns für die Neuberechnung der roten Richtung entscheiden, müsste gerechnet werden: grün kreuz blau, basierend auf der Formel X=Y kreuz Z. Um eine neue grüne Richtung zu errechnen müsste hingegen blau kreuz rot, also entsprechend Y=Z kreuz X gerechnet werden.

Dabei spielt es übrigens erst einmal noch keine Rolle, ob die Richtungen normiert, also auf die Einheitslänge 1 gerechnet wurden, oder nicht. Das lässt sich ggf. auch im Nachhinein noch z. B. mittels eines Allgemein-Nodes und dessen Datentyp Normale erledigen. Praktischer ist es jedoch tatsächlich, die Vektoren und Kreuzprodukte jeweils in die passenden Normalen umzurechnen. Wird so eine normierte Matrix später einem Objekt zugewiesen, ändert sich dann höchstens die Drehung und Position, aber nicht die Größe. Diese Art der manuellen Matrix-Berechnung, das Kreuzprodukt und die Normierung von Vektoren, mögen Ihnen bis jetzt noch sehr theoretisch vorkommen. Ich möchte Ihnen daher gern noch ein praktisches Beispiel zu diesem Thema nachreichen. Gehen wir einmal davon aus, dass wir zwei Objekte in unserer Szene haben. Das eine Objekt soll mit seiner Z-Achse auf die Position des anderen Objekts zeigen. Sie kennen diesen Effekt ja schon von dem Ausrichten-Tag, das wir versuchen werden mithilfe einer eigenen Schaltung nachzubauen.

Um eine Matrix praktisch aus dem Nichts selbst aufzubauen benötigen wir zumindest eine Richtung. Das sollte in unserem Fall kein Problem sein. Durch die Vorgabe, dass ein Objekt auf ein anderes zielen soll, ergibt sich automatisch eine Verbindungslinie und somit auch eine Zielrichtung. Mathematisch betrachtet kann so eine Zielrichtung einfach als Subtraktion zweier Positionen ausgedrückt werden. Zieht man die Startposition von der Zielposition ab, ergibt dies automatisch den Richtungsvektor vom Start- zum Zielpunkt. In der Schaltung kann dies mit einem Mathe-Node berechnet werden, der den Datentyp Vektor und die Funktion Subtrahieren benutzt. Sie finden diesen Node ebenfalls in der Berechne-Gruppe der XPresso-Nodes. Damit hätten wir also bereits die Richtung der neuen Z-Achse an der Matrix definiert (siehe Abbildung 2.95).

Animation in Cinema 4D - Ausrechnen der Zielrichtung

Abbildung 2.95: Ausrechnen der Zielrichtung

Der nächste Schritt ist dagegen schon etwas trickreicher, denn damit haben sich ja bereits alle Vorgaben, die sich aus den vorhandenen Objekten ergeben erschöpft. Wir benötigen auf jeden Fall noch einen zweiten Richtungsvektor um damit ein erstes Kreuzprodukt berechnen zu können. Oftmals könnte dafür einfach z. B. die Welt-Y-Achse herangezogen werden. Dies funktioniert so lange gut, bis das Zielobjekt exakt senkrecht über dem auszurichtenden Objekt steht. Sind beide in den Kreuzprodukt-Node geleitenden Vektoren in Ihrer Richtung identisch, erhalten wir nämlich einen Nullvektor 0, 0, 0 als Ergebnis. So einen Fall gilt es daher zu vermeiden, soll die Schaltung immer funktionieren. Das Ergebnis des Kreuzprodukts sollte daher überprüft werden. Zuerst rufen wir also einen neuen Kreuzprodukt-Node auf und füttern dessen oberen Eingang über den Attribute-Manager manuell mit dem Vektor 0, 1, 0, also der Richtung der Welt-Y-Achse.

Animation in Cinema 4D - Erweiterung der Schaltung mit einer Kreuzprodukt-Berechnung

Abbildung 2.96: Erweiterung der Schaltung mit einer Kreuzprodukt-Berechnung

Die erweiterte Schaltung ist in Abbildung 2.96 zu sehen. Da wir die Zielrichtung als Z-Achse vorgegeben haben und die Welt-Y-Achse stets senkrecht nach oben weist, nehmen wir einfach an, dass das Ergebnis des Kreuzprodukts die X-Achse der gesuchten Matrix sein könnte. Aus der Vorgabe X = Y kreuz Z ergibt sich, dass die über den Mathe-Node berechnete Z-Richtung an den unteren Eingang des Kreuzprodukts gehängt werden muss. Sofern die beiden Objekte nicht perfekt übereinander stehen, wird am Ausgang des Kreuzprodukts schon die richtige X-Richtung ausgegeben. Diesen einen Ausnahmefall werden wir noch etwas später abfangen. Zuvor sollten wir jedoch die noch fehlende dritte Achsrichtung berechnen lassen (siehe Abbildung 2.97).

Animation in Cinema 4D - Berechnung der Y-Richtung der neuen Objekt-Matrix

Abbildung 2.97: Berechnung der Y-Richtung der neuen Objekt-Matrix

Wir benötigen dafür einen zweiten Kreuzprodukt-Node und verbinden dessen Eingänge mit der Zielrichtung und der zuletzt berechneten X-Richtung. Aufgrund des Zusammenhangs Y = Z kreuz X muss dabei die Zielrichtung an den oberen und der Ausgang des ersten Kreuzprodukts an den unteren Eingang. Damit hätten wir bereits alle drei Achsrichtungen für die neue Matrix beisammen. Bevor wir daraus tatsächlich eine Matrix generieren darf jedoch nicht vergessen werden, dass die Längen aller Richtungen noch nicht normiert wurden. Ohne diese Normierung würde die resultierende Matrix daher recht krass verzerrt und skaliert sein. Dies ist jedoch mit wenigen Handgriffen erledigt. Die beiden Kreuzprodukt-Nodes bieten bereits den Datentyp Normale im Attribute-Manager an und geben dann normierte Vektoren an den Ausgängen aus. Einzig für die Normierung der Zielrichtung müssen wir selbst sorgen. Der Mathe-Node könnte zwar ebenfalls auf den Datentyp Normale umgeschaltet werden, dann würden jedoch bereits die Eingänge dieses Nodes normiert und somit die Berechnung der Zielrichtung ganz anders ausfallen. Der Mathe-Node muss daher weiterhin den Datentyp Vektor benutzen. Wir hängen also einfach einen Allgemein-Node mit dem Datentyp Normale aus der Gruppe der Adapter-Nodes hinten an den Ausgang des Mathe-Nodes.

Animation in Cinema 4D - Zusammenführen der normierten Matrix-Achsen

Abbildung 2.98: Zusammenführen der normierten Matrix-Achsen

Das eigentliche Zusammenführen der drei Achsrichtungen zu einer Matrix erledigt der bereits bekannte Vektoren zu Matrix-Node für uns (siehe Abbildung 2.98). Wir benötigen jetzt nur noch den Vektor für den Offset-Eingang an diesem Adapter-Node. Damit ist die gewünschte Position der Matrix gemeint. Da sich die Position des ausgerichteten Objekts durch die Schaltung nicht verändern soll, wäre dies also die aktuelle globale Position des auszurichtenden Objekts. An den Ausgang des Vektoren zu Matrix-Nodes hängen Sie erneut das auszurichtende Objekt, um diesmal die globale Matrix zu übergeben (siehe Abbildung 2.99).

Animation in Cinema 4D - Die erste funktionsfähige Version der Ausrichten-Schaltung

Abbildung 2.99: Die erste funktionsfähige Version der Ausrichten-Schaltung

Abschließend sollten wir nur noch den bereits angesprochenen Sonderfall abfangen, wenn der Ziel-Vektor parallel zur Welt-Y-Achse verläuft. Zudem ist es noch etwas ungeschickt, dass immer an drei verschiedenen Nodes in der Schaltung des auszurichtende Objekt auszutauschen ist, sofern die Schaltung mehrfach in der Szene verwendet werden soll oder gar in eine andere Szene kopiert wird. Wir umgehen dies einfach dadurch, dass wir den Referenz-Modus in allen drei Objekt-Nodes des auszurichtenden Objekts auf Relative Referenz umschalten. Es wird dann automatisch immer das Objekt benutzt, dem auch das XPresso-Tag zugewiesen wurde. Gegen Ende dieses Kapitel werden Sie bei der Besprechung der Benutzerdaten dann noch eine weitere Möglichkeit kennenlernen, derartige Schaltungen praktisch auch von außen mit Werten füttern zu können.

Wie in der Abbildung 2.100 zu erkennen, fangen wir den beschriebenen Sonderfall einfach dadurch ab, dass wir den berechneten Kreuzprodukt-Vektor als Boole-Signal benutzen. Im Fall der senkrecht übereinander platzierten Objekte erhalten wir nämlich den Vektor 0, 0, 0, der an einem Allgemein-Node mit Datentyp Real zum Wert Null wird, da die Länge dieses Vektors eben Null beträgt. Null steht aber ebenso für ein boolesches FALSE und kann daher direkt an den An-Eingang des letzten Objekt-Nodes gehängt werden. In diesem Sonderfall wird der Node somit automatisch ausgeschaltet und nicht mit der falsch berechneten Matrix beaufschlagt (siehe Abbildung 2.100).

Animation in Cinema 4D - Feinschliff an der Ausrichten-Schaltung

Abbildung 2.100: Feinschliff an der Ausrichten-Schaltung

Mathe-Node

Diesen Node haben wir nun bereits im Vorgriff mehrfach verwendet. Er erklärt sich nahezu von selbst, denn hiermit lassen sich die Eingänge am Node über die eingestellte Funktion z. B. Addieren, Subtrahieren, Dividieren oder Multiplizieren. Wie üblich ist dabei auf den Datentyp zu achten den Sie ebenfalls direkt im Attribute-Manager einstellen. Entspricht dieser nicht dem Typ der verbundenen Werte an den Eingangs-Ports, kann es zu Umrechnungen kommen.

Verbundene Vektoren werden so z. B. beim Datentyp Real zuerst in ihre Längen umgerechnet, bevor z. B. addiert oder subtrahiert wird. Das Ergebnis ist dann natürlich ein ganz anderes. Sollen mehr als zwei Werte in einem Durchgang verarbeitet werden, lassen sich über die blaue Schaltfläche am Node noch weitere Eingang-Ports anlegen. Es kann jedoch immer nur eine Funktion ausgewählt werden. Beim Subtrahieren ergäbe sich dann also z. B. bei mehr als zwei Eingängen die Berechnung von Ausgang = Eingang1 – Eingang2 – Eingang3 usw.

Die Funktion Modulo ist u. a. schon vom Bereichswandler her bekannt und berechnet den Rest, nachdem Eingang2 maximal oft in Eingang1 eingesetzt wurde. Also, wie oft können wir z. B. 6 in 15 unterbringen? Richtig, zwei Mal. Als Rest bleibt drei, was auch genau dem Ergebnis des Mathe-Nodes entspricht, wenn wir 15 an den ersten und 6 an den zweiten Port legen.

Matrix mal Vektor-Node

Ebenfalls mit einer mathematischen Operation haben wir es bei diesem Node zu tun. Die Datentypen sind jedoch mit Matrix und Vektor bereits festgelegt. Was bringt uns aber nun die Multiplikation eines Vektors mit einer Matrix? Im Prinzip können wir mit diesem Hilfsmitteln jede lokale Position oder Richtung in eine globale umrechnen und umgekehrt. Stellen Sie sich also z. B. vor Sie wüssten gerne, wo ein Punkt Ihres Objekts bezogen auf das Welt-Koordinatensystem liegt. Sie könnten dann einfach die Position dieses Punkts an den Vektor-Eingang dieses Nodes legen. An den Matrix-Eingang knüpfen Sie die globale Matrix des Objekts. Als Ergebnis erhalten Sie die global umgerechnete Position. Der umgekehrte Fall funktioniert ähnlich, benötigt jedoch die invertierte Matrix. Sie würden dann also die globale Matrix des Objekts zuerst in einen Invertieren-Node leiten, der mit dem Datentyp Matrix operiert. Dessen Ergebnis kann dann wieder in den Matrix-Eingang des Matrix mal Vektor-Nodes. In diesem speziellen Fall wäre sicherlich die Benutzung des Punkt-Nodes einfacher gewesen, denn dort kann ebenfalls direkt zwischen lokalen und globalen Koordinaten umgeschaltet werden, aber es ist immer gut, solche Berechnungen auch „zu Fuß“ durchführen zu können. Zudem bietet der Matrix mal Vektor-Node noch eine Umschaltmöglichkeit für Normal an. Was damit gemeint ist, versucht die Abbildung 2.101 zu verdeutlichen. Im Prinzip lassen sich Vektoren nämlich auf zwei verschiedene Arten benutzen, als Ortsvektor und als Richtungsvektor. Rein äußerlich unterscheiden sich diese Vektorarten nicht. Beide bestehen aus den üblichen drei Einzelwerten. Nur die Information dieser Vektoren wird unterschiedlich interpretiert. Ein Ortsvektor gibt eine Position im Raum an. Dies ist also der Vektor, der vom Bezugssystem der lokalen oder globalen Matrix aus gesehen eine Position beschreibt. In Abbildung 2.101 wäre dies der bläuliche Pfeil.

Animation in Cinema 4D - Der Unterschied zwischen Orts- und Richtungsvektoren

Abbildung 2.101: Der Unterschied zwischen Orts- und Richtungsvektoren

Um eine Strecke zwischen Positionen zu beschreiben, benutzt man hingegen Richtungsvektoren. Diese enthalten die Information, wie man von A nach B kommt. Ohne die Position von A zu kennen wird man dieser Art Vektor also nie zu B kommen. Diese Vektoren sind in der Abbildung orangefarben dargestellt.
Mathematisch betrachtet können wir also durch die Addition eines Ortsvektors mit einem Richtungsvektor wieder einen Ortsvektor erhalten, nämlich in unserem Beispiel den von Position B. Was die Abbildung 2.101 jedoch hauptsächlich vermitteln möchte ist, dass Richtungsvektoren eben nur eine Richtung oder eine Strecke z. B. zwischen Positionen beschreiben. Dadurch dass der Anfangspunkt in dieser Information fehlt, lässt sich so ein Richtungsvektor auch beliebig parallel verschieben. Dies soll durch die verschiedenen organgefarbenen Pfeile in der Abbildung angedeutet werden.

Hier kommt nun endlich die angesprochene Normale-Option des Nodes ins Spiel, denn da beide Vektorarten den gleichen mathematischen Aufbau haben, kann der Node nicht erkennen, ob der eingeleitete Vektor ein Orts- oder Richtungsvektor ist. Dies spielt jedoch für eine Matrix-Multiplikation eine Große Rolle, denn die Matrix enthält ja auch eine Positionsangabe. Diese sorgt bei der Multiplikation dafür, dass sich auch der Anfangspunkt eines Ortsvektors verändert. Das macht ja auch Sinn. Denken Sie nur an die Verschiebung eines Objekts. Dabei wird ja im Prinzip immer nur der Offset der Objekt-Matrix verschoben. Die im Objekt enthaltenen Punkte sind durch lokale Ortsvektoren definiert und wandern daher einfach automatisch mit.

Soll durch den Vektor jedoch nur die Strecke zwischen zwei Punkten an diesem Objekt beschrieben werden, so würde sich diese ja durch die Verschiebung der Matrix nicht verändern. In solchen Fällen aktivieren Sie die Normale-Option, damit der Node den Offset der Matrix nicht zusätzlich in den Vektor hineinrechnet.

Matrix zu HPB-Node

Wir haben nun bereits recht ausführlich über den inneren Aufbau der Objekt-Matrix gesprochen. In der Praxis kann jedoch die Arbeit nur mit den Positions- und Richtungsvektoren einer Matrix mühsam sein. Wie kommen wir z. B. an die Drehungswinkel eines Objekts heran? Bingo, genau mit diesem Node.

Sie finden an diesem Node zwei Eingänge, für die auszulesende Matrix und für die Drehreihenfolge. Damit ist eine vorgegebene Reihenfolge für die Rotationen um die drei Objektachsen gemeint. Sie kennen diese Wahlmöglichkeit bereits aus der Koordinaten-Rubrik eines selektierten Objekts im Attribute-Manager. Cinema 4D selbst ist es im Prinzip egal welche Reihenfolge verwendet wird, Hauptsache man legt sich vor dem Animieren auf eine Einstellung fest. Wie Sie vielleicht bereits aus Band 1 des Kompendiums wissen, kann bei dieser Entscheidung ggf. die Option Gimbal-Drehung des Drehen-Werkzeugs helfen. Sollen später Animationen mit anderen 3D-Programmen ausgetauscht werden, kann es jedoch auch sinnvoll sein, die Drehreihenfolge auf das entsprechende Fremdprogramm anzupassen. Um die gewünschte Drehreihenfolge auszuwählen benutzen Sie besser nicht den Eingang-Port, sondern erledigen dies direkt in den Einstellungen des Nodes (siehe Abbildung 2.102). Sie finden diese in den Parametern des Nodes im Attribute-Manager im Menü der Drehreihenfolge unter der Zeichenfolge ZXY (Voreingestellt).

Animation in Cinema 4D - Parameter des Matrix zu HPB-Nodes

Abbildung 2.102: Parameter des Matrix zu HPB-Nodes

An Ausgängen stehen Ihnen die einzelnen Winkel direkt an den H-, P- und B-Ausgängen zur Verfügung. Wenn Sie einen kompletten Vektor mit diesen drei Werten bevorzugen, können Sie über die rote Schaltfläche des Nodes auch einen Vektor-Ausgang hinzuschalten. Bitte beachten Sie, dass in der Regel alle Winkel in Radians gerechnet werden. Eine volle Drehung von 360° entspricht dabei dem Wert 2*pi, also ungefähr 6.28. Wir werden etwas später noch einen eigenen Node besprechen, mit dem automatisch Radians in Grad und Grad in Radians umgerechnet werden können. Alternativ hierzu lässt sich aber auch ein einfacher Formel-Node dafür nutzen. Die Beziehung zwischen Radians und Grad lautet nämlich Radians = pi*Grad/180 bzw. Grad = Radians*180/pi.

Ähnlich verwirrend kann am Anfang für Sie die Reihenfolge der Winkel an den Ausgängen sein. Diese entspricht nämlich nicht der gleichen Reihenfolge, die Sie aus dem Koordinaten-Manager kennen. Dort sind wir es gewohnt, dass der H-Winkel zuerst angezeigt wird, obwohl dieser die Drehung um die Y-Achse des Objekts angibt. Dies ist beim Matrix zu HPB-Node anders. Dort wird unter H der Drehwinkel um die X-Achse ausgegeben, der im Koordinaten-Manager unter dem Kürzel P zu finden ist. Entsprechend finden Sie am P-Ausgang den Winkel, der im Koordinaten-Manager für Heading, also bei H ausgegeben wird. Zumindest beim B-Ausgang sind die Ergebnisse von Node und Koordinaten-Manager dann aber wieder im Einklang miteinander. Die gleiche, neu sortierte Reihenfolge finden Sie übrigens auch bei der Ausgabe als Vektor am Node vor.

Mischen-Node

Das Abmischen von Werten kommt öfter vor als man denkt. Dabei erhalten wir ein Ergebnis, das zwischen zwei vorgegebenen Werten liegt. Denken Sie z. B. an das Morphing von Punktpositionen oder das Mischen von Farben über die Zeit hinweg. Entsprechend verfügt dieser Node über zwei Eingänge, für den minimalen und den maximalen Wert des Ausgangs. Der Eingang für den Mischfaktor berechnet dann prozentual einen Wert zwischen diesen beiden Vorgaben. Bei einem Mischfaktor von 0 erhalten wir also den Wert von Eingang 1 und mit dem Mischfaktor 1 den Wert von Eingang 2. Wie Sie ja bereits von der Besprechung der Datentypen her wissen, entspricht nämlich der Real-Wert 1.0 genau 100%. Theoretisch erlaubt der Mischfaktor auch Eingaben, die unter 0 oder über 1 liegen, der Überhang wird jedoch bei der Berechnung automatisch auf 0 bzw. 1 gerundet.

Wie gewohnt definieren Sie das Datenformat der Ein- und Ausgänge an diesem Node über ein Datentyp-Menü im Attribute-Manager. Der Mischfaktor bleibt jedoch in jedem Fall im Datenformat Real. Beachten Sie in jedem Fall, dass die Mischung der Werte immer linear erfolgt. Ein Mischfaktor von 50% bzw. 0.5 wird daher immer nur die rechnerische Mitte zwischen den Eingangswerten ausgeben. Dies kann durchaus auch Probleme geben, z. B. bei Vektoren. Stellen Sie sich zwei Vektoren vor, die gleich lang sind, aber in exakt entgegengesetzte Richtungen weisen. Mischt man diese Vektoren mit 50% zusammen, kommt dabei exakt der Vektor 0, 0, 0 heraus. Um solche Fälle müssten Sie sich also selbst kümmern. Wenn Sie mehr Kontrolle über die Mischung von Werten benötigen, schauen Sie sich besser den Bereichswandler-Node an, den wir bereits besprochen hatten.

Wen die Mathematik hinter dem Mischen interessiert, der kann sich diese Formel ansehen: Ausgang = Eingang 1 + Mischfaktor * (Eingang 2 – Eingang 1).

Negieren-Node

Dies ist wieder eine der einfachen Hilfsfunktionen, denn es wir nur das Vorzeichen des Eingangs gewechselt. Aus -2 wird am Ausgang folglich +2. Im Prinzip ließe sich dies also auch z. B. mit dem Mathe-Node durch Multiplikation mit -1 simulieren. Auch hier ist wieder etwas Vorsicht geboten, denn nicht alle der wählbaren Datentypen lassen sich überhaupt sinnvoll negieren. Stellen Sie sich z. B. negative Farbwerte vor. Einige dieser Fälle fängt der Node jedoch auch selbständig ab, wie z. B. beim Boole-Datentyp. TRUE wird durch das Negieren FALSE und FALSE eben TRUE. Hier entspricht die Funktion somit dem bereits bekannten NICHT-Node aus der Boole-Gruppe der XPresso-Nodes.

Punkt-Produkt-Node

Unter einem Skalar- oder Punkt-Produkt zwischen zwei Vektoren versteht man die Projektion des einen auf den anderen Vektor. Kennt man die Längen der beiden beteiligten Vektoren kann darüber der Winkel zwischen den Vektoren ausgerechnet werden. Stellen wir uns also z. B. die Vektoren 1, 0, 0 und 0, 1, 0 vor. Diese entsprechen den X- und Y-Achsen des Weltsystems und lassen sich daher gut für ein Beispiel nutzen. Das Punkt-Produkt ist definiert als Betrag von Vektor 1 * Betrag von Vektor 2 * cos (eingeschlossener Winkel). Um an den Winkel zu kommen muss also das Ergebnis dieses Nodes durch die Multiplikation der Vektorlängen geteilt werden und anschließend der Arcus Cosinus gebildet werden. In unserem Fall kann diese Division sogar entfallen, weil die Vektoren jeweils eine Einheit lang sind. Übrig bleibt daher nur der Arcus Cosinus, den wir z. B. über einen angehängten Formel-Node berechnen können. Dabei ist nun noch der Winkel-Typ zu beachten. Im Formel-Node kann zwischen Radians und Grad umgeschaltet werden. In der nachfolgenden Abbildung 2.103 sehen Sie diese Schaltung noch einmal ausführlicher und auch das resultierende Ergebnis, nämlich 90°, sofern der Winkel-Typ Grad benutzt wird.

Animation in Cinema 4D - Berechnung des Winkels zwischen zwei Vektoren

Abbildung 2.103: Berechnung des Winkels zwischen zwei Vektoren

Um diese Schaltung für beliebige Vektoren benutzen zu können, wählen Sie den Datentyp Normale am Punkt-Produkt-Node aus. Wie Sie wissen, sind Normalen immer exakt eine Einheit lang, so dass dadurch generell auf die Berechnung der Vektorlängen und die Division durch deren Produkt verzichtet werden kann.

Bitte beachten Sie hier auch wieder einen nicht definierten Fall. Wenn beide Eingangsvektoren identisch sind, kann keine Berechnung erfolgen.

Trigonometrisch-Node

Dieser Node könnte in gleicher Form wieder durch bereits bekannte Nodes, wie den Formel-Node ersetzt werden. Es handelt sich also eher um eine „Abkürzung“ als um eine neue Funktion. Wie auch in Abbildung 2.104 zu sehen, bietet dieser Node im Attribute-Manager nur die Funktionen an, die wir bereits über Kürzel im Formel-Node benutzen konnten. Hinzu kommt jedoch die Einschränkung, dass die Winkel generell nur in Radians berechnet werden. Dies gilt bei Funktionen, wie Sinus oder Cosinus natürlich auch auf der Eingang-Seite des Nodes. Radians-Winkel basieren auf der Kreiszahl pi. 360° Grad entsprechen dabei dem Wert 2*pi, also ungefähr 6,28. So erkennen Sie in dem ergänzten Beispiel der Abbildung 2.104 z. B., dass der zuvor korrekt mit 90° berechnete Winkel zwischen der Welt-X- und der Welt-Y-Achse zu 1,571 wird.

Animation in Cinema 4D - Trigonometrische Funktionen

Abbildung 2.104: Trigonometrische Funktionen

Diese Problematik zieht sich generell durch XPresso, denn nicht alle Nodes bieten wie der Formel-Node eine Umrechnungsmöglichkeit zwischen den beiden Winkelsystemen an. Sie müssen daher selbst für eine Konsistenz der Winkel in Ihrer Schaltung sorgen. Zu empfehlen wäre, generell mit Radians zu rechnen, denn dieses Format verwendet Cinema 4D auch intern für die Winkel-Mathematik. Zudem wird dieses Format von allen mathematischen Nodes unterstützt.

Vektor zu Matrix-Node

Diese Berechnung haben wir selbst bereits manuell durchgeführt. Denken Sie an das Beispiel der eigenen Ausrichten-Schaltung zurück, die wir bei der Besprechung des Kreuzprodukt-Nodes erstellt hatten. Es gab dort nur eine Richtung als Vorgabe, nämlich den Richtungsvektor von einer zur anderen Position im Raum. So ein Vektor wird hier ebenfalls am Eingang erwartet, wobei dessen Länge hier keine Rolle spielt. Über das Funktion-Menü des Attribute-Managers können Sie dann auswählen, welche Achse der berechneten Matrix dem eingeleiteten Vektor entsprechen soll (siehe Abbildung 2.105). Die fehlenden Achsen werden so ergänzt, dass alle Vektoren rechtwinklig aufeinander stehen und die Einheitslänge haben. Wie bereits in Abbildung 2.105 zu sehen, kann es dabei aber auch zu Fehlern kommen.

Animation in Cinema 4D - Der Vektor zu Matrix-Node

Abbildung 2.105: Der Vektor zu Matrix-Node

Benutzt wurde die Richtung der Welt-Y-Achse als Eingang am Node. Mit der Funktion Y-Achse legen wir in diesem Beispiel fest, dass diese Richtung gleichzeitig der Y-Achse an der berechneten Matrix entsprechen soll. Wir würden also normalerweise eine Matrix mit X- und Z-Achsen erwarten, die deckungsgleich zu den entsprechenden Weltachsen verlaufen. Der Node kommt hier jedoch auf eine negative X-Richtung, spiegelt die Matrix also eigentlich an dessen ZY-Ebene. Ein Blick in den Koordinaten-Manager bestätigt dies, denn dort kann die Größe -1 für die X-Richtung abgelesen werden. Dies mag sicher nur ein Einzelfall sein, blind verlassen darf man sich jedoch auf derartige Berechnungen nie. Die eigene Schaltung mag zwar in der Erstellung aufwändiger sein, wir kennen dann aber deren Macken und Einschränkungen viel genauer.

Hinzu kommt in diesem Fall, dass die Position der berechneten Matrix immer unbesetzt, bzw. auf die Position 0, 0, 0 fixiert bleibt. Durch das Anhängen von Matrix zu Vektoren- und Vektoren zu Matrix-Nodes müsste diese Offset-Information also ggf. noch ergänzt werden.

Winkel-Node

Ich habe nun bereits an verschiedenen Stellen darauf hingewiesen, dass Winkelangaben intern generell in Bogenmaß, also in Radians und somit einem Vielfachen der Kreiszahl pi angegeben werden. Wem es zu lästig ist, selbst die Umrechnung zwischen Grad-Winkeln und Radians-Angaben vorzunehmen, der kann auf diesen Node zurückgreifen. Je nach eingestellter Funktion im Attribute-Manager werden dann Radians in Grad oder Grad in Radians umgerechnet. Die Berechnung sieht ansonsten intern so aus: Grad=180*Radians/pi bzw. Radians=pi*Grad/180.

Ü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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Folgende HTML-Elemente sind erlaubt:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>