面向AE編程之左右滑動(dòng)動(dòng)畫制作

本教程靈感來源:

有的時(shí)候我們會(huì)有需要做類似傳送帶動(dòng)畫的需求。對于文本或形狀圖層而言,ae內(nèi)置了一個(gè)中繼器功能,可以直接對他們進(jìn)行克隆,這樣就不用復(fù)制一大堆圖層再手k關(guān)鍵幀了。然而,對于其他大多數(shù)圖層卻不能使用中繼器,要解決這個(gè)問題,可以建立一個(gè)空對象,把它放到合成的最頂層,然后在圖層的位置屬性輸入以下表達(dá)式:

按ctrl+d復(fù)制幾層,就能看見圖像整齊地排列在一行。這樣就只需對空對象的位置屬性打關(guān)鍵幀,就可以控制所有圖片的移動(dòng)了。

代碼第一行的位置屬性其實(shí)并不需要手打,表達(dá)式輸入框左邊有個(gè)螺旋型的圖標(biāo),按住它并拖動(dòng)到你想要的屬性,松開鼠標(biāo),屬性所對應(yīng)的代碼就自動(dòng)出現(xiàn)在表達(dá)式中了。

圖層的位置屬性在平面圖層中是由兩個(gè)值組成的,第一個(gè)對應(yīng)坐標(biāo)x,第二個(gè)對應(yīng)坐標(biāo)y,代碼第三行中在位置屬性后加[0]就是取坐標(biāo)x的值。
index屬性是AE自帶的,它的值等于這一圖層的序號(也就是圖層左邊的那個(gè)數(shù)字)。于是每個(gè)圖層都與上一層圖層的x軸位置相差固定的數(shù)值。
但這個(gè)代碼還存在一點(diǎn)問題:如果后期需要修改這些圖層的間隔,就要修改所有圖層的表達(dá)式。在沒有腳本輔助的情況下,這就需要把所有圖層刪掉,修改表達(dá)式后再重新復(fù)制,實(shí)在太麻煩了。于是我們可以在空對象圖層上添加一個(gè)滑塊控制效果,并用滑塊控制distance變量的值,將表達(dá)式修改為:
這樣在修改間距的時(shí)候,只需要修改滑塊的值,就能很方便地做出調(diào)整了。一個(gè)良好的習(xí)慣是:對所有可能在之后進(jìn)行調(diào)整的參數(shù),都用滑塊來控制。這可以減少大量調(diào)整的時(shí)間。
但這還不是我們的終點(diǎn)。倘若我想讓圖片運(yùn)動(dòng)到畫面邊緣時(shí)自動(dòng)縮小,閣下該如何應(yīng)對?這就需要一個(gè)名叫sampleImage的函數(shù)了。adobe對這個(gè)函數(shù)的說明如下:
sampleImage(point, radius = [.5, .5], postEffect=true, t=time)
返回類型:數(shù)組 [4]。
參數(shù)類型:point?是數(shù)組 [2],radius?是數(shù)組 [2],postEffect?是布爾值,t?是數(shù)值。
對圖層的顏色和 alpha 通道值進(jìn)行采樣,并返回指定點(diǎn)距離內(nèi)像素的平均 alpha 加權(quán)值:[red,?green,?blue,?alpha]。如果?postEffect?為 true,則采樣值是渲染圖層上的蒙版和效果后的圖層的值;如果?postEffect?為 false,則采樣值是渲染蒙版和效果前的圖層的值。輸入值?point?位于圖層空間中;點(diǎn) [0,0] 是圖層中左上角像素的中心。輸入值?radius?指定樣本中心到采樣矩形的邊緣的水平和垂直距離。默認(rèn)值會(huì)對一個(gè)像素采樣。
可能這看起來有點(diǎn)抽象,但我們只要知道,只要告訴這個(gè)函數(shù)取樣點(diǎn)的位置,它就能輸出這個(gè)點(diǎn)附近的rgba值(大小從0到1)。于是我們可以制作一張中間為白色,兩側(cè)為黑色的圖片,用這張圖片的亮度信息(此處可直接用rgb的平均值替代)控制圖片縮放的大小,就能讓圖片運(yùn)動(dòng)到邊緣時(shí)自動(dòng)縮小了。
要制作這樣的圖片,我們可以用兩個(gè)純色層,各加上一個(gè)梯度漸變效果,一個(gè)在左側(cè)漸變,一個(gè)在右側(cè)漸變,然后混合模式改為“較深的顏色”。效果如下圖所示:

然后可以ctrl+alt+c打一個(gè)預(yù)合成,就能用來控制圖層的縮放了??刂茍D層縮放的表達(dá)式如下:

將預(yù)合成設(shè)置為不可見,就大功告成了。為了動(dòng)畫運(yùn)動(dòng)得更加自然,還可以對縮放大小進(jìn)行非線性插值,還可以對位置進(jìn)行補(bǔ)償,讓圖片縮小時(shí)離其他圖片更近一點(diǎn)。但這就不在本教程的討論范圍內(nèi)了。
最后補(bǔ)充上期教程的一個(gè)知識點(diǎn):其實(shí)AE中還有另一種方法控制表達(dá)式更新的頻率,只需要利用posterizeTime函數(shù),在表達(dá)式開頭輸入:
這樣就能不僅僅只控制隨機(jī)表達(dá)式的更新頻率了。