bounce 表达式系列
惯性 bounce 表达式
这个反弹表达式允许在你的层位置有一个弹性的感觉,
效果图
表达式
amp = .1;
freq = 2.0;
decay = 2.0;
n = 0;
if (numKeys > 0) {
n = nearestKey(time).index;
if (key(n).time > time) {
n--;
}
}
if (n == 0) {
t = 0;
} else {
t = time - key(n).time;
}
if (n > 0 && t < 1) {
v = velocityAtTime(key(n).time - thisComp.frameDuration / 10);
value + v * amp * Math.sin(freq * t * 2 * Math.PI) / Math.exp(decay * t);
} else { value }
缩放 bounce 表达式
这是一个超级酷的表达方式,可以让你的图层像果冻或明胶一样弹跳。
效果图
表达式
timeToStart = .5;
if (time > timeToStart) {
maxDev = 30; // max deviation in pixels
spd = 30; //speed of oscillation
decay = 1.0; //how fast it slows down
t = time - inPoint;
x = scale[0] + maxDev * Math.sin(spd * t) / Math.exp(decay * t);
y = scale[0] * scale[1] / x;
[x, y]
}
else {
value;
}
皮球 bounce 表达式
这里有一个美丽的表达,模仿球弹跳与重力和弹性选项。
效果图
表达式
e = .7; //elasticity
g = 5000; //gravity
nMax = 9; //number of bounces allowed
n = 0;
if (numKeys > 0) {
n = nearestKey(time).index;
if (key(n).time > time) n--;
}
if (n > 0) {
t = time - key(n).time;
v = -velocityAtTime(key(n).time - .001) * e;
vl = length(v);
if (value instanceof Array) {
vu = (vl > 0) ? normalize(v) : [0, 0, 0];
} else {
vu = (v < 0) ? -1 : 1;
}
tCur = 0;
segDur = 2 * vl / g;
tNext = segDur;
nb = 1; // number of bounces
while (tNext < t && nb <= nMax) {
vl *= e;
segDur *= e;
tCur = tNext;
tNext += segDur;
nb++
}
if (nb <= nMax) {
delta = t - tCur;
value + vu * delta * (vl - g * delta / 2);
} else {
value
}
} else
value
旋转 bounce 表达式
制作 2 个关键帧并应用这个旋转反弹表达式。
效果图
表达式
e = .5; //elasticity
g = 1000; //gravity
nMax = 5; //number of bounces allowed
n = 0;
if (numKeys > 0) {
n = nearestKey(time).index;
if (key(n).time > time) n--;
}
if (n > 0) {
t = time - key(n).time;
v = -velocityAtTime(key(n).time - .001) * e;
vl = length(v);
if (value instanceof Array) {
vu = (vl > 0) ? normalize(v) : [0, 0, 0];
} else {
vu = (v < 0) ? -1 : 1;
}
tCur = 0;
segDur = 2 * vl / g;
tNext = segDur;
nb = 1; // number of bounces
while (tNext < t && nb <= nMax) {
vl *= e;
segDur *= e;
tCur = tNext;
tNext += segDur;
nb++
}
if (nb <= nMax) {
delta = t - tCur;
value + vu * delta * (vl - g * delta / 2);
} else {
value
}
} else
value
文字 bounce 表达式
通过使用效果控制窗口中的滑块控件,您可以轻松地改变弹跳频率,弹跳字符延迟,弹跳衰减和弹跳开始。见下面的截图
效果图
表达式
f = effect("Bounce Frequency")(1);
// 0 means start at bottom, 1 means start at stop
phase_start = effect("Bounce Start")(1) / 100;
character_delay_param = effect("Bounce Per-Character Delay")(1).value;
character_delay_index = textIndex - 1;
if (character_delay_param < 0) {
character_delay_param = -character_delay_param;
character_delay_index = (textTotal - textIndex);
}
character_delay = character_delay_param * character_delay_index;
t = time * f - character_delay;
if (t < 0) {
t = 0;
}
t += phase_start;
w = 2;
bounce_num = Math.floor(t / w);
t = t % w;
y = t * (w - t);
decay = effect("Bounce Decay")(1) / 100;
h = Math.pow(decay, bounce_num);
-h + h * y * selectorValue
闪烁表达式
在你的图层不透明度应用这个脚本使它闪烁,如果你想让它闪烁得更快,你也可以自定义速度。
效果图
表达式
blinkSpeed=15;
n= Math.sin(time*blinkSpeed);
if(n<0) 0 else 100;
文字包围框表达式
下面是在 After Effects 中自动缩放文本框的表达式,这应该会节省你很多时间。
- 第一个表达式应该应用于矩形形状的大小,
- 第二个表达式应该添加到矩形形状的定位点。
效果图
表达式
/* add this expression on the size of your rectangle shape */
box = thisComp.layer("dfd").sourceRectAtTime();
Width = box.width;
Height = box.height;
p = effect("Slider Control")("Slider");
x = Width + p;
y = Height + p;
[x, y]
/* add this expression on the Anchor Point of your rectangle shape */
box = thisComp.layer("dfd").sourceRectAtTime();
Width = box.width;
Height = box.height;
Top = box.top;
Left = box.left;
p = effect("Slider Control")("Slider");
x = Width / -2 - Left;
y = Height / -2 - Top;
[x, y]