吉家進




基本概念
表達式是由數字、算符、數字分組符號(括號)、自由變量和約束變量等以能求得數值的有意義排列方法所得的組合。
在After Effects中,表達式是基于JavaScript和歐洲計算機制作商聯合會制定的ECMA-Script規范,具備了從簡單到復雜的多種動畫功能,甚至還可以使用強大的函數功能來控制動畫效果。
與傳統的關鍵幀動畫相比,表達式動畫具有更大的靈活性,既可獨立地控制單個動畫屬性,又可以同時控制多個動畫屬性。
基本語法
1.表達式的語言
After Effects使用的是JavaScript語言的標準內核語言,并且在其中內嵌了諸如Layer(圖層)、Comp(合成)、Footage(素材)和Camera(攝像機)之類的擴展對象,這樣表達式就可以訪問到After Effects項目中的絕大多數屬性值。
另外,在After Effects中,如果圖層的屬性中帶有arguments(陳述)參數,則應該稱該屬性為method(方法);如果圖層的屬性中沒有帶arguments(陳述)參數,則應該稱該屬性為attribute(屬性)。
2.訪問對象的屬性和方法
使用表達式可以獲取圖層屬性中的attributes(屬性)和methods(方法)。After Effects表達式語法規定全局對象與次級對象之間必須以點號來進行分割,以說明物體之間的層級關系,同樣目標與“屬性”和“方法”之間也是使用點號來進行分割的(如圖1)。
對于圖層以下的級別(如濾鏡、遮罩和文字動畫組等),可以使用圓括號來進行分級,如要將Layer 1圖層中的Opacity(不透明度)屬性使用表達式鏈接到Layer 2圖層中的Gaussian Blur(高斯模糊)濾鏡的Blurriness(模糊量)屬性中,這時可以在Layer 1圖層的Opacity(不透明度)屬性中編寫出如下所示的表達式。
thisComp.layer("Layer 2").effect("Gaussian Blur")("Blurriness")
在After Effects中,如果使用的對象屬性是自身,那么可以在表達式中忽略對象層級不進行書寫,因為After Effects能夠默認將當前的圖層屬性設置為表達式中的對象屬性。例如,在圖層的Position(位置)屬性中使用wiggle( )表達式,可以使用以下兩種編寫方式。
Wiggle(10,5)
position.wiggle(10,5)
在After Effects中,當前制作的表達式如果將其他圖層或其他屬性作為調用的對象屬性,那么在表達式中就一定要書寫對象信息及屬性信息。例如,為Layer 2圖層中的Opacity(不透明度)屬性制作表達式,將Layer 1中的Rotation(旋轉)屬性作為連接的對象屬性,這時可以編寫出如下所示的表達式。
thisComp.layer("Layer 1").rotation
3.數組與維數
數組是一種按順序存儲一系列參數的特殊對象,它使用逗號(,)來分隔多個參數列表,并且使用中括號([ ])將參數列表首尾包括起來,如下所示。
[10, 5]
在實際工作中為了方便,也可以為數組賦予一個變量,以便于以后調用,如下所示。
myArray = [10, 5]
在After Effects中,數組中的數組維數就是該數組中包含的參數個數,如上面提到的myArray數組就是二維數組。
在After Effects中,如果某屬性含有一個以上的變量,那么該屬性就可以稱為數組,After Effects中不同的屬性都具有各自的數組維數,如下表所示的是一些常見的屬性及其維數。
在數組中的某個具體屬性可以通過索引數來調用,數組中的第1個索引數是從0開始,如在上面的myArray= [10, 5]表達式中,myArray[0]表示的是數字10,myArray[1]表示的是數字5。
4.向量與索引
向量是帶有方向性的一個變量或是描述空間中的點的變量。在After Effects中,很多屬性和方法都是向量數據,如最常用的Position(位置)屬性值就是一個向量。
當然,并不是擁有兩個以上值的數組就一定是向量,如audioLevels雖然也是一個二維數組,返回兩個數值(左聲道和右聲道強度值),但是它并不能稱為向量,因為這兩個值并不帶有任何運動方向性,也不代表某個空間的位置。
在After Effects中,有很多的方法都與向量有關,它們被歸納到Vector Math(向量數學)表達式語言菜單中,如lookAt(fromPoint,atPoint),其中fromPoint和atPoint就是兩個向量。通過lookAt(fromPoint,atPoint)方法,可以輕松地實現讓攝像機或燈光盯緊某個圖層的動畫效果。
5.表達式時間
表達式中使用的時間指的是合成的時間,而不是指圖層時間,其單位是以秒來衡量的。默認的表達式時間是當前合成的時間,它是一種絕對時間,如下所示的兩個合成都是使用默認的合成時間并返回一樣的時間值。
thisComp.layer(1).position
thisComp.layer(1).position.valueAtTime(time)
如果要使用相對時間,只需要在當前的時間參數上增加一個時間增量。例如,要使時間比當前時間提前5秒,可以使用如下表達式來表達。
thisComp.layer(1).position.valueAtTime(time-5)
合成中的時間在經過嵌套后,表達式中默認的還是使用之前的合成時間值,而不是被嵌套后的合成時間。注意,當在新的合成中把被嵌套合成圖層作為源圖層時,獲得的時間值為當前合成的時間。例如,如果源圖層是一個被嵌套的合成,并且在當前合成中這個源圖層已經被剪輯過,用戶可以使用表達式來獲取被嵌套合成的Position(位置)的時間值,其時間值為被嵌套合成的默認時間值,如下表達式所示。
Comp("nested composition").layer(1).position
如果直接將源圖層作為獲取時間的依據,則最終獲取的時間為當前合成的時間,如下表達式所示。
thisComp.layer("nested composition").source.layer(1).position
表達式的創建
1.使用菜單命令
在Timeline(時間線)面板中選擇需要添加表達式的圖層的屬性,然后執行“Animation(動畫)→Add Expression(添加表達式)”菜單命令,系統會增加一個默認的表達式,如圖2所示。在輸入或編輯表達式完成后,可以按小鍵盤上的Enter鍵或單擊表達式輸入框以外的區域來完成表達式的創建工作。
2.表達式關聯器
使用“表達式關聯器”可以將一個圖層的屬性關聯到另一個圖層的屬性中,將“表達式關聯器”按鈕拖曳到其他動畫屬性的名字或數值上來關聯動畫屬性,如圖3、圖4所示。
表達式的保存與調用
1.動畫預設
在After Effects中,可以將含有表達式的動畫保存為Animation Presets(動畫預設),這樣在其他工程文件中就可以直接調用這些動畫預設。
如果在保存的動畫預設中,動畫屬性僅包含有表達式而沒有任何關鍵幀,那么動畫預設只保存表達式的信息;如果動畫屬性中包含有一個或多個關鍵幀,那么動畫預設將同時保存關鍵幀和表達式的信息。
2.復制表達式和關鍵幀
在同一個合成項目中,可以復制動畫屬性的關鍵幀和表達式,然后將其粘貼到其他的動畫屬性中,當然也可以只復制屬性中的表達式。
如果要將一個動畫屬性中的表達式連同關鍵幀一起復制到其他的一個或多個動畫屬性中,可以在Timeline(時間線)面板中選擇源動畫屬性并進行復制,然后將其粘貼到其他的動畫屬性中。
3.只復制表達式
如果只想將一個動畫屬性中的表達式(不包括關鍵幀)復制到其他的一個或多個動畫屬性中,可在Timeline(時間線)面板中選擇源動畫屬性,然后執行“Edit(編輯)→Copy Expression Only(只復制表達式)”菜單命令,接著將其粘貼到選擇的目標動畫屬性中即可。
本期專欄的介紹到此結束,在后續的專欄中筆者將繼續介紹和講解其他模塊的具體技術。