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