表達式是AE中非常好用的工具,它可以幫助我們節(jié)省大量的制作時間。如果你對表達式掌握的比較好,那么很多看似復雜、繁瑣的效果,利用表達式都可以輕松的實現(xiàn)。
但是表達式的學習是有一定門檻的,簡單的運用還好,一旦涉及到復雜點的運用,就對數(shù)學能力、邏輯能力有一定的要求了。
為此,我整理了一些工作中常用、實用的表達式效果。無需理解背后的語義,只要直接套用即可。并且已經將它們集成進了我編寫的“常用表達式合集”腳本中,可以一鍵添加,文后也會將此腳本分享給大家。
1.抖動
Wiggle表達式,能夠實現(xiàn)隨機的位移旋轉縮放、透明度閃爍等效果。


表達式語句:
Wiggle(3,50);
前面的數(shù)字3代表抖動的頻率,也就是抖動的快慢;后面的數(shù)字50代表抖動的振幅,也就是抖動的幅度大小。通過調整這兩個數(shù)值來控制抖動效果。
2.?分向抖動
Wiggle表達式更高級的運用,在不同的方向使用不同的抖動強度,也可以制作只在一個方向進行抖動的效果。
表達式語句:
a=wiggle(3,50)[0]; //控制x方向的抖動
b=wiggle(0,0)[1]; //控制y方向的抖動
[a,b];


3.?時間
Time表達式,常用于制作持續(xù)旋轉的效果。
表達式語句:
value+time*100; //后面的數(shù)值用來控制速度的快慢
對表達式有一定基礎的同學可能會直接寫成:
time*100;
這里多寫了一個value,而value代表屬性的原始數(shù)值,這里加上value是為了能夠調整旋轉的初始角度,增強可控性。

4.?循環(huán)
loopOut表達式,使關鍵幀動畫循環(huán),常用的有三種模式:
第一種,cycle模式
表達式語句:
loopOut(type = "cycle", numKeyframes = 0);//后面的數(shù)值0用來控制從第幾幀開始循環(huán)
?
將關鍵幀動畫重復進行的循環(huán)效果
比如你有關鍵幀1、2、3,這種循環(huán)模式就是1、2、3、1、2、3、1、2、3.....一直循環(huán)下去

第二種,pingPong模式
表達式語句:
loopOut(type = "pingPong", numKeyframes = 0);//后面的數(shù)值0用來控制從第幾幀開始循環(huán)
像乒乓球一樣來回往復循環(huán)
同樣,如果你有關鍵幀1、2、3,那么這種循環(huán)模式就是按1、2、3、3、2、1、1、2、3.....這種規(guī)律循環(huán)下去

第三種,continue模式
表達式語句:
loopOut(type="continue")
?
沿著最后一幀的方向和運動速度繼續(xù)運動下去
這種模式相比前兩種用的較少,可以便于制作動畫持續(xù)緩慢運動的效果,避免動畫靜止,也可以制作一些數(shù)字持續(xù)增長等效果

5.循環(huán)旋轉
一想到要做一個持續(xù)旋轉的動畫,可能我們會直接加上一個time表達式。
但是如果這個旋轉動畫需要能夠無限循環(huán)進行,就需要保證一個循環(huán)內轉360度的倍數(shù)才行,那么就不是簡單一個time能搞定了。要么得去計算下time后需要乘的數(shù)值,要么得手動K幀,總之是有些麻煩的。

為了解決此問題,我自己編寫了一個表達式:
表達式語句:
cycle=360; ?//循環(huán)周期
n=1; ?//轉速(需為整數(shù))
cycle*n/thisComp.duration*time
簡單解釋下兩個可以調的數(shù)值:
循環(huán)周期,默認是360度,但是不同的圖形循環(huán)周期可能有所區(qū)別,比如一個正方形旋轉90度就能形成循環(huán),而一個正五角形的循環(huán)周期是旋轉360÷5 =72度

第二個值很好理解,代表轉速,值越大,轉的越快。

6.路徑循環(huán)
有時候我們需要做mask變形動畫的循環(huán),但是你會發(fā)現(xiàn)直接給mask path屬性加循環(huán)表達式是不起作用的。
而利用下面這個表達式就能夠解決這個問題
表達式語句:
valueAtTime(time%key(numKeys).time)

對于mask路徑和形狀層路徑均有效哦。
該表達式的原理是利用valueAtTime表達式讀取關鍵幀數(shù)據,并通過數(shù)學計算使關鍵幀數(shù)據在時間線上重復。(所以有趣的是,其實你把它加給任何其他屬性都能夠產生cycle模式的循環(huán)。)
7.隨機循環(huán)
讓隨機抖動的效果能夠形成循環(huán)
表達式語句:
freq = 3; // 頻率
amp = 100; // 幅度
loopTime =3; // 循環(huán)時間,單位為秒
t = time % loopTime;
wiggle1 = wiggle(freq, amp, 1, 0.5, t);
wiggle2 = wiggle(freq, amp, 1, 0.5, t - loopTime);
linear(t, 0, loopTime, wiggle1, wiggle2)

對于做一些元素隨機晃動之類的GIF循環(huán)動畫非常好用!
8.彈性
萬能彈性表達式,給動畫添加彈性抖動效果

表達式語句:
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){
?v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
?value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
???}
else{value}
?
這個表達式看起來很復雜,但是沒關系,咱們只要會復制粘貼就好。
其中有三個關鍵的數(shù)值用來控制彈性的效果,需要根據自己需要的效果來調整。
amp,即振幅,用來控制彈性的幅度大小。
freq,頻率,用來控制彈性抖動的快慢。
decay,阻力,也叫衰減、阻尼等,這個值越大,則彈性效果能夠越快停下來。
9.回彈
跟上面的彈性表達式很類似,它能夠制作物體撞擊墻壁或地面產生的回彈反彈效果

表達式語句:
e =0.7;//彈力
g =1000;//重力
nMax = 9;//最大彈跳次數(shù)
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
?
同樣,這兒有三個關鍵數(shù)值用來控制彈性的效果,
彈力,這個值越高,則跳起的越高
重力,這個值越大,則彈的越快,同時停止的也越快
最大彈跳次數(shù),字面意思,用來控制彈跳的次數(shù),值越大,效果越細膩
這里的彈力和重力都是物理名詞,這個效果也是模擬真實物理現(xiàn)象的,所以需要結合下物理知識來理解。
10.數(shù)字增長
MG動畫中數(shù)字增長效果很常見,一般可以用Numbers特效去制作,但是它有一個很大的限制,就是數(shù)值最大只能達到30000。

還有一個方法是用文字層連接滑塊控制器,但是最大也只能到一百萬

而利用這組表達式就可以輕松解決數(shù)字增長的動畫問題:

表達式很長,就不粘貼了,同時需要配合表達式控件來使用。(但是不用擔心,后面使用我的腳本就可以直接一鍵添加這個效果,不需要自己復制噠~)

這組表達式是我在網上找到的一個表達式的基礎上改進的,增加了制作隨機數(shù)字的效果。
來看一下表達式控件的可控參數(shù):

數(shù)值,最基礎的參數(shù),通過給它打關鍵幀就可以制作數(shù)字增長的效果。
倍率,讓數(shù)字大小突破一百萬限制的關鍵,原理很簡單:在上面的數(shù)值的基礎上再乘以一個數(shù),這樣就能突破一百萬大小了。當大小不夠用時,就使用它吧!(所以借助數(shù)值和倍率相乘,數(shù)值最大能夠達到一百萬乘一百萬,應該足夠滿足你的需求了。)
小數(shù)點位數(shù),控制小數(shù)點后面的位數(shù)。
逗號,勾選此選項,可以讓數(shù)字以每三位數(shù)一個逗號的格式呈現(xiàn):

數(shù)字隨機,勾選此選項,可以制作數(shù)字隨機跳動的效果,而不再是按順序增長。
隨機范圍,與上面的數(shù)字隨機配合使用,控制數(shù)字隨機的范圍大小。(最終數(shù)字跳動的范圍就是:數(shù)值±隨機范圍。)

11.3D坐標轉2D坐標
toComp表達式,可以將三維坐標轉換為二維坐標。(聽起來像是三體中的降維打擊( ̄▽ ̄)")
用到的機會不多,但是一旦需要用到它的時候,你就會后悔自己沒有早點認識這個表達式。
它可以用來將一些二維的特效做成三維的效果,還可以給二維層做出三維空間感的運動效果。
表達式語句:
thisComp.layer('三維層名字').toComp([0,0,0]); ?//加給二維坐標,后面的數(shù)值[0,0,0]用來調整位置的偏移

給二維層的位置加上此表達式,就能讓二維層位置匹配上三維層的空間位置。
下面再來看個效果:

此效果是使用Beam(光束)特效結合toComp表達式制作的。
制作思路是,先用空物體在三維空間擺出角錐的五個頂點,然后利用beam特效讓這些頂點間產生連線,但是beam是一個二維特效,無法直接跟蹤三維的點,這時候就可以利用toComp表達式將三維坐標轉為對應的平面二維坐標。

12.目標
lookAt表達式,使圖層的方向始終朝向一個目標圖層,對于二維層和三維層均有效。
表達式語句:
(對于二維層,加給rotation[旋轉]屬性)
function lookAtMe(fromPt, toPt){
????lkAt = lookAt(fromPt, toPt);
????if (toPt[1] > fromPt[1]){
????????return 180-lkAt[1];
????} else {
????????return lkAt[1];
????}
}
p0= transform.position;
p1=thisComp.layer("目標層").transform.position; //設置目標層名
?lookAtMe(p0, p1)+value //改變旋轉值可調整角度
(對于三維層,加給orientation [角度] 屬性)
p0=transform.position;
p1=thisComp.layer("目標層").transform.position; //設置目標層名
lookAt(p0,p1)

最后就是福利放送時間了。
我已經將以上表達式都集成進了我編寫的”常用表達式合集”腳本中,在此分享給大家。
使用此腳本就可以一鍵添加以上表達式,且能夠同時選擇多個圖層批量添加。
表達式中需要調整的參數(shù)都添加了表達式控件,無需進入表達式中修改,直接選擇對應的滑塊參數(shù)調整即可

腳本操作演示:



腳本的代碼部分也開源共享,不做加密處理了,分享給對寫腳本感興趣的盆友。

以上內容只是個人收藏使用,非本人原創(chuàng),原創(chuàng)地址:https://www.zcool.com.cn/article/ZMTA4MjA5Mg==.html,作者:崔小駿