其實表達式的教程寫過不少,網上也不少,這次希望從計算機編程和算法的角度上去剖析,可能更好理解,這是根難啃的骨頭,很多人也就一知半解懂個wiggle什么的,學好表達式,對工作效率的提升是很大的。新手的話不太建議在這方面花太多時間,因為表達式是個難點,但在AE中并算不上重點,不會表達式KK幀很多效果都能搞定。
第一步:開啟表達式
首先我們來說說如何開啟表達式和表達式的一些功能按鍵。首先,如何開啟表達式界面呢,按住alt+鼠標左鍵點擊秒表處打開表達式界面。
表達式處有四個按鈕:
,第一個是打開關閉表達式,第二個是打開表達式曲線圖像,打開后能看到用過表達式后的曲線圖。
打開后能顯示路徑和曲線,如圖。第三個按鈕是拾取按鈕,等等我們會說怎么用。第四個是預設按鈕,能調出AE所有可調用的預設。
平常大家一起交流學習AE技能經驗,每天有免費AE影視后期制作特效課程講解。復制點擊鏈接加入Q群149413881學習交流。
第二步:了解表達式的本質。
懂得如何打開表達式面板之后,我們來看看表達式的本質是什么吧。
我們新建一個合成和一個固態層,在固態層的不透明度屬性上表達式“20”,如下圖所示,我們會見到不透明度變成了20。
其實說到底,AE的表達式,就是返回最后一行所得到的數字或者數組,這個數字或者數組是個變量,是會隨著時間改變而改變的,這里不變的原因只是因為,它每一幀都是數值20罷了。說完這些,可能會有點不解,我們來看下面幾個例子。
在位置屬性我輸入了表達式“[20,30]”,這個表達式是一個數組,有兩個數值,叫做二維數組,這個位置屬性,叫做二維屬性,他有x,y兩個參數,這也是上文中提到的返回的可能是數組,不一定是數值。
我在縮放屬性上寫的表達式有三行,但可以看到,屬性的數值是50%,50%,跟第一第二行的a=3和b=3完全沒有半點關系,這就是上文說的,返回的僅是最后一行,不管前面運算再多,你最后一行才是最關鍵的。
那么再回來說表達式的本質,是啥呢,它其實就是通過代碼的方式表述的數值或者數組在每一幀上的集合。
那么這里要補充兩個概念和一些常識。
1.數組:其實就是一類有著相同數據類型的東西按順序排列的集合。這集合里的元素可以是任何東西,包括數組。也就是數組的元素就可以是數組,還有整數,布爾值等等,甚至到幾個圖層,它們也能組成一個數組。
2.數據類型:這東西為何要在這說呢,因為有些屬性的值并不是單純的數字或者數字組成的數組,其他的數據類型也會包含到,常見的比如布爾型和字符串。我們來看下面三個比較特殊的例子。
第一個透視位移那是布爾類型,所謂的布爾類型,它就是只有對和錯兩種情況的。要么勾上,要么不勾。
第二個混合模式是枚舉型。說這個比較麻煩,理解為它本身就是只有幾種情況,而且是特殊的。這個混合模式中就是只有相加,疊加,正常的那些情況。
第三種算是特別特殊了,是字符串類型。所謂的字符串,是由數字、字母、下劃線組成的一串字符。
然后來補充一張小圖。多維屬性的歸類。
第三步:了解一些編程基礎。
那么解釋完了本質,我們就要說下投入使用了,但在這之前要補充一些編程方面的小知識。
1.運算符。
算術運算符:用于各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運算,%)、自增(++)、自減(--)共七種。
關系運算符:用于比較運算。包括大于(>)、小于(=)、小于等于(
邏輯運算符:用于邏輯運算。包括與(&&)、或(||)、非(!)三種。
PS:運算符中的等于是用兩個等號,一個等號代表的是賦值,其實還有些“+=”這種復合的賦值運算符,不過我們編寫其實可以不用,所以跳過。有興趣自行百度。
2.條件語句與循環語句。
條件語句用的一般是“if...else if..else”。
條件語句主要是我們想針對不同情況,有不同的返回值。這個在之后的實例會詳細解釋清楚這句話是啥意思。
其實光是一個if沒有else語句也是可以執行的,這里就不演示了,具體寫法是
if(布爾表達式)
else if(布爾表達式)
else
什么是布爾表達式呢,簡單來說就是能判斷對錯的語句,例如上面的“a==b”,a等于b要么是對的,要么是錯的,當然布爾表達式返回的值其實是0或者1,1代表正確,0代表錯誤,我在第三個例子中直接寫了個1,執行的是if里面的語句。
循環語句一般用的是for循環。
關于for循環,是比較強的一個循環語句,循環,它主要就是用在我們要重復的執行一個動作的時候。具體寫法是。
for(循環起點;循環終點判斷;用來跳出循環的表達式(一般就是自加))
{
要重復的動作;
}
例子里的語句等于寫十次c=c+1,其實高中時候也應該會接觸流程圖的循環,類似,上面條件也是,自行參悟。這里最后還是寫了個“c;”,也證實了我之前說的表達式關鍵還是最后一行,前面的語句其實都是為最后一句鋪路的。
PS:其實也有其他像switch..case,do..while這種語句,不過懂一種也差不多了,有興趣可以自行百度。
3.構造一個新函數與設置變量。
這里是一個重點和難點,為什么說是重點呢,因為表達式很多語句是調用AE本身自帶的函數,清晰理解函數的概念能快速解決掉一部分東西,難點是因為,這里各種形參,實參這種概念的東西,新手經常弄暈,不過我在這不會提這些概念,讓你們實際上手就好。
函數,什么時候函數呢,輸入自變量就會得到因變量的一個體,就叫做函數,前身的概念與映射接近。前面說了,表達式其實很多語句是調用AE本身的函數。例如wiggle,linear,random,loopout一類的。
那么讓我們通過例子先來了解下怎么去構造函數和變量。寫法如下
function 函數名(參數名)
這是構建函數,我例子里有個“ox(50,50)”的語句,是調用函數,等于輸入兩個50分別個函數中的a和b,這a和b也就是自變量,我定義了一個c作為因變量,最后返回了c。關于定義函數,我們一般在前面寫個var就行了,其實也有其他能定義的,不過會涉及數據類型,例如int,float,double這些。那么接下來我們來通過wiggle深入了解函數這個東西,還有為什么我會說AE表達式有很大一部分其實就是在調用AE已經寫好給我們的函數。下面是Adobe官方給出的wiggle表達式的幫助。
-------------------------------------------------------------------
wiggle(freq, amp, octaves=1, amp_mult=.5, t=time)
返回類型:數值或數組。
參數類型:freq、amp、octaves、amp_mult 和 t 是數值。
隨機搖動(擺動)屬性值。
freq 值是每秒擺動的頻率。
amp 值是向其應用了此值的屬性單位中的振幅。
octaves 是要加在一起的噪聲的八度數。此值控制擺動的詳細程度。使此值高于默認值 1 可在擺動中包括更高的頻率,使此值低于默認值 1 可在擺動中包括振幅諧波。
amp_mult 是 amp 乘以每個八度的值。此值控制諧波減弱的速度。默認為 0.5;使其更接近 1 可以與基本頻率相同的振幅添加諧波,使其更接近 0 可以添加更少的細節。
t 是基礎啟動時間。此值默認為當前時間。如果您希望輸出成為在不同時間采樣的屬性值的擺動,請使用此參數。
示例:position.wiggle(5, 20, 3, .5) 每秒產生約 5 次擺動,平均大小約 20 像素。除了主要擺動之外,其他兩個級別的詳細擺動發生的頻率為每秒 10 次和 20 次擺動,各自的大小為 10 和 5 像素。
-------------------------------------------------------------------
從上面可以看出,其實wiggle就是官方寫好了一個
function wiggle(freq, amp, octaves=1, amp_mult=.5, t=time)
{
............;
}
我們省去了這些流程,可以直接調用罷了。
4.部分常用的語句。
break:在switch...case語句用到多點,用途是打斷部分的流程。也可以拿來跳出循環。
continue:用作跳出循環(單次的)。
return:用作返回某個值,構建函數中經常用到。
PS:break是結束整個循環體,continue是結束單次循環。
5.選學:遞歸(這東西其實是個很好用的東西,熟用遞歸可以減少代碼量,也基本用不到),循環和條件的嵌套(恩,其實沒那么難,不過一般也不會用到嵌套那么復雜的表達式啦),自行百度。
PS:其實編程的基礎知識在這還沒結束,只是還有部分東西單獨拿出來說不方便,我會在下面慢慢說完。
第四步:學習表達式綁定與表達式控制
知識說的差不多了,接下來我們會接觸到面向對象的概念,不過在此之前,我們會先來說AE中表達式控制這一欄特效和表達式綁定。
先來說表達式綁定,因為他是利用表達式控制的基礎。
這里會用到我們之前提到的第三個按鈕。
我們來演示個最簡單的例子,讓攝像機目標點位置綁定一個空物體的位置。我們先把空物體的3D開關打開,找到攝像機目標點參數,打開表達式。然后拖動綁定。
這樣做的結果就是攝像機目標點會完全等于空圖層的位置,要注意的是,屬性的數據類型要完全一致才能那么直接的綁定。那么我們來看看綁定后表達式顯示的內容。
thisComp.layer("控制").transform.position
這個是啥意思呢,thisComp說的是當前合成,layer("控制")指的是名稱為控制的圖層,transfrom說的是變換屬性組,position指的當然是位置屬性。這樣代碼的寫法一層一層,邏輯清楚。在AE中,基本就是這樣的一個結構“合成-圖層-屬性類型組-具體屬性”。其實這里還并不完整,不過不完整的內容我們之后再講。
那么我們在來講表達式控制的一個簡單例子。用滑塊控制去控制一個固態層的不透明度。新建一個固態層,給它一個滑塊控制的特效,然后在不透明度屬性處打開表達式,綁定到滑塊控制。
可以看到我們不透明度的數值會等于滑塊控制的數值。再來看看這次的表達式內容。
effect("滑塊控制")("滑塊")
和之前說的完全不一樣。恩,其實我們可以換個寫法。
thisComp.layer("soild").effect("滑塊控制")("滑塊")
這里因為調用本圖層屬性數據,于是把前面的合成到層兩個去掉了。在這里,我們要引出AE表達式的一類預設了。例如index,time,value,width,height,這一類表達式本質上是返回AE內某些參數,下面我拿幾個例子說明下。
首先是index
我在不透明度上輸入表達式
thisComp.layer("soild").index*37
其實這就是我們平日寫的“index*37”,只不過我把前面的內容補充完整了。這表達式的內容是,返回名字為solid的圖層的層標號乘以37,假如我只寫"index*37",意思將會變為此圖層的層標號乘上37。
其次是time
這個其實是直接返回你時間軸上的時間,已經沒有上級可寫的了。返回的數值在時間軸的左上角。
再來說說value
我們在不透明度上輸入表達式
最后再來說width
因為會超過100,我們在滑塊控制上輸入。我分別輸入了兩條不同的表達式,我們來看看會有什么區別
可以看出,兩條表達式返回的值不同,一個返回的是合成的寬度(我這設定的是720P,所以為1280),一個返回的是固態層的寬度(我設置的是500*500的固態層)
從上面我們可以看出,預設中有些屬性只能層對象調用,有些要屬性調用,有些支持多個調用,要明確了解這個,多看官方幫助。
那么我們回來講表達式控制。
3D點控制和點控制返回的分別是3維數組和2維數組,復選框返回的是布爾值,滑塊返回的是一個數值,角度控制返回的也是一個數值,不過這個數到360會進一位那種感覺,圖層控制返回的是一個圖層,顏色控制返回的是一個四維數組。我們還是通過例子來具體解釋一下這些特效的細微區別。
關于3D點控制和點控制我在這就不演示了,和表達式綁定到空物體位置沒啥兩樣。滑塊控制也是,在這不講。
實例1:利用復選框控制控制特效的開關
表達式如下
if(復選框控制==0)
else
先來解釋下這個表達式的意思,當復選框沒有勾上的時候,保持當前值,否則(也就是勾上了),執行wiggle。前面提到過這種返回的是布爾類型,也就是只有對和錯,布爾類型的對用1表示,錯用0表示。
實例2:黑盒中用到的角度控制
表達式如下
transform.yRotation+[index*角度控制]
這表達式說的是,他本身的旋轉數值(也就是transform.yRotation在這其實可以用value代替)加上一個角度控制數值和層標號的積。
實例3:利用圖層控制制作3D空間中的瞬移
表達式如下
圖層控制.transfrom.position
也就是返回各圖層的位置屬性。
實例4:利用顏色控制批量控制顏色更改
先做一個如圖有三個不同顏色的形狀層和一個空圖層加上顏色控制。
然后都綁定到顏色控制。
這樣做在你編好哪部分顏色要是什么,之后可以一次性批量修改顏色。
第五步:引出另外一類預設與一些簡單算法的普及
其實另外一類我上面已經提到了一點,wiggle是官方寫的一個函數。那么包括random,loopOut,noise這一系列都是AE提供的函數,這其中有一部分又是數學,包括vetcor math和javascript math兩個部分。要用好這些,除了要好好參考AE官方提供的幫助外,還要懂一些很基礎的算法。
1.通過對2的取余運算來做定格關鍵幀。
if(Math.floor(time)%2==1)
else
我們可以看到曲線是定格運動了,我先來解釋一下表達式,math.floor是官方提供的一個函數,功能是向下取整(因為我們這里做的是取余運算,需要取整比較好),也就是說,表達式的意思是如果time取整后對二取余的值為1,那么值等于20,否則值等于50。
關于對二取余這個操作其實是拿來判定奇偶數用的,配合上條件語句會有奇效。具體要拿來怎么用,還得看個人的天馬行空了。
2.交換數值。
這算是最基礎的一個算法。表達式如下。
function ex(a,b)
{
var a;
var b;
var c;
c=a;
a=b;
b=c;
}
通過這個函數就能把a和b的值互換過來。
3.累加與累乘。
這里不再講,用for循環或者其他循環語句實現。包括數列求前N項和也是用循環語句實現。
4.排序與查找。
排序用的是冒泡法,查找用的是二分法,有興趣自行百度。
5.窮舉。
也就是把可能的情況一一測試,用循環實現。
平常大家一起交流學習AE技能經驗,每天有免費AE影視后期制作特效課程講解。復制點擊鏈接加入群【https://jq.qq.com/?_wv=1027&k=41M8x1n】學習交流。免費AE影視制作學習群 149413881