表達(dá)式是使用 Extendscript 或 Javascript 語言來控制 AE 圖層屬性(位置、縮放、旋轉(zhuǎn)、不透明度)的一種編程語言,慶幸的是不用真的精通編程,大部分的表達(dá)式用的時候只需修改幾個簡單的參數(shù),就可實現(xiàn)復(fù)雜的效果。每一種表達(dá)式都是節(jié)省時間,簡化工作的好幫手。
表達(dá)式用法很簡單,按下 alt/option 鍵,鼠標(biāo)點擊圖層屬性前面的“小碼表”,然后把代碼添加到時間軸里的文本區(qū)就可以了。
廢話少說,來介紹 10 個常用的 Ae 表達(dá)式及其用法,建議收藏。
常用在旋轉(zhuǎn)屬性上,代碼:time*value
value 是數(shù)值,用在元素的不透明度上,就是由透明到不透明的變化。
例如:time*15,意思就是每秒以 15%的透明度一直到 100%不透明。用在旋轉(zhuǎn)屬性上,就是每秒以 15°的角度進(jìn)行順時針旋轉(zhuǎn),如果是-15,就是逆時針旋轉(zhuǎn)。
其實 time 屬性也是可以用在位置屬性上的,只不過要先把“位置”屬性先拆分成 X、Y 兩個單獨的坐標(biāo)才可以。
接著我們來看下和 time 相關(guān)的函數(shù)表達(dá)式
代碼:Math.sin(time*value1)* value2
與 time 不同的是,它多了一個旋轉(zhuǎn)的頻率。
value1=頻率值;value2=幅度值
例如把這行代碼 Math.sin(time*2)* 30 加在旋轉(zhuǎn)屬性上,就是以 30°的角度來回旋轉(zhuǎn) 2 次,可以代替手動 K 幀的繁瑣。
那怎樣讓旋轉(zhuǎn)的物體停下來呢?需要在這行正弦函數(shù)后面加上一行指數(shù)函數(shù):
Math.sin(time* value1)* value2/Math.exp(time* value)
函數(shù) exp 里面的 time 值越大,就越快停下來。
最常用的“喂狗”表達(dá)式,一般用在“位置”屬性上,簡單寫法為:wiggle(value1, value2)。
value1 為每秒抖動的次數(shù),value2 為每次隨機(jī)波動的幅度。
例如:wiggle(5,20),意思每秒抖動 5 下,每次波動的幅度為 20。
更完整的寫法是:
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ù)值即可。
可以理解為規(guī)律復(fù)制表達(dá)式,代碼:index*value
例如把 index*15 添加在圖層的“旋轉(zhuǎn)”屬性上,則第一個圖層會旋轉(zhuǎn) 15 度,之后按 Ctrl+D 去復(fù)制圖層時,第 2 個圖層將旋轉(zhuǎn) 30 度,第三個圖層 45 度,以此類推......
若想第一層圖形不產(chǎn)生旋轉(zhuǎn)保持正常形態(tài),復(fù)制后的圖形以 15 度遞增,表達(dá)式這樣寫:(index-1)*15,“-1”就是減去第一個圖層后其他所有圖層以 15°旋轉(zhuǎn)復(fù)制。
常用于隨便變化的數(shù)字或倒計時:time.toFixed(2)
括弧里的數(shù)字 2 代表小數(shù)點后兩位,所以 0 就是整數(shù)變化。
數(shù)字倒計時:Math.floor(value-time),value 代表從幾開始,如:“20-time”,就是從 20 開始倒計時。
數(shù)值變化表達(dá)式,所以經(jīng)常用在數(shù)字上,當(dāng)然也可以用在“不透明度”和“縮放”屬性上。代碼:random(min,max)。
min 是最小值,max 最大值
例如:random(1,100),數(shù)字就會在 1-100 間隨機(jī)變化,它會帶 X.xxxxxxxxxx 這樣的小數(shù)位,如果不想要小數(shù)點后面的尾巴,可以這樣寫:
X=random(1,100)
Math.round(X)
“X”是你自定義的名字,意思就是給這個“X”規(guī)定,讓它只能在 1-100 之間整數(shù)變化。這個效果可用在抽獎游戲里的隨機(jī)數(shù)字。
物體運(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ù)制幾個圖層。
如想要實現(xiàn)不透明度拖尾,就需要為元素的不透明度屬性添加表達(dá)式:
opacityFactor = .75;//不透明度值 Math.pow(opacityFactor,index - 1)*100
彈性表達(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)整)
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)整)
較常用的循環(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)。
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)的動作。
第二種,loopOutDuration(type = "cycle", duration = 1)
duration = 1 表示循環(huán)該套動作的最后 1 秒內(nèi)(綠色框內(nèi) 3s-4s)的動作。
控制器動畫,很適合用在一些需要多維聯(lián)動的動效里。
代碼:linear(t,tMin,tMax,value1,value2)
t=某屬性(位置、縮放、不透明度...)線性變化值(tmin 最小,tmax 最大)
value1,value2 代表給當(dāng)前添加表達(dá)式的參數(shù)的一維變化。
如何產(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)注作者微信公眾號:「印跡拾光」
復(fù)制本文鏈接 文章為作者獨立觀點不代表優(yōu)設(shè)網(wǎng)立場,未經(jīng)允許不得轉(zhuǎn)載。
發(fā)評論!每天贏獎品
點擊 登錄 后,在評論區(qū)留言,系統(tǒng)會隨機(jī)派送獎品
2012年成立至今,是國內(nèi)備受歡迎的設(shè)計師平臺,提供獎品贊助 聯(lián)系我們
標(biāo)志設(shè)計標(biāo)準(zhǔn)教程
已累計誕生 729 位幸運(yùn)星
發(fā)表評論 為下方 5 條評論點贊,解鎖好運(yùn)彩蛋
↓ 下方為您推薦了一些精彩有趣的文章熱評 ↓