快速出效果!10條有趣又實用的AE表達(dá)式

表達(dá)式是使用 Extendscript 或 Javascript 語言來控制 AE 圖層屬性(位置、縮放、旋轉(zhuǎn)、不透明度)的一種編程語言,慶幸的是不用真的精通編程,大部分的表達(dá)式用的時候只需修改幾個簡單的參數(shù),就可實現(xiàn)復(fù)雜的效果。每一種表達(dá)式都是節(jié)省時間,簡化工作的好幫手。

表達(dá)式用法很簡單,按下 alt/option 鍵,鼠標(biāo)點擊圖層屬性前面的“小碼表”,然后把代碼添加到時間軸里的文本區(qū)就可以了。

廢話少說,來介紹 10 個常用的 Ae 表達(dá)式及其用法,建議收藏。

time

常用在旋轉(zhuǎn)屬性上,代碼:time*value

value 是數(shù)值,用在元素的不透明度上,就是由透明到不透明的變化。

例如:time*15,意思就是每秒以 15%的透明度一直到 100%不透明。用在旋轉(zhuǎn)屬性上,就是每秒以 15°的角度進(jìn)行順時針旋轉(zhuǎn),如果是-15,就是逆時針旋轉(zhuǎn)。

快速出效果!10條有趣又實用的AE表達(dá)式

其實 time 屬性也是可以用在位置屬性上的,只不過要先把“位置”屬性先拆分成 X、Y 兩個單獨的坐標(biāo)才可以。

接著我們來看下和 time 相關(guān)的函數(shù)表達(dá)式

正弦函數(shù) sin

代碼:Math.sin(time*value1)* value2

與 time 不同的是,它多了一個旋轉(zhuǎn)的頻率。

value1=頻率值;value2=幅度值

快速出效果!10條有趣又實用的AE表達(dá)式

例如把這行代碼 Math.sin(time*2)* 30 加在旋轉(zhuǎn)屬性上,就是以 30°的角度來回旋轉(zhuǎn) 2 次,可以代替手動 K 幀的繁瑣。

快速出效果!10條有趣又實用的AE表達(dá)式

那怎樣讓旋轉(zhuǎn)的物體停下來呢?需要在這行正弦函數(shù)后面加上一行指數(shù)函數(shù):

Math.sin(time* value1)* value2/Math.exp(time* value)

函數(shù) exp 里面的 time 值越大,就越快停下來。

wiggle 抖動

最常用的“喂狗”表達(dá)式,一般用在“位置”屬性上,簡單寫法為:wiggle(value1, value2)。

value1 為每秒抖動的次數(shù),value2 為每次隨機(jī)波動的幅度。

例如:wiggle(5,20),意思每秒抖動 5 下,每次波動的幅度為 20。

快速出效果!10條有趣又實用的AE表達(dá)式

更完整的寫法是:

wiggle(freq, amp, octaves = 1, amp_mult = 0.5, t = time)

freq=頻率(設(shè)置每秒抖動的頻率);amp=振幅(每次抖動的幅度);octaves=振幅幅度(在每次振幅的基礎(chǔ)上還會進(jìn)行一定的震幅幅度,很少用);amp_mult=頻率倍頻(默認(rèn)數(shù)值即可,數(shù)值越接近 0,細(xì)節(jié)越少;越接近 1,細(xì)節(jié)越多);t=持續(xù)時間(抖動時間為合成時間,一般無需修改);一般只寫前兩個數(shù)值即可。

index

可以理解為規(guī)律復(fù)制表達(dá)式,代碼:index*value

例如把 index*15 添加在圖層的“旋轉(zhuǎn)”屬性上,則第一個圖層會旋轉(zhuǎn) 15 度,之后按 Ctrl+D 去復(fù)制圖層時,第 2 個圖層將旋轉(zhuǎn) 30 度,第三個圖層 45 度,以此類推......

快速出效果!10條有趣又實用的AE表達(dá)式

若想第一層圖形不產(chǎn)生旋轉(zhuǎn)保持正常形態(tài),復(fù)制后的圖形以 15 度遞增,表達(dá)式這樣寫:(index-1)*15,“-1”就是減去第一個圖層后其他所有圖層以 15°旋轉(zhuǎn)復(fù)制。

time 計時

常用于隨便變化的數(shù)字或倒計時:time.toFixed(2)

括弧里的數(shù)字 2 代表小數(shù)點后兩位,所以 0 就是整數(shù)變化。

快速出效果!10條有趣又實用的AE表達(dá)式

數(shù)字倒計時:Math.floor(value-time),value 代表從幾開始,如:“20-time”,就是從 20 開始倒計時。

random 隨機(jī)

數(shù)值變化表達(dá)式,所以經(jīng)常用在數(shù)字上,當(dāng)然也可以用在“不透明度”和“縮放”屬性上。代碼:random(min,max)。

min 是最小值,max 最大值

快速出效果!10條有趣又實用的AE表達(dá)式

例如:random(1,100),數(shù)字就會在 1-100 間隨機(jī)變化,它會帶 X.xxxxxxxxxx 這樣的小數(shù)位,如果不想要小數(shù)點后面的尾巴,可以這樣寫:

X=random(1,100)
Math.round(X)

快速出效果!10條有趣又實用的AE表達(dá)式

“X”是你自定義的名字,意思就是給這個“X”規(guī)定,讓它只能在 1-100 之間整數(shù)變化。這個效果可用在抽獎游戲里的隨機(jī)數(shù)字。

運(yùn)動脫尾

物體運(yùn)動時,有類似殘影的效果,代碼如下:

delay = 5; //number of frames to delay(延遲的距離)
d = delay*thisComp.frameDuration*(index - 1);
thisComp.layer(1).position.valueAtTime(time - d)

把上述代碼添加到運(yùn)動圖層的位置屬性里,然后多復(fù)制幾個圖層。

快速出效果!10條有趣又實用的AE表達(dá)式

如想要實現(xiàn)不透明度拖尾,就需要為元素的不透明度屬性添加表達(dá)式:

opacityFactor = .75;//不透明度值
Math.pow(opacityFactor,index - 1)*100

萬能彈性表達(dá)式

彈性表達(dá)式有兩個,Overshoot 和 Bounce。可以輕而易舉地實現(xiàn)各種彈性動畫,如抖動、彈跳動畫等。

Keyframe Overshoot

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}

*amp 表示振幅,freq 表示頻率,decay 表示衰減(根據(jù)不同需求做不同的調(diào)整)

快速出效果!10條有趣又實用的AE表達(dá)式

Keyframe Bounce Back

e = .7;
g = 5000;
nMax = 9;
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

*e 表示衰減,g 表示重力,nMax 表示彈跳最大值(根據(jù)不同需求做不同的調(diào)整)

loopOut 循環(huán)

較常用的循環(huán)表達(dá)式,常用的類型有“pingpong”和“cycle”,詳細(xì)規(guī)則如下:

  • loopOut(type=“類型”,numkeyframes=0):對一組動作進(jìn)行循環(huán)
  • loopOut(type="pingpong",numkeyframes=0):是類似像乒乓球一樣的來回循環(huán);
  • loopOut(type="cycle",numkeyframes=0):是周而復(fù)始的循環(huán);
  • loopOut(type="continue"):延續(xù)屬性變化的最后速度,
  • loopOut(type="offset",numkeyframes=0):是重復(fù)指定的時間段進(jìn)行循環(huán);
  • numkeyframes=0 是循環(huán)的次數(shù),0 為無限循環(huán),1 是最后兩個關(guān)鍵幀無限循環(huán),2 是最后三個關(guān)鍵幀無限循環(huán)

與 loopOut 相對應(yīng)的是 loopIn,如果說 loopOut 是在最后一個關(guān)鍵幀之后循環(huán),那 loopIn 就是在最后一個關(guān)鍵幀之前做循環(huán)。

快速出效果!10條有趣又實用的AE表達(dá)式

loopOutduration 和 loopInduration

這兩個里面都有一個“duration”:

duration = 0 時候一切遵循以上 Out 和 In 的基本解釋。

duration = 1,這里分為兩種:

第一種,loopInDuration(type = "cycle", duration = 1)

duration = 1 表示循環(huán)該套動作的前 1 秒內(nèi)(綠色框內(nèi) 2s-3s)的動作。

快速出效果!10條有趣又實用的AE表達(dá)式

第二種,loopOutDuration(type = "cycle", duration = 1)

duration = 1 表示循環(huán)該套動作的最后 1 秒內(nèi)(綠色框內(nèi) 3s-4s)的動作。

快速出效果!10條有趣又實用的AE表達(dá)式

linear 線性函數(shù)

控制器動畫,很適合用在一些需要多維聯(lián)動的動效里。

代碼:linear(t,tMin,tMax,value1,value2)

t=某屬性(位置、縮放、不透明度...)線性變化值(tmin 最小,tmax 最大)

value1,value2 代表給當(dāng)前添加表達(dá)式的參數(shù)的一維變化。

快速出效果!10條有趣又實用的AE表達(dá)式

如何產(chǎn)生聯(lián)動呢?

t=(拖動螺旋線指向你想要綁定的那個圖層的某個屬性,比如 x/y 某一個方向的值)

但是這個只適用于一維上的某一個值,如果同時應(yīng)用,比如等比縮放屬性上怎么辦呢?

在 linear 前面加定義的名字,以“縮放”為例:

t=(你想要綁定的那個圖層的某個屬性)
kuan=linear(t,tMin,tMax,value1,value2);
gao=linear(t,tMin,tMax,value1,value2);
[kuan,gao]

以上就是本文要介紹的 10 個常用表達(dá)式,當(dāng)然還有更多,當(dāng)你掌握越多的“語法”就越能理解其中的奧秘。甚至可以嘗試自己編寫更實用的表達(dá)式,隨時調(diào)用省時省力。

更多表達(dá)式教程:

歡迎關(guān)注作者微信公眾號:「印跡拾光」

快速出效果!10條有趣又實用的AE表達(dá)式

收藏 512
點贊 68

復(fù)制本文鏈接 文章為作者獨立觀點不代表優(yōu)設(shè)網(wǎng)立場,未經(jīng)允許不得轉(zhuǎn)載。