圓周函數
在以前的教程中我們提到過,三角函數與圓形之間存在著密切的關系,其關系密切到有一些老的教程將三角函數稱為圓周函數。因為以固定斜邊組成的直角三角形可以形成一個圓形,這條斜邊就是圓形的半徑。
從上面的動畫示例中可以看到,直角三角形的兩條直角邊的軸心點分別對應于圓周上點的X、Y坐標(假設坐標原點位于圓心處),因此我們可以使用三角函數來找出圓周上點的坐標,使用同樣的方法我們還可以計算出直角三角形中未知邊的長度:

對于圓周上任意一點,其X坐標等于圓周半徑乘以圓心角的余弦值(x=r*cos(A)),Y坐標等于圓周半徑乘以圓心角的正弦值(y=r*sin(A))
在下面的例子中我們將使用三角函數來完成圖層圍繞中心點旋轉的效果。
示例:圓周運動
表面看起來要使一個圖層圍繞某一個中心點精確的旋轉不需要使用復雜的表達式,我們只需要調整圖層的軸心點然后為旋轉屬性設置動畫關鍵幀就可以了。那為什么還要使用表達式來進行設置呢,實際制作過程中我們會發(fā)現當使用設置關鍵幀的方式來制作旋轉動畫時,圖層的朝向會隨著旋轉角度的變化而發(fā)生變化,而使用給位置屬性加入表達式的方法就可以使圖層的朝向始終保持不變,同時我們還可以獨立的為圖層旋轉屬性設置動畫,制作出類似于地球自轉與公轉的效果。
首先,為旋轉的環(huán)繞中心定義一個變量:
center=this_comp.layer("Center").position;
其次,定義旋轉的圓周半徑(以象素為單位):
現在我們需要設置決定旋轉角度的變量,這個變量將驅動旋轉動畫。在這個例子中我們將使用時間來決定角度的變化,這樣圖層就會隨著時間的變動自動完成旋轉動畫。要使圖層旋轉得更快,我們可以將變量定義為2*time,所以我們的圖層將使用PI秒的時間(2*time=2*PI)來完成一個周期的旋轉(還記得么,在三角函數中我們要使用弧度,一圈就是2PI弧度):
在這個例子中,核心表達式為:
x=radius*Math.cos(angle);
y=radius*Math.cos(angle);
最后,只需要將將X、Y值與旋轉中心的坐標進行加法運算就可以得到圓周上點的坐標了:
最終的動畫效果:
單擊這里
下載工程文件 (Windows 用戶單擊這里)
示例:圓周排列
很多軟件都為我們提供了排列對齊工具以快速對多個物體進行準確的位置排放,但是這些工具只是限制在線形的排列上,在AE中我們可以使用表達式來完成一些非線形的排列,在這個例子中我們將修改前一個例子中的表達式來完成一些非線形的圖形排列。
在上一個例子的表達式中,我們是用時間來驅動圖層的旋轉角度動畫,在這個例子中我們將使用圖層的層序號來控制角度的變化,當圖層序號增角度加時,旋轉角度也會隨著改變,引起圖層位置的變化。所以再復制圖層時,他們就會準確的排列成一個圓周:
layer_num=index-1;
interval=30;
angle=degrees_to_radians(layer_num*interval);
我們之所以要將圖層序號減1是因為需要將圖層序號從零開始記數,這樣我們得到的第一個圖層就位于0度角(相對于水平位置)。這僅僅是個人喜好,不是表達式中必須的語句。
"interval"決定相臨圖層之間的偏差角度,將圖層的序號乘以30后,我們就會得到一系列的角度偏差值(0,30,60……),最后使用一個進制轉換函數degrees_to_radians()將度轉換為弧度。
最終的效果就是序號為1的圖層位于圓周零度角的位置上,序號為2的圖層位于30度角的位置上,依此類推。下面的動畫就是復制第一個圖層后的效果:
當復制了足夠多的圖層時,他們舊會準確的排列在圓周上,我們還可以使用動畫菜單中關鍵幀助手下的'Convert
Expression to Keyframes' (將表達式轉換為關鍵幀)的方法將表達式替換為關鍵幀。這樣我們就可以在不影響表達式的情況下自由為圖層設置動畫。
當然,使用這種方法進行排列圖層是有些麻煩,但是對于復雜的圖層來說確實是一項非常了不起的實用技術。
下面就是完整的表達式:
center=this_comp.layer("Center").position;
radius=80;
interval=30;
layer_num=index-1;
angle=degrees_to_radians(layer_num*interval);
x=radius*Math.cos(angle);
y=radius*Math.sin(angle);
add(center, [x, y]);
單擊這里
下載工程文件 (Windows 用戶單擊這里)
|