表達(dá)式是使用 Extendscript 或 Javascript 語(yǔ)言來(lái)控制 AE 圖層屬性(位置、縮放、旋轉(zhuǎn)、不透明度)的一種編程語(yǔ)言,慶幸的是不用真的精通編程,大部分的表達(dá)式用的時(shí)候只需修改幾個(gè)簡(jiǎn)單的參數(shù),就可實(shí)現(xiàn)復(fù)雜的效果。每一種表達(dá)式都是節(jié)省時(shí)間,簡(jiǎn)化工作的好幫手。
表達(dá)式用法很簡(jiǎn)單,按下 alt/option 鍵,鼠標(biāo)點(diǎn)擊圖層屬性前面的“小碼表”,然后把代碼添加到時(shí)間軸里的文本區(qū)就可以了。
廢話少說(shuō),來(lái)介紹 10 個(gè)常用的 Ae 表達(dá)式及其用法,建議收藏。
常用在旋轉(zhuǎn)屬性上,代碼:time*value
value 是數(shù)值,用在元素的不透明度上,就是由透明到不透明的變化。
例如:time*15,意思就是每秒以 15%的透明度一直到 100%不透明。用在旋轉(zhuǎn)屬性上,就是每秒以 15°的角度進(jìn)行順時(shí)針旋轉(zhuǎn),如果是-15,就是逆時(shí)針旋轉(zhuǎn)。
其實(shí) time 屬性也是可以用在位置屬性上的,只不過(guò)要先把“位置”屬性先拆分成 X、Y 兩個(gè)單獨(dú)的坐標(biāo)才可以。
接著我們來(lái)看下和 time 相關(guān)的函數(shù)表達(dá)式
代碼:Math.sin(time*value1)* value2
與 time 不同的是,它多了一個(gè)旋轉(zhuǎn)的頻率。
value1=頻率值;value2=幅度值
例如把這行代碼 Math.sin(time*2)* 30 加在旋轉(zhuǎn)屬性上,就是以 30°的角度來(lái)回旋轉(zhuǎn) 2 次,可以代替手動(dòng) K 幀的繁瑣。
那怎樣讓旋轉(zhuǎn)的物體停下來(lái)呢?需要在這行正弦函數(shù)后面加上一行指數(shù)函數(shù):
Math.sin(time* value1)* value2/Math.exp(time* value)
函數(shù) exp 里面的 time 值越大,就越快停下來(lái)。
最常用的“喂狗”表達(dá)式,一般用在“位置”屬性上,簡(jiǎn)單寫(xiě)法為:wiggle(value1, value2)。
value1 為每秒抖動(dòng)的次數(shù),value2 為每次隨機(jī)波動(dòng)的幅度。
例如:wiggle(5,20),意思每秒抖動(dòng) 5 下,每次波動(dòng)的幅度為 20。
更完整的寫(xiě)法是:
wiggle(freq, amp, octaves = 1, amp_mult = 0.5, t = time)
freq=頻率(設(shè)置每秒抖動(dòng)的頻率);amp=振幅(每次抖動(dòng)的幅度);octaves=振幅幅度(在每次振幅的基礎(chǔ)上還會(huì)進(jìn)行一定的震幅幅度,很少用);amp_mult=頻率倍頻(默認(rèn)數(shù)值即可,數(shù)值越接近 0,細(xì)節(jié)越少;越接近 1,細(xì)節(jié)越多);t=持續(xù)時(shí)間(抖動(dòng)時(shí)間為合成時(shí)間,一般無(wú)需修改);一般只寫(xiě)前兩個(gè)數(shù)值即可。
可以理解為規(guī)律復(fù)制表達(dá)式,代碼:index*value
例如把 index*15 添加在圖層的“旋轉(zhuǎn)”屬性上,則第一個(gè)圖層會(huì)旋轉(zhuǎn) 15 度,之后按 Ctrl+D 去復(fù)制圖層時(shí),第 2 個(gè)圖層將旋轉(zhuǎn) 30 度,第三個(gè)圖層 45 度,以此類推......
若想第一層圖形不產(chǎn)生旋轉(zhuǎn)保持正常形態(tài),復(fù)制后的圖形以 15 度遞增,表達(dá)式這樣寫(xiě):(index-1)*15,“-1”就是減去第一個(gè)圖層后其他所有圖層以 15°旋轉(zhuǎn)復(fù)制。
常用于隨便變化的數(shù)字或倒計(jì)時(shí):time.toFixed(2)
括弧里的數(shù)字 2 代表小數(shù)點(diǎn)后兩位,所以 0 就是整數(shù)變化。
數(shù)字倒計(jì)時(shí):Math.floor(value-time),value 代表從幾開(kāi)始,如:“20-time”,就是從 20 開(kāi)始倒計(jì)時(shí)。
數(shù)值變化表達(dá)式,所以經(jīng)常用在數(shù)字上,當(dāng)然也可以用在“不透明度”和“縮放”屬性上。代碼:random(min,max)。
min 是最小值,max 最大值
例如:random(1,100),數(shù)字就會(huì)在 1-100 間隨機(jī)變化,它會(huì)帶 X.xxxxxxxxxx 這樣的小數(shù)位,如果不想要小數(shù)點(diǎn)后面的尾巴,可以這樣寫(xiě):
X=random(1,100)
Math.round(X)
“X”是你自定義的名字,意思就是給這個(gè)“X”規(guī)定,讓它只能在 1-100 之間整數(shù)變化。這個(gè)效果可用在抽獎(jiǎng)游戲里的隨機(jī)數(shù)字。
物體運(yùn)動(dòng)時(shí),有類似殘影的效果,代碼如下:
delay = 5; //number of frames to delay(延遲的距離) d = delay*thisComp.frameDuration*(index - 1); thisComp.layer(1).position.valueAtTime(time - d)
把上述代碼添加到運(yùn)動(dòng)圖層的位置屬性里,然后多復(fù)制幾個(gè)圖層。
如想要實(shí)現(xiàn)不透明度拖尾,就需要為元素的不透明度屬性添加表達(dá)式:
opacityFactor = .75;//不透明度值 Math.pow(opacityFactor,index - 1)*100
彈性表達(dá)式有兩個(gè),Overshoot 和 Bounce。可以輕而易舉地實(shí)現(xiàn)各種彈性動(dòng)畫(huà),如抖動(dòng)、彈跳動(dòng)畫(huà)等。
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):對(duì)一組動(dòng)作進(jìn)行循環(huán)
- loopOut(type="pingpong",numkeyframes=0):是類似像乒乓球一樣的來(lái)回循環(huán);
- loopOut(type="cycle",numkeyframes=0):是周而復(fù)始的循環(huán);
- loopOut(type="continue"):延續(xù)屬性變化的最后速度,
- loopOut(type="offset",numkeyframes=0):是重復(fù)指定的時(shí)間段進(jìn)行循環(huán);
- numkeyframes=0 是循環(huán)的次數(shù),0 為無(wú)限循環(huán),1 是最后兩個(gè)關(guān)鍵幀無(wú)限循環(huán),2 是最后三個(gè)關(guān)鍵幀無(wú)限循環(huán)
與 loopOut 相對(duì)應(yīng)的是 loopIn,如果說(shuō) loopOut 是在最后一個(gè)關(guān)鍵幀之后循環(huán),那 loopIn 就是在最后一個(gè)關(guān)鍵幀之前做循環(huán)。
loopOutduration 和 loopInduration
這兩個(gè)里面都有一個(gè)“duration”:
duration = 0 時(shí)候一切遵循以上 Out 和 In 的基本解釋。
duration = 1,這里分為兩種:
第一種,loopInDuration(type = "cycle", duration = 1)
duration = 1 表示循環(huán)該套動(dòng)作的前 1 秒內(nèi)(綠色框內(nèi) 2s-3s)的動(dòng)作。
第二種,loopOutDuration(type = "cycle", duration = 1)
duration = 1 表示循環(huán)該套動(dòng)作的最后 1 秒內(nèi)(綠色框內(nèi) 3s-4s)的動(dòng)作。
控制器動(dòng)畫(huà),很適合用在一些需要多維聯(lián)動(dòng)的動(dòng)效里。
代碼:linear(t,tMin,tMax,value1,value2)
t=某屬性(位置、縮放、不透明度...)線性變化值(tmin 最小,tmax 最大)
value1,value2 代表給當(dāng)前添加表達(dá)式的參數(shù)的一維變化。
如何產(chǎn)生聯(lián)動(dòng)呢?
t=(拖動(dòng)螺旋線指向你想要綁定的那個(gè)圖層的某個(gè)屬性,比如 x/y 某一個(gè)方向的值)
但是這個(gè)只適用于一維上的某一個(gè)值,如果同時(shí)應(yīng)用,比如等比縮放屬性上怎么辦呢?
在 linear 前面加定義的名字,以“縮放”為例:
t=(你想要綁定的那個(gè)圖層的某個(gè)屬性) kuan=linear(t,tMin,tMax,value1,value2); gao=linear(t,tMin,tMax,value1,value2); [kuan,gao]
以上就是本文要介紹的 10 個(gè)常用表達(dá)式,當(dāng)然還有更多,當(dāng)你掌握越多的“語(yǔ)法”就越能理解其中的奧秘。甚至可以嘗試自己編寫(xiě)更實(shí)用的表達(dá)式,隨時(shí)調(diào)用省時(shí)省力。
更多表達(dá)式教程:
歡迎關(guān)注作者微信公眾號(hào):「印跡拾光」
復(fù)制本文鏈接 文章為作者獨(dú)立觀點(diǎn)不代表優(yōu)設(shè)網(wǎng)立場(chǎng),未經(jīng)允許不得轉(zhuǎn)載。
發(fā)評(píng)論!每天贏獎(jiǎng)品
點(diǎn)擊 登錄 后,在評(píng)論區(qū)留言,系統(tǒng)會(huì)隨機(jī)派送獎(jiǎng)品
2012年成立至今,是國(guó)內(nèi)備受歡迎的設(shè)計(jì)師平臺(tái),提供獎(jiǎng)品贊助 聯(lián)系我們
AI輔助海報(bào)設(shè)計(jì)101例
已累計(jì)誕生 737 位幸運(yùn)星
發(fā)表評(píng)論 為下方 5 條評(píng)論點(diǎn)贊,解鎖好運(yùn)彩蛋
↓ 下方為您推薦了一些精彩有趣的文章熱評(píng) ↓