AE表達式學習

—— 新手免坑提示

AE表達式非常強大,儘快掌握對以後做動畫會有很大幫助。以下是我掉坑的血淚史

之前開始學習AE,後來想嘗試用ae表達式做個動畫,這主要是受jking(@驚嘆號設計)的教程影響。花了一天時間,終於熬出這麼一個小動畫:

其中用到的知識點包括操控點和表達式。操控點沒什麼好說,就是釘釘子嘛,但是表達式很有意思,所以我總結了幾個初次接觸表達式的新手可能會遇到的問題,也是我掉過的坑(往事如煙):

一、剛使用ae表達式會遇到很多一時無法理解的「術語」

1)對象(object):也就是物體,代表世界萬物,一切皆為對象。合成、圖層、導入的素材或者路徑形狀等等,他們都是對象。

2)屬性:例如人的身高、體重等都是人的屬性。在ae里就指對象的position、scale、rotation等等,每個屬性都會有一個值。要注意的是對象的屬性也是對象,所以屬性也會有自己的屬性~(好複雜T T),例如某合成的position屬性又具有兩個屬性分別是x和y。

3)方法:指對象可以做什麼或者有什麼功能,例如人有一個「方法」叫做「吃飯」,使用這個「方法」就可以補充能量。同樣在ae里所有「合成」都有一個方法叫「layer」,可以找到自己內部的某一個圖層。另外由於屬性也是對象所以屬性也會有自己的方法,如position屬性具有wiggle等方法。

4)參數:前面說到人有一個「方法」叫「吃飯」,使用這個「方法」就可以補充能量,但是天下沒有免費的午餐,要調用這個方法的前提是得有飯,這個「飯」就是參數。同樣在ae里我們調用一個「方法」通常需要傳遞一個「參數」,比如上面提到的「layer」方法,調用時需要傳遞圖層名,類似:

thisComp.layer("layer_name");

其中thisComp指當前合成,layer_name是要調用的圖層的名字,也就是方法所要求的參數。不過也不是所有方法都需要參數。

5)返回值:基本上所有「方法」運行完都會給我們一個結果,就像你吃完飯會覺得飽了或者還不夠,女人分娩會返回一個男孩或者女孩或者其他情況。

6)數組和索引:例子

array = [a,b,c];

這是一個名叫array的對象,因為它的值是形如 [x,y...] 的造型,所以他是一個數組,而且這個數組包含3個元素分別是a,b,c。如果我們要拿到array內部的元素a的值,就需要知道a的「索引」,現在我們可以看到a是array的第一個值,所以他的索引是0(沒錯索引都是從0開始的!),所以

array_a = array[0];

這樣就將array內部元素a的值賦給了array_a對象~

好了,還有更多其他術語什麼的對新手來說應該還不需要,我們只了解上面幾個應該就夠了。最後來看看下面這個語句,如果能說出發生了什麼那應該就沒問題了:

thisComp.layer(1).position.valueAtTime(time+2);

對象「thisComp」調用方法「layer」,傳入的參數為圖層的索引:1(指合成里的第二個圖層)。「layer」方法返回了圖層2之後,獲取圖層2的屬性position,然後調用position對象的valueAtTime方法,傳入的參數為「time+2」。其中time是全局變數,指當前時間(我不解析全局和變數的概念了,不然沒完沒了,有興趣可自行百度)。最後valueAtTime方法返回position在當前時間後2秒的值[x,y]。

二、屬性的維度問題

像上面的例子,position 的值是一個由兩個元素組成的數組,分別是x和y坐標的數值,而不透明度opacity的值只是一個數值,所以相互之間不能直接賦值,不然會報錯。在ae表達式里稱這種情況為維度不同,以下是各種屬性的維度參考:

jking的這篇文章末尾也有提到,可惜當時我還沒看到這裡,而且自己的感悟比較遲鈍所以還是被坑了一下。jking有提到1維屬性如何賦值給2維屬性,但是反過來呢?如果你已經理解前面對「數組」概念的解析那麼應該已經有答案,對就是這樣:

opacity = scale[0];//2維屬性賦值給1維屬性position = [opacity,opacity];//1維屬性賦值給2維屬性

通過索引0可以獲得數組scale的第一個元素「x」(寬度縮放值),這個值是一維的,所以可以賦值給一維的opacity屬性,再將opacity屬性的值分別賦值給position數組的兩個元素。順便一提,「//」號代表注釋,後面的內容都不會被編譯。

三、方法的多態問題

「多態」是什麼意思呢?聽名字應該能大概猜到吧,就是指某個方法在不同的調用環境下會有不同的效果。具體我們以wiggle方法為例子說一下。

wiggle這個函數似乎經常用到,因為能產生隨機抖動。關於wiggle的用法和各個參數的含義其實認真參閱官方文檔應該沒問題,但是我這裡還是多說幾句。首先通常我們只用wiggle的前兩個參數:

v = wiggle(5, 10);

上面表示wiggle的抖動頻率為5,幅度為10。那麼問題來了,wiggle的返回值是一維的還是二維的?答案是要看這個表達式用在哪裡。什麼意思?請看例子:

圖1:

圖2:

上面兩個表達式都是對的,由於圖1表達式在二位屬性position中調用,所以表達式里的wiggle(3,50) 相當於position.wiggle(3,50),而當wiggle被一個二維屬性調用時,他返回的結果也是一個二維的值,形如[x,y],也就是一個擁有兩個元素的數組,所以可以直接賦給position。

而圖2中,wiggle是被一個一維屬性調用的,所以他返回的結果也是一個一維的值,所以也可以直接賦值給一維屬性opacity。

沒錯這就是wiggle的多態表現~

再看圖3:

可以看到那個黃色三角形表示這段表達式是錯誤的,因為雖然這段表達式是寫在一維的opacity屬性中,但是wiggle方法卻是由二維的position屬性調用的。所以返回值也是二維的,不能直接賦值給opacity屬性,只要改成下面這樣就可以了~:

v = transform.position.wiggle(3,50)[0];v

所以大家以後使用wiggle時一定要分清楚wiggle是由什麼維度的屬性調用的,不然一不小心就會犯不同緯度的屬性互相賦值的錯誤。當然wiggle只是一個例子,其他方法也可能會有多態性,典型如valueAtTime等等(抱歉我了解的方法還比較少。。),相信大家可以舉一反三。

最後給大家一個思考,我想給position調用wiggle產生抖動,但是只想在x軸方向產生強烈抖動,而y軸方向只要輕微抖動就可以了,那我的表達式應該怎麼寫?


推薦閱讀:

AE動畫利器-操控點工具

TAG:用户界面设计 | AfterEffects特效 | MG动画 |