数码资源网·下载

展开

构建3D粒子发生器

作者:网友整理
酷玩魔幻粒子安卓版v1.4 免费版

酷玩魔幻粒子安卓版v1.4 免费版 11.94M / 简体中文

点击下载
魔幻粒子3D3.3.6

魔幻粒子3D3.3.6 52.49M / 简体中文

点击下载
炫彩粒子3D版v1.7

炫彩粒子3D版v1.7 17.53M / 简体中文

点击下载
在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粒子发生器,只要发挥自己的想象,通过控制粒子的初速度、地心引力、风力、空气阻力等,可以创造出自己所需的各种效果。

加载全部内容

相关文章
相关专题