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