After Effects: Linear Expression – Gehen Sie von Wert 1 zu einem anderen Wert und dann zurück zu Wert 1

Im Wesentlichen versuche ich, einen Positionsausdruck auf einer Videoebene (zweidimensional) zu bekommen, um von 640, 360 (Mitte des Bildschirms) zu einem anderen Wert zu gehen, der durch eine Ausdruckssteuerung definiert wird, und dann zurück zu 640, 360. Um die Dauer von zu definieren Für diesen Effekt habe ich Platzhalter-Kontrollkästchen (Start, Mitte und Ende) verwendet, um ziehbare Keyframes zu erstellen, die die Start- und Endpunkte markieren. Ich weiß, dass dies eine seltsame Art ist, die Start- und Endpunkte des Effekts zu definieren, aber für das, was ich mache, funktioniert es gut.

Aktueller Code:

start = effect("Start (use keyframe)")("Checkbox");
end = effect("End (use keyframe)")("Checkbox");
mid = effect("Middle (use keyframe)")("Checkbox");

if (start.numKeys > 0){
start1 = start.key(start.numKeys).time
}
else{
start1 = 0;
}

if (end.numKeys > 0){
end1 = end.key(end.numKeys).time;
}
else{
end1 = 0;
}

if (mid.numKeys > 0){
mid1 = mid.key(mid.numKeys).time;
}
else{
mid1 = 0;
}

[linear(time, start1, mid1, 640, effect("End Position")("Point")[0]), linear(time, start1, mid1, 360, effect("End Position")("Point")[1])];

[linear(time, mid1, end1, effect("End Position")("Point")[0], 640), linear(time, mid1, end1, effect("End Position")("Point")[1], 360)];

Hinweis: Der Code hat ohne die mittlere Variable und den zweiten linearen Ausdruck gut funktioniert, aber er geht nicht von 640, 360 zu x, y und dann zurück zu 640, 360. Er geht nur von 640, 360 zu x, y und dann aufhören.

Ich habe auch versucht, die Funktion loopOut("pingpong") zu verwenden, aber sie bricht den gesamten Ausdruck.

Antworten (1)

Gibt es einen Grund, warum Sie diesen Ansatz verwenden? Es gibt viel einfachere Möglichkeiten, dies zu tun (siehe unten).

Das Problem besteht jedoch darin, dass sowohl die vorletzte als auch die letzte Zeile Werte zurückgeben, ein Ausdruck jedoch nur einen Satz von Werten zurückgeben kann und daher nur den letzten zurückgibt. Ich denke, dies deutet auf ein Missverständnis der Funktionsweise von Ausdrücken hin. Für jeden Frame wird ein Ausdruck berechnet*; es hat keine Erinnerung an das, was vorher passiert ist oder was später passieren wird. Ihr Ausdruck muss also ein Ergebnis für einen bestimmten Zeitpunkt zurückgeben, und das Ergebnis wird aus dem Wert berechnet, den er zu diesem Zeitpunkt zurückgibt.

Sie brauchen dort eine Flusskontrolle. Verwenden Sie eine if/elseAnweisung, um die letzten beiden Zeilen zu ersetzen:

if (time < mid1){
    [linear(time, start1, mid1, 640, effect("End Position")("Point")[0]), linear(time, start1, mid1, 360, effect("End Position")("Point")[1])];
}else{
    [linear(time, mid1, end1, effect("End Position")("Point")[0], 640), linear(time, mid1, end1, effect("End Position")("Point")[1], 360)];
}

Aber Sie können Ihr Leben viel einfacher machen. Warum nicht einen Schieberegler haben, der einen Bereich von 0 bis 100 hat, der definiert, in welchem ​​​​Prozentsatz der Entfernung entlang des Pfads sich das Objekt befinden sollte. Dann stellst du es einfach per Keyframe ein, um von 0-100 und wieder zurück zu laufen. Der ganze Ausdruck wäre einfach:

rampCtrl=effect("the Effect That Controls How Far Along It is")("slider");
linear(rampCtrl, 0, 100, [640,360], effect("End Position")("Point"))

Beachten Sie, dass Sie es nicht in zwei Teile aufteilen müssen, die linear()Funktion kann mit Vektoren als Eingaben für Wert1 und Wert2 umgehen.


*(Sie können sich Ausdrücke so vorstellen, dass sie für jeden Frame berechnet werden, aber sie werden tatsächlich jedes Mal berechnet, wenn die Komposition gerendert wird. Wenn Sie die Bewegungsunschärfe aktiviert haben, besteht der Frame aus zahlreichen Zeitabschnitten zu Subframe-Zeitpunkten, die zusammengemischt werden , und der Ausdruck wird für jeden dieser Zeitabschnitte berechnet. Im Allgemeinen können Sie dies ignorieren, aber es wirkt sich auf die Rendergeschwindigkeit aus, wenn Ihre Berechnung sehr zeitaufwändig ist, und es kann zu Verwirrung führen, wenn Ihr Ausdruck unerwartete Ergebnisse zwischen Frames zurückgibt, z zwischen zwei Frames auf einen ursprünglichen Wert zurück)

Vielen Dank für die Hilfe. Ich habe erst seit ungefähr einer Woche mit Ausdrücken herumgespielt, aber jetzt verstehe ich besser, wie die Ausdruckslogik funktioniert. Ich werde auch versuchen, Ihre Version zu verwenden und sehen, ob sie es für mich einfacher macht.