首页 百科知识 粒子替换基础

粒子替换基础

时间:2023-10-16 百科知识 版权反馈
【摘要】:下面我们就看看如何旋转它,选择粒子隐藏它,然后看看属性面板:要想让箭头方向指向粒子的运动速度方向,就在上面的面板里面设置就可以了,也就是使AimDirection指向Velocity:好了,万箭齐发做好了,在这里只需要将替代物的指向调整为粒子的运动方向就可以了,非常简单也非常有效。

第一节 粒子替换基础

为了学习粒子替换的基本工作原理,我们就制作电影《英雄》里面的万箭齐发的动画。

在场景里面建造一只箭(如作图),这之间将会替换粒子用。

img175

请注意这个模型的自身坐标:X轴方向指向自身的正方向,Y轴指向世界坐标的Y轴方向。且位于世界坐标的中心。

接下来,在场景里面创建一个面,用来发射粒子,然后给粒子一个重力场,创造出万箭齐发,受重力下落的粒子动画:

首先,创建一个面,放大并显示其表面信息,法线方向就是粒子发射的方向。

img176

使用Display →NurbsComponent →SurfaceOrigins可以显示表面信息;

img177

选择表面,使用Particle→EmitFromObject来使用面发射粒子,具体参数如图设置:

img178

为粒子添加重力场,产生逼真的箭的运动轨迹:

img179

最后就是将粒子替换成箭了,选择那只箭,使用菜单Particle→instancer制造替换物:

img180

替换物编辑窗口设置:

img181

效果如下:

img182

现在,每一个粒子上面都出现了一只箭,箭的自身坐标正好落在粒子上面(这就是为什么要把箭的坐标放在后面了)。箭是替换上了,但是箭头的方向好像不对,应该每一只箭都指向自身的速度的切线方向。下面我们就看看如何旋转它,选择粒子隐藏它,然后看看属性面板:

可以发现Instancer栏目可用了,里面的参数功能大致如下:

img183

Position样品物体的位置。

Scale样品物体的缩放。

Shear样品物体的修剪。

Visibility设置样品物体显示是打开还是关闭。

ObjectIndex设置 In stancedObjects列表中哪个物体作为每个粒子的样品。

RotationType从样品物体中,用户可选择其中的一种方式去设置它们的方向:

Rotation设置样品物体相对于它最初方向的方向

AimDirection指定每个样品物体指向的方向。

AimPosition指定每个样品物体指向的位置。

AimAxis指定指向时使用的的轴。

AimUpAxis指定物体中指向“Up”方向的轴。

AimWorldUp设置AimUpAxis所使用的表明“Up”方向的轴。

要想让箭头方向指向粒子的运动速度方向,就在上面的面板里面设置就可以了,也就是使AimDirection指向Velocity(默认的maya使用物体的X轴作为指向轴,这也是为什么要使箭的自身轴X指向箭头方向了):

img184

效果如下:

img185

好了,万箭齐发做好了,在这里只需要将替代物的指向(AimDirection)调整为粒子的运动方向(Velocity)就可以了,非常简单也非常有效。

但是,如果我做的不是万箭齐发,而是满天的落叶呢?叶子是随机旋转的又应该怎么设置呢?

下面我们就来制作一个满天落叶的动画,首先还是创建一个新的场景,制造一个叶子的模型,并且将自身坐标轴设置好,并放置在世界坐标轴的中心:

img186

同样的,还是制作一个面来发射粒子,这次是把面放到天空,让粒子从天而降,这里把粒子发射的速度设置为0,为粒子添加重力场(让叶子落下来)和混乱场(让粒子在天空混乱一点):

img187

接下来,选择叶子的模型,使用Instencer命令(默认选项),创建替代物,于是满天飞舞的粒子变成了树叶:

img188

树叶在下落的时候应该是:

1.每片树叶是不同的,大小,形状都不一样;

2.每片树叶的动作都不一样,旋转,速度方向不一样。

现在所有的树叶大小都一样,形状一样,动作也都一样。所以我们开始解决这些问题,这些问题完全可以通过属性面板里面的参数解决:

1.Scale控制每个粒子的缩放大小,(给每个粒子一个不同的缩放值)。

2.shear控制每个粒子的裁减形状,(给每个粒子一个不同的裁减值)。

3.Rotation控制每个粒子的旋转,(这个比较麻烦,要使得粒子在运动的时候随着速度的变化而旋转,并且每个树叶的运动状态不一样,旋转也不一样。我们可以为每个粒子的开始时刻设置一个随机的旋转角度,然后在粒子运动的时候将这个起始值和粒子的运动方向相乘,这样就会不停的转动了。当然了,当粒子落在地面上的时候就停止转动了所以还需要一个停止旋转的角度。)

所以我们为粒子添加PerParticle属性:scale_PP、share_PP、Rotation_start、Rotation_going、Rotation_stop:

到Instancer属性栏里面,我们将Scale、Share、Rotation的属性连接成为我们添加的PerParticle属性(注意必须选择AlowAllDataType才可以找得到自己添加的属性)。

接下来就是自己为这些属性添加表达式,来符合我们想要的效果了:

img190

为了能够产生大小不同的树叶,我们就希望Scale连接的是每一个粒子都不同的数值,所以scale_pp的表达式就是:scale_pp=rand(0.5,1.5),这样发射出来的叶片就不会是一样大小的了,而是最大为1.5倍,最小0.5倍的树叶了(注意这里是CreationExpression,因为这个值是不需要每一帧都改变的):

img191

为了能够产生形状不同的树叶,我们就希望share连接的是每一个粒子都不同的数值,所以share_pp的表达式就是:share_pp=<<rand(1),rand(1),rand(1)>>,这样发射出来的叶片就不会是一样大小的了,而是在XYZ轴上面都被随机裁减了1(注意这里是CreationExpression,因为这个值是不需要每一帧都改变的):

img193

可以看到,树叶的形状和大小都已经不一样了。接下来是搞定树叶的旋转:

首先是粒子在出现的瞬间有一个随机的,每个粒子的不一样的旋转角度,然后在这个基础上改变,所以,在CreationExpression里面我们应该用一个表达式:

img194

用来初始化每一个粒子的不同的开始时的旋转角度,然后用

img195

使得树叶在运动的时候可以不断的改变旋转角度:

效果如下:

img196

好了,到这一步,漫天飞舞的树叶已经算是做好了,但是为了能够让树叶掉在地上停下来,我们对RunTime表达式作一下调整:

img197

img198

这里,我们利用粒子的Y轴位置来判断粒子是否落地了,然后落地以后就不再下落了,使用particleShape1.position=<<$pos.x,0,$pos.z>>,让粒子保持在地面上,使用particleShape1.velocity=0来使得粒子无法运动。

最终效果如下:

img199

最终,我们完成了树叶飞舞下落的动画了,是不是很Cool呢?到现在为止,都还只是替换一个单一的模型,怎样将一个动画的对象替换粒子呢?也就是影片《指环王》里面的那种摄像机划过天空,下面是成群的士兵冲锋的场面?

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈