數碼資源網

文章頻道 軟件下載 安卓下載 蘋果下載

當前位置:首頁文章中心後期專欄After Effects → 構建3D粒子發生器

構建3D粒子發生器

時間:2005-06-09 02:34:28人氣:167作者:網友整理
酷玩魔幻粒子安卓版v1.4 免費版
酷玩魔幻粒子安卓版v1.4 免費版 for Android
  • 類型:飛行射擊大小:11.94M語言:簡體中文 評分:3.0
  • 炫酷華麗的特效是酷玩魔幻粒子安卓版的代名詞,這款Android手機休閑遊戲讓你知...
立即下載
魔幻粒子3D3.4.6
魔幻粒子3D3.4.6 for Android
  • 類型:安卓日常應用大小:58.10M語言:簡體中文 評分:4.3
  • 魔幻粒子3D軟件是一款具有魔幻色彩的圖片視頻類手機軟件。並且最新版本還加入了錄屏...
立即下載
炫彩粒子3D版v1.7
炫彩粒子3D版v1.7 for Android
  • 類型:休閑益智大小:17.53M語言:簡體中文 評分:3.1
  • 炫彩粒子3D版是一款極具創意和視覺衝擊力的休閑益智遊戲。在遊戲中,玩家將操控各種...
立即下載
在After Effects 5.5中使用表達式構建複雜的3D粒子發生器,可以通過控製粒子的初速度、地心引力、風力、空氣阻力等。使用創建好的粒子發生器,可以創建爆炸,煙火,火焰,飄,以及液體流動的效果
構建3D粒子發生器的基本思想是先製作一個單一粒子圖像,將它輸入到合成中,然後使它為3D合成。對此粒子應用物理學模擬表達式,設置表達式,使每一粒子(每一層)隨機地改變位置(position)、大小(scale)、不透明度(opacity)和旋轉(rotation)等屬性,然後複製粘貼該層若幹次,以得到逼真的效果。
 1.3D粒子發生器的構建
從創建一個粒子開始,然後給粒子附上表達式,使粒子的位置、大小、不透明度和旋轉隨機變化,以產生一個爆炸效果。
1.1製作單個粒子
新建一個項目文件,建立一個640X480、長度為4秒、名為star的合成,將Advanced標簽上的Rendering Plug-in設置為Advanced 3D。 輸入一張在PhotoShop中之作好的如圖1所示的圖片(大小128X128,名為star.psd,圖片規格以下相同):

將圖片拖到顯示窗口中,將其定位在大約(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粒子發生器,隻要發揮自己的想象,通過控製粒子的初速度、地心引力、風力、空氣阻力等,可以創造出自己所需的各種效果。

相關文章

感謝速聯科技、八度網絡、九九數據、億恩科技、群英網絡讚助部分帶寬!

關於本站 | 聯係方式 | 版權聲明 | 下載幫助(?) | 網站地圖

Copyright 2002-2020 95262.com 【數碼資源網】 版權所有 粵ICP備2020128507號-1

本站所有軟件來自互聯網,版權歸原著所有。如有侵權,敬請來信告知 ,我們將及時撤銷。