首页 百科知识 粒子替换高级

粒子替换高级

时间:2022-10-16 百科知识 版权反馈
【摘要】:我们首先发现粒子的运行速度和模型动画的循环不合拍,我们可以通过调整CycleStepSize后面的参数来使得循环速度配合粒子的移动速度。为此在outliner里面选中Instancer1然后打开属性编辑器,修改创建时的设置:所以,如果可以为ObjectIndex选择一个针对每一个粒子的速度和替代物的大小的不同,而返回一个范围在0~19的数值的属性,那么,就完全可以做到:由于,循环的速度是受粒子的速度lifespanPP和替代物的大小scale_PP影响的,所以最终cycle_PP使用了这两个属性来影响最后的返回值。

第二节 粒子替换高级

上一节,我们基本掌握了粒子替代的使用方法和原理,粒子替代是用来制作群体动画的很好的手段,但是前面的所有实例都是使用单一的物体替换粒子,可是如果要替换一个正在走路的脚色模型怎么办。

接下来就模仿《指环王》里面的场景,制作很多真实的模型向一个方向走动的场景,我们使用前一章制作好的那个粒子朝一个方向移动的场景,将粒子替换成动画的角色,我们可以打开场景,将粒子发射器的发射量减少一点:

img200

接下来,导入我们将要用来替换的模型文件:

img201

可以看到,这里所有的模型其实是一个20帧的动画的每一帧的模型的快照。

注意:请将倒入的模型名称修改一下,不要有标点符号

接下来,依次选中第一帧到最后一帧的模型,然后选择Instancer命令,进入粒子替代的option对话窗口:

在这里,我们可以看到,在instancedObjects栏里面所有选择的模型名称都出现在里面了,并且被自动编号了,从0开始,到19,一共20个。

注意:第一个模型编号是0,也就是在这里其实是第0个。

img202

在这里,如图cycle(循环)选项里面,我们可以选择Sequential(按顺序循环),在CycleStepUnits(循环单位)里面选择Frame(以帧为单位),然后在CycleStepSize(循环时间)里面设置每经过多少帧循环到下一个模型,我们可以通过循环来使模型依次替代粒子,产生一个动画的替代物:

效果如下:

img203

确定以后,我们就将每一个粒子替换成为角色模型了,并且每一帧模型都会依次替换成为20帧动画的下一帧。最基本的动作已经做出来了,接下来就是细化,这才是最重要的工作。

我们首先发现粒子的运行速度和模型动画的循环不合拍,我们可以通过调整CycleStepSize(循环时间)后面的参数来使得循环速度配合粒子的移动速度。但是由于粒子的运动速度是每个都不一样的,所以很难保证每一个都配合得很好,所以暂时我们将粒子的生命周期调整为相同的(constan)这样粒子的速度就都一样了,我们后面再解决速度不一样如何使替换物动作配合粒子的移动速度。

接下来的一个问题是替代物的循环都是从第一帧的模型开始的,也就是第0个模型开始,所以显得脚步太整齐了。

所以我们可以给替代物的CycleStartObject(循环开始模型)一个随机值,并且这个随机值范围在0到19之间的数值。

img204

这个随机值依然应该是PerParticle属性值,所以我们自己创造一个PerParticle属性,取名为Cycle_start,给他一个rand(0,19)

img205

为这个属性添加的表达式:

img206

然后在CycleStartObject(循环开始模型)后面选择该属性就可以了:

img207

可以看到,这个群体动画可以完成得差不多了:

img208

最后处理一个细节问题:模型的大小不应该都一样,应该有大有小随机大小一点。所以为粒子添加可以个Scale_PP的自定义PerParticle矢量属性,然后给它一个在X,Y,Z轴上的随机值,然后在InstancerAtribute栏里面的scale选项里面选择它:

img209

所以,先添加PerParticle矢量属性,利用表达式赋值<<Rand(0.8,1.2),Rand(0.8,1.2),Rand(0.8,1.2)>>,这样,替代物的高矮胖瘦就会都有所不同:

创建自定义的:Scale_PP粒子属性:

img210

为这个属性添加的表达式:

img211

当然了,最后还要让替代物的方向指向粒子的速度方向:

img212

效果如下:

img213

好了,我们看上去好像是完成了这个动画了。如果你觉得OK了,那就直接跳过以下的内容吧。

在这里有两个问题:

1.粒子的运行速度都一样(因为我们把Lifespan设置成为了Constan)这样是为了容易使得替代物的走路循环动作和粒子移动的速度配合好,不至于产生过于明显的“滑步”情况,影响效果。

2.由于替代物的大小都不一样了,所以移动同样的距离,替代物的循环速度也不应该是一样的了。

综上所述:我们的粒子移动速度就是应该不一样,而且粒子替代物的循环速度也必须配合每一个粒子的速度和大小。

接下来,我们就开始解决这个问题,看来我们需要一个能够控制每一个粒子替代物循环速度的属性了,那么CycleStepSize(循环时间)看来是不能满足了。所以我们转而不使用Sequential(按顺序循环),而是使用ObjectIndex(替换物序列号)来手动控制每一个粒子在每一帧的时候的替代物的序列号。

img214

由于我们使用了Sequential(按顺序循环),所以现在ObjectIndex选项是不可用的,所以必须将Cycle选项改为None。为此在outliner里面选中Instancer1然后打开属性编辑器,修改创建时的设置:

img215

经过上面的操作,替代物就不再循环了,ObjectIndex选项已经可用了。

img216

所以,如果可以为ObjectIndex选择一个针对每一个粒子的速度和替代物的大小的不同,而返回一个范围在0~19的数值的属性,那么,就完全可以做到:

1.体积大的替代物循环得慢一点;(个子高,步伐就大,所以循环得慢一点)

2.速度快的粒子的替代物循环得快一点。(速度快,循环自然要快一点)

所以我们自定义一个PerParticle属性,名为:Cycle_PP:

img217

先将粒子的生命周期设置为LifespanPP模式:

img218

然后为LifespanPP属性写Creation表达式,返回一个随机值,这样粒子的速度就都不一样了:

img219

然后在ObjectIndex后面选择该属性(意味着每个粒子的替代物的序列号都由这个属性控制了):

img220

最后,就是这个属性的表达式是怎么写的了,在这里直接给出我自己写的表达式,然后再讨论为什么要这样写:

img221

由于,循环的速度是受粒子的速度lifespanPP和替代物的大小scale_PP影响的,所以最终cycle_PP使用了这两个属性来影响最后的返回值。

在这里,我们使用了一个个最常用的计算方式来返回循环的值就是:

frame%num;

%是一个计算符号,类似+-*/,他的作用是相除以后取余数,所以这个计算得到的结果就是:随着frame的增加,返回值是从0到num-1。

使用了:frame+particleShape1.particleId,那么返回值的起始值就都不一样,也就是起始动作就不一样;然后除以粒子的速度lifespanPP乘以替代物的大小scale_PP的信息,结果就是速度越快的循环越快,体积越大循环越慢:

最终的属性设置如下:

img222

最终效果和表达式:

img223

制作了一个相对满意的效果,最后的表达式里面的一些数据,需要按情况自己调整,以最终结果为导向,就可以。

如果读者感兴趣,可以将前一章制作的《蝙蝠侠》的粒子替换成蝙蝠。

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

我要反馈