Fusion Expression

Natürlich lässt sich alles auch von Hand animieren, aber manches ist doch sehr ungenau und vor allem dauert es auch viel länger als ein simples Script. Scripts haben oft auch den Vorteil, dass sie sich losgelöst von der Timeline verhalten.
Muss also das Timing einer Animation angepasst werden, so können sich Scripte diesem problemlos anpassen und man spart unter Umständen viel Zeit und Nerven.

Im folgenden möchte ich einige Standardszenarien vorstellen, die das Arbeiten erleichtern und oft zum Einsatz kommen.
Ein großer Vorteil in Fusion ist, dass sich die X und Y Maße „prozedural“ verhalten. Das heißt egal wie groß die Auflösung der Arbeitsfläche ist, X bzw. Y ist immer 0.0 bis 1.0. Es kann also jederzeit die Auflösung angepasst werden an den Werten für die Scripts ändert sich jedoch nichts. Einzig bei der „Aspect Ration“ muss aufgepasst werden.

Ein kleines Beispiel:

Möchte man eine quadratische Maske platzieren die sich korrekt zum Seitenverhältnis der Arbeitsfläche (sagen wir 16/9) verhält, wäre die „Expression“ für z.B. die Höhe:

Width*16/9

width*16/9

Da hier die Expression im gleichen Node ausgeführt wird, wie der abzufragende Wert (Width), muss keine Referenzierung zu einem anderen Node angegeben werden.
Möchte man jedoch „Width“ eines fremden Nodes abfragen so muss dieser zusätzlich eingetragen werden:

QuellNode.Width*16/9

Hier kommen wir auch schon zur nächsten Problemstellung. Wir möchten z.B. ein Rectangle (R1) an die gleiche Stelle eines zweiten Rectangles (R2) positionieren und R1 soll dabei R2 folgen können.

Der Parameter den wir hierfür abfragen müssen ist der „Center“. In der Expression würde das nun folgendermaßen aussehen:

QuellNode.Center

Center

Nun fragen wir hier jedoch X und Y gleichzeitig ab und können dadurch die beiden Achsen nicht mehr getrennt ansteuern. Dies wäre jedoch wünschenswert, wenn R1 z.B. in X nicht am Center von R2 heften, sondern einen Versatz haben soll.
Hier würden wir zuerst den eigenen Center (von R1) definieren, das geschieht mit dem Ausdruck „Point“. Soll nun der Center von R1 einen (positiven) Versatz von 0.2 zu dem Center von R2 erhalten, resultiert daraus diese Expression:

Point(R2.Center.X+0.2, R2.Center.Y)

Positionieren eins Punktes in der Mitte zweier weiteren Punkten

Im folgendem Beispiel haben wir drei Rectangles: P1, P2 und PM. PM soll nun immer exakt in der Mitte zwischen P1 und P2 sein.
Benötigen wir kein Versatz in den Achsen, so würde die Center Expression für PM folgendermaßen lauten:

(P1.Center+P2.Center)/2

middle

Vector Math und Bedingungen

Im Folgenden Beispiel wird etwas mehr mit Vektoren, Winkeln und Distanzen gerechnet. Da jedoch, wie vorher erwähnt, unsere Arbeitsfläche in X und in Y immer 1 ist, egal welches Seitenverhältnis wir haben, entstehen dadurch einige Probleme in den Formeln. Das Umrechnen in absolute Werte würde sicher auch funktionieren, jedoch bedeutet das ein Mehraufwand, der nicht wirklich nötig ist. Möchte man zum Schluss ein Seitenverhältnis von z.B. 16/9 haben, so kann man dies genau so gut mit einem Crop erreichen. Also stellen wir als erstes unser Seitenverhältnis der Composite auf 1:1 um. Für dieses Beispiel habe ich den Background auf 768*768 gestellt.
Für die Weite der Rectangles kann nun natürlich auch das „*16/9“ wegfallen, damit man wieder quadratische Formen erhält.

Da wir nun mit PM noch mehr anstellen wollen, positionieren wir das Rectangle nicht mehr mit der einfachen Center Expression, sonder fügen einen Expression- Modifikator ein:

Rechtsklick / Modify With / Expression

Neben dem „Rectangle Tools Control“ erhalten wir nun ein weiteres Menü, das Modifiers Menü.

Modifiers

PM soll nun zusätzlich zur mittleren Positionierung sich auch im Winkel korrekt verhalten. Also wenn P1 zu P2 in Y einen Versatz hat, soll die Neigung von PM gemittelt werden.

winkel

Für diese Berechnung benötigen wir 3 Punkt. Unter „Config“ im Expression Modifikator von PM können wir uns diese Controls einrichten.

config

Number Controls werden nicht benötigt, daher deaktivieren wir diese Controls. Points brauchen wir wie gesagt 3, der Rest kann auch deaktiviert werden.

Drei weil für die Winkelberechnung 3 Koordinaten-Punkte benötigt werden. Der Szenen Nullpunkt ist hier nicht angebracht, da P1 und P2 variabel sind und PM sich zu diesen beiden verhalten soll.

In der Expression Control haben wir nun diese 3 Punkte, denen wir noch ein Verhalten zuweisen müssen. Das geschieht im Tap „Controls“.

control

PointL soll nun am Center von P1 hängen, PointR am Center von P2 und PointC kann selbst definiert werden, bzw. mit einem weiteren Expression Modifikator die gleiche Distanz zu P1 wie P2 erhalten.

Wie erwähnt werden für die Winkelberechnung 3 Punkte benötigt, die ein Dreieck bilden. Da PointL und PointR nun variabel sind, muss PointC auch variabel sein und sich zu den beiden anderen Punkten korrekt verhalten. Am einfachsten geschieht dies in dem Y an P1 gehängt wird und X einen Versatz zu P1 erhält.
Würde man mit einem Kreisbogen rechnen wollen, so müsste PointC die gleiche Distanz wie P2 zu P1 erhalten. Das könnte man erreichen in dem PointC mit der Expression:

p1x+dist(p1x,p1y,p2x,p2y)

gefüllt werden würde.

Um jetzt PM wieder in die Mitte der beiden Punkte P1 und P2 zu bekommen, müssen wir „Point Out“ für X und Y definieren.

point out

Ähnlich wie bei der CenterExpression geschieht dies wieder mit (Position 1 + Position 2) / 2. Hier nur für X und Y getrennt:

(p1x+p2x)/2
(p1y+p2y)/2

Für die korrekte Neigung von PM benötigen wir nun noch eine „Number Out“ Expression.

number aut

Diese Number Out Expression connecten wir anschließend in den Angel des Rectangles PM:

Rechtsklick auf Angle / Connect to / Expression* on RecMiddle: Center / Number Result

Wie kommt nun diese Number Out Expression zustande?

Um den Winkel der 3 Punkte zu bestimmen benötigen wir folgende Vektor Formel:

formel

ax steht hier für den Vektor zwischen p1x und p2x, also p2x-p1x, für ay das gleiche in der Y Achse, also p2y-p1y.
Für bx und by gilt das selbige, p3x-p1x bzw. p3y-p1y. Unter dem Bruchstrich geschieht das gleiche zum Quadrat in der Wurzel. Also erhalten wir für den Winkel folgende Expression:


acos(((p2x-p1x)*(p3x-p1x)+(p2y-p1y)*(p3y-p1y))/(sqrt((p3x-p1x)^2+(p3y-p1y)^2)*sqrt((p2x-p1x)^2+(p2y-p1y)^2)))

„sqrt“ steht hier für Wurzel.

Nun haben wir hier jedoch einen kleinen Denkfehler drin, wir berechnen den Winkel eines Dreiecks, das funktioniert soweit, wie der Winkel nicht mehr als 180° überschreitet. Überschreiten wir 180° bedeutet das, dass wir uns in negativen Koordinaten bewegen. Also ist z.B. P2 in Y unter P1.
In der Expression können wir uns nun damit behelfen, indem wir eine if Abfrage vorhängen. Also:

if (p1y-p2y > 0.0,*,*)

Das heißt soviel wie: Wenn p1y-p2y größer ist als 0 dann mache … und wenn das nicht zutrifft, mache …, also in unserer Expression:

if(p1y-p2y > 0.0,
-acos(((p2x-p1x)*(p3x-p1x)+(p2y-p1y)*(p3y-p1y))/(sqrt((p3x-p1x)^2+(p3y-p1y)^2)*sqrt((p2x-p1x)^2+(p2y-p1y)^2))),
acos(((p2x-p1x)*(p3x-p1x)+(p2y-p1y)*(p3y-p1y))/(sqrt((p3x-p1x)^2+(p3y-p1y)^2)*sqrt((p2x-p1x)^2+(p2y-p1y)^2))))

Trifft hier der erste Fall ein wird unsere Formel umgedreht, also bewegen wir uns zwischen -180° und 0° und wenn der 2. Fall eintrifft bewegen wir uns im positiven Rahmen zwischen 0° und 180°.

winkel2

Quellen:

Custom Tool

Winkel-zwischen-Vektoren

Schreibe einen Kommentar

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