AEJoy ——表达式代码列表和示例(四)

344 阅读2分钟

bounce 表达式系列

惯性 bounce 表达式

这个反弹表达式允许在你的层位置有一个弹性的感觉,

效果图

text-box-auto-resize-after-effects.gif

表达式

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 表达式

这是一个超级酷的表达方式,可以让你的图层像果冻或明胶一样弹跳。

效果图

text-box-auto-resize-after-effects.gif

表达式

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 表达式

这里有一个美丽的表达,模仿球弹跳与重力和弹性选项。

效果图

text-box-auto-resize-after-effects.gif

表达式

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 个关键帧并应用这个旋转反弹表达式。

效果图

text-box-auto-resize-after-effects.gif

表达式

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 表达式

通过使用效果控制窗口中的滑块控件,您可以轻松地改变弹跳频率,弹跳字符延迟,弹跳衰减和弹跳开始。见下面的截图

image.png

效果图

text-box-auto-resize-after-effects.gif

表达式

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

闪烁表达式

在你的图层不透明度应用这个脚本使它闪烁,如果你想让它闪烁得更快,你也可以自定义速度。

效果图

text-box-auto-resize-after-effects.gif

表达式

blinkSpeed=15;
n= Math.sin(time*blinkSpeed);
if(n<0) 0 else 100;

文字包围框表达式

下面是在 After Effects 中自动缩放文本框的表达式,这应该会节省你很多时间。

  • 第一个表达式应该应用于矩形形状的大小,
  • 第二个表达式应该添加到矩形形状的定位点。

效果图

text-box-auto-resize-after-effects.gif

表达式

/* 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]