AE實用表達式整理及表達式合集腳本發(fā)布

表達式是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,作者:崔小駿

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容