將圖片拖到顯示窗口中,將其定位在大約(380,80)的位置,它是粒子爆炸的初始位置。
1.2加入粒子控製效果(Effect)
單擊選擇時間線窗口中star.psd層3D Layer方框,使該層具有3D效果。選擇star.psd層,單擊鼠標右鍵,彈出菜單中選擇Effect\Expression Controls\Point Control,在star.psd層下加入一個Point Control的特效。選擇Point Control,按回車鍵,將Point Control重新命名“lift”。
在這裏用point control代替slider control ,是為了設置“lift”的屬性值,因為在以後重複使用粒子時,需要傳遞“life”和“birth”使用次數,並且,birth和life的計算必須在使它所處層的同一個表達式內完成。
1.3加入一個null層
在時間線窗口中的空白處單擊鼠標右鍵,彈出菜單中選擇New\Null Object,即在時間線窗口中加入一個名為Null 1的層。將用Null 1層作為爆炸的中心,在表達式中引用它作為粒子發射器(emitter),然後運動null,以給予發射器粒子速度(emitter velocity)。
選擇Null 1層,將顯示窗口中的虛線框拖到星形圖像上,使爆炸以此處作為中心。
單擊Null 1層的3D Layer方框,使該層也具有3D效果。單擊Null 1層的Video圖標(“眼睛”圖標),使虛線框不在顯示窗口中出現。 將Null 1層拖到star.psd層下麵。
1.4加入Point控製表達式
展開star.psd層下的Effects,選擇life下的Point,按Shift+Alt+=快捷鍵,在表達式輸入窗口中輸入以下內容:
lmin = 1.5; //最小粒子壽命
lmax = 2.5; //最大粒子壽命
seed_random(1,true);
life=random(lmin,lmax);
birth=0;
[birth,life]
此表達式將為1.5和2.5秒之間的粒子產生一個隨機生命值,此值將被插入到life變量的秒元素中。第一個元素(birth)設置為零,因對於爆炸開始,所有的粒子在零時間產生。seed_random(1,true)和life=random(lmin,lmax)函數使life獲取一個隨機值,其中,1是star.psd層所處的位置序號。如果想改變粒子的生命值,隻是改變lmin和lmax值。
1.5加入Position控製表達式
展開Transform,選擇Position,按Shift+Alt+=快捷鍵,在表達式輸入窗口中輸入以下內容:
vmin=500; //最小初速度
vmax=700; //最大初速度
birth=effect("life").param("Point")[0];
life=effect("life").param("Point")[1];
origin=this_comp.layer("Null 1").position.value_at_time(birth);
age=time-birth;
seed_random(1,true);
s=random(vmin,vmax);// 初速
a=degrees_to_radians(random(180)); //垂直角度
r=degrees_to_radians(random(360)) //圍繞y坐標軸旋轉
x=s*Math.sin(a)*Math.cos(r);
y=-s*Math.cos(a);
z=s*Math.sin(a)*Math.sin(r);
v=[x,y,z];
origin + v*time
這是爆炸的基本位置表達式,粒子在三維空間中從起點(null層的位置)以隨機方向用500和700單位(它大概折合為每秒多少像素)之間的初速度發射。該粒子繼續以該速度和方向發射,直到它消失。我們還沒有風(wind)、地心引力(gravity)和阻力(drag)力的因素。使用javas cript三角函數計算粒子速度向量的x、y和z分量的三行,向量由速度(s)、垂直發射角(a)以及和合成有關的y軸旋轉(r)的隨機值產生。不必太多擔心在這一點上的所有的這些向量,如果不必知道它如何工作,可以閱讀After Effects 5.5表達式有關內容,現在,隻需改變“vmin” 和 “vmax”值,以改變粒子的初始速度。可以為垂直角度增加一個控製,使產生噴泉一樣的粒子噴射。
1.6加入Scale控製表達式
選擇Scale,按Shift+Alt+=快捷鍵,在表達式輸入窗口中輸入以下內容:
max_scale=50; //最大縮放尺寸
s=.2; //調整向上斜坡的時間大小
life=effect("life").param("Point")[1];
age=time-effect("life").param("Point")[0]; //參見前麵age=time-birth
if (age<s){
x=(age/s)*max_scale;
[x,x,100]
}else{
[max_scale,max_scale,100]
}
表達式作用是在s(這裏是0.2秒鍾)定義的期間內從0到max_scale中指定的值(這裏是50)均勻縮放。如果需要粒子到達最大縮放的時間更快或更慢,隻需改變s值,注意,如果要粒子在它消逝前到達實際大小,此值應小於life表達式的lmin。
(表達式中未顯示的地方,發圖片)
1.7加入Z rotation控製表達式
選擇Z rotation,按Shift+Alt+=快捷鍵,在表達式輸入窗口中輸入以下內容:
rmax=1080; //最大旋轉角度
rmin=-1080; //最小旋轉角度
birth=effect("life").param("Point")[0];
seed_random(1,true);
r=random(rmin,rmax);
life=effect("life").param("Point")[1];
age=time-birth;
if(life==0){
0
}else{
r/life*age
}
表達式產生一個在粒子的生命期間內圍繞Z軸旋轉的隨機值(在-1080度和+1080度之間)。注意,此表達式使用life控製中的birth和life值, 以及seed_random函數的使用,弄清楚,選擇的隨機旋轉值仍然與每次計算表達式的值相同。如果要改變粒子旋轉值大小,隻需改變rmax和rmin值。
1.8加入Opacity控製表達式
選擇Opacity,按Shift+Alt+=快捷鍵,在表達式輸入窗口中輸入以下內容:
decay=.75; //粒子淡出時間
max_opacity=100; //最大不透明度
life=effect("life").param("Point")[1];
age=time-effect("life").param("Point")[0];
if (age>life){
0
}else{
if (age > life-decay){
((life-age)/decay)*max_opacity;
}else{
max_opacity
}
}
表達式控製粒子淡出,“decay”是以秒鍾為單位的時間,淡出持續的時間。要改變淡出時間,隻需改變此值。 此值應小於“life” 控製的“lmin” 值。max_opacity是可能期望的需要粒子達到的最大不透明(opacity)值。
1.9形成爆炸效果
選擇star.psd層,複製該層,然後按Ctrl+d 約60次,生成至少50個粒子。預覽合成,得到如圖2所示的效果。
圖 2 爆炸效果的預覽圖
點擊放大
現在的3D爆炸,粒子隻是沿各個方向爆炸,要獲得逼真的爆炸效果,還需增加一些其它作用力。
2. 3D粒子發生器的改進
2.1增加物理學效果
現在,新建一個與前麵設置相同的合成,命名為physics_styles explosion。內容與star合成相同,隻是增加風、地心引力、空氣阻力和發射器速度的物理學效果到位置(position)表達式。選擇physics_styles explosion合成,展開star.psd層,選擇Position,表達式輸入窗口中輸入以下代碼(原來的代碼被覆蓋):
g=100; //地心引力
w=0; //風
wdir=0; //風方向 (0 = 從左邊吹風)
vmin=700; //最小初始速度
vmax=1000; //最大初始速度
amin=0; //最小垂直發射角
amax=110; //最大垂直發射角
d=4; //空氣阻力係數
birth=effect("life").param("Point")[0];
life=effect("life").param("Point")[1];
origin=this_comp.layer("Null 1").position.value_at_time(birth);
age=time-birth;
seed_random(1,true);
s=random(vmin,vmax);// 初始速度
v_e=this_comp.layer("Null 1").position.velocity_at_time(birth); //發射器速度
a=degrees_to_radians(random(amin,amax)); //垂直角
r=degrees_to_radians(random(360)) //繞y軸旋轉
x=s*Math.sin(a)*Math.cos(r);
y=-s*Math.cos(a);
z=s*Math.sin(a)*Math.sin(r);
v=[x,y,z]+v_e;
new_speed=length(v);
unit_v=normalize(v);
if (d>0){
delta_p=new_speed*(1-Math.exp(-d*age))/d;
}else{
delta_p=age*new_speed;
}
delta_w=w*age;
delta_g=g*age*age/2;
wa=degrees_to_radians(wdir);
origin + delta_p*unit_v + [delta_w*Math.cos(wa),0,delta_w*Math.sin(wa)] + [0,delta_g,0]
預覽合成,效果如圖3所示。注意到粒子現在遇到空氣阻力,並受地形引力的作用,也限製粒子的垂直發射角在0和110度之間,效果逼真多了。
表達式中未顯示的地方見上麵的圖
圖 3 增加物理學爆炸效果的預覽圖
2.2粒子隨機不透明度變化
新建一個與前麵設置相同的合成,命名為twinkle explosion。內容與physics_styles explosion合成相同,隻是在point控製表達式中取消seed_random(1,true),使粒子的壽命隨機地打開或關閉不透明度(opacity),這樣,看起來效果相當好,預覽效果如圖4所示:
3.3D粒子發生器的的應用
3.1煙霧效果
新建一個與前麵設置相同的合成,命名為smoke。內容與physics_styles explosion合成相同,創建一些煙霧,以加到爆炸效果中。創建此合成隻是複製 “physics_styles explosion”合成,用“smoke.psd”圖像(如圖5所示)取代 “star.psd” 圖像:
圖5 煙霧效果單粒子圖片
表達式中需修改的參數:
Position中:
g=10; //地心引力
w=80; //風
Scale中: max_scale=150; //最大粒子大小
Z-rotation中:
rmax=10; //最大旋轉角度
rmin=-10; //最小旋轉角度
Opacity中:
decay=1.25; //粒子淡出時間
max_opacity=50; //最大不透明度
也需將該層的Transfer Mode從 “normal” 變為 “screen”。 以煙霧的特點修改參數,減少地心引力,增加風力,減少z旋轉,每一個粒子的不透明最大為50%。隻複製粘貼該層40次左右。預覽該合成,效果如圖6所示:
圖6 煙霧效果預覽
3.2小粒子效果
在爆炸中,會產生一些小的煙粒,然後散開形成煙霧,這裏用小粒子模擬。新建一個與前麵設置相同的合成,命名為little_particles。內容與physics_styles explosion合成相同,創建此合成隻是複製 “physics_styles explosion”合成,用“little_particle.psd”圖像(如圖7所示,注意,圖中的點為白色)取代 “star.psd” 圖像:
圖7 小粒子圖片
表達式的修改,地心引力(gravity)為80,風(wind)為80,max_scale為75,Z旋轉(rotation)表達式為:
rmax=180; //最大旋轉角度
rmin=-180; //最大旋轉角度
seed_random(1,true);
random(rmin,rmax);
隻選擇一個180和-180度之間的隨機旋轉角。取消Opacity表達式,讓不透明度為100%。圖8是小粒子預覽效果:
圖8 小粒子預覽效果
3.3合成效果
新建一個與前麵設置相同的合成,命名為combo。該合成包含“star”、“smoke” 和 “little_particles” 合成,這是將不同的粒子類型組合在一起,以創建一個複雜的效果。注意,打開“Collapse Transformations”(“太陽”圖標),使三個合成的粒子能正確地在三維空間中混合。圖9是合成預覽效果:
圖9 合成預覽效果
圖9 合成預覽效果
4.粒子的再生
現在,使粒子可以重複使用,也就是說,在粒子消逝以後,需要它以不同的特征再生,好象它是一個新的粒子一樣。這樣,就可以產生一個連續不斷的粒子流,以模擬液體流動的效果。這需要修改life的point控製表達式,新的代碼為:
lmin = 1.5; //最小粒子壽命
lmax = 2.5; //最大粒子壽命
i=1;
seed_random(i,true);
delay=random(lmax);
birth=delay;
death=delay;
if(time<delay){
[0,0]
}else{
while (time >= death){
i += 1;
seed_random(i,true);
birth=death;
life=random(lmin,lmax);
death += life;
}
[birth,life]
}
在粒子生成前的第一個段,有一初始的隨機延遲,此延遲時間將是0和最大粒子壽命之間的隨機數,否則,所有最初產生的粒子會同時再生(象爆炸一樣)。表達式通過把時間線分成lmin和lmax之間的隨機長度時間段,每一個時間段表示粒子的一個新的壽命,要允許再生的粒子比原來的粒子有不同的特征,所以Position和Z旋轉表達式中的seed_random()變成:
seed_random(birth,true);
將粒子的產生時間用於seed,以形成不同粒子的壽命,因為粒子產生時間總是不同的。其它的改變是改變Position表達式中的amax(最大垂直發射角)參數值為30,以便所有的粒子以向同一方向發射。以下就利用粒子的再生製作水流效果。
新建一個與前麵設置相同的合成,命名為“fountain”。輸入一幅如圖10所示的背景圖,然後輸入粒子圖(透明背景上的一個小白點),然後設置包括上述以外的其餘表達式。注意,此合成包含150個粒子層(根據粒子大小增減),使得到較好的效果。
圖10 背景圖
Position與physics_styles explosion合成相同,隻是修改了一些參數,增加對發射器的控製,全部代碼為:
g=300; //地心引力
vmin=200; //最小初始速度
vmax=300; //最大初始速度
amin=90; //最小垂直發射角
amax=90; //最大垂直發射角
d=7; //阻力係數
ew=50; //發射器寬度
birth=effect("life").param("Point")[0];
life=effect("life").param("Point")[1];
seed_random(birth,true);
origin=this_comp.layer("Null 1").position.value_at_time(birth) + [random(-ew/2,ew/2),0,0];
if(life==0){
origin
}else{
age=time-birth;
v_e=this_comp.layer("Null 1").position.velocity_at_time(birth); //發射器速度
s=random(vmin,vmax);// 初始速度
a=degrees_to_radians(random(amin,amax));// 垂直角
r=degrees_to_radians(-90) //繞z軸旋轉
x=s*Math.sin(a)*Math.cos(r);
y=-s*Math.cos(a);
z=s*Math.sin(a)*Math.sin(r);
v=[x,y,z];
new_speed=length(v);
unit_v=normalize(v);
if (d>0){
delta_p=new_speed*(1-Math.exp(-d*age))/d;
}else{
delta_p=age*new_speed;
}
delta_w=w*age;
delta_g=g*age*age/2;
wa=degrees_to_radians(wdir);
origin + delta_p*unit_v + [delta_w*Math.cos(wa),0,delta_w*Math.sin(wa)] + [0,delta_g,0]
}
根據粒子大小改變max_scale 的值,也可以讓一些層為其它數值。scale表達式為:
max_scale=30;
s=.2;
birth=effect("life").param("Point")[0];
life=effect("life").param("Point")[1];
if(life==0){
[0,0,0]
}else{
age=time-birth;
if (age<s){
x=(age/s)*max_scale;
[x,x,100]
}else{
[max_scale,max_scale,100]
}
}
z rotation表達式為:
rmax=180;
rmin=-180;
birth=effect("life").param("Point")[0];
seed_random(birth,true);
random(rmin,rmax);
Opacity表達式為:
decay=.75;
max_opacity=50;
birth=effect("life").param("Point")[0];
life=effect("life").param("Point")[1];
age=time-birth;
if(life==0){
0
}else{
if (age>life){
0
}else{
if (age > life-decay){
((life-age)/decay)*max_opacity;
}else{
max_opacity
}
}
}
現在預覽動畫效果如圖11所示:
圖11 水流動畫效果
用此3D粒子發生器,隻要發揮自己的想象,通過控製粒子的初速度、地心引力、風力、空氣阻力等,可以創造出自己所需的各種效果。