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.
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/else
Anweisung, 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.
Benutzer16421