使用Maya7粒子动力学新属性goalWorldPositionPP,制作有趣的效果。在Maya7里新增加了一些粒子属性,使用这些属性可以得到相应的信息,使对粒子有更多和更方便的控制。在这里我们来利用goalWorldPositionPP来制作一个类似某种动力场的效果。
1) 首先在场里建立一个locator,命名为freezeField。再建立一个球体,命名为fieldRange。并把球体点约束到locator上。选择freezeField给其增加属性fieldSize。在连接编辑器里,连接freezeField的fieldSize属性到fieldRange的ScaleXYZ上。如图所示。

2) 建立一个粒子发射器,将类型设置成为Directional,并设置Spread为1。如图所示

3) 选择粒子和freezeField执行命令particl>Goal。如图所示。

4) 打开粒子属性编辑器,展开Goal Weights and Objects栏,点击Create goalWeight0PP和Create goalWorldPosition0PP属性。这样就增加了新属性到每粒子属性里。然后在Per Particle(Array) Attributes栏下的goalWeight0PP上点击右键,增加粒子表达式。在表达式里添加下列语句。(particleShape1.goalWeight0PP=0;)如图所示。

5) 在表达式编辑器里切换创建类型为Runtime before Dynamics。在文本框里添加下列语句。
vector $goal0Pos=particleShape1.goalWorldPosition0PP;
vector $pos=particleShape1.position;
用一个$goal0Pos矢量变量得到目标物体在世界坐标轴里的位置。$pos得到运行时粒子在场景里的位置。
float $range0=.5*freezeField0.fieldSize;
vector $distance0=<<$range0,$range0,$range0>>;
$range0是目标作用的范围。
vector $velo=particleShape1.velocity;
$velo得到粒子的速度。
if ((abs($pos-$goal0Pos)<$distance0))
$velo=0;
particleShape1.velocity=$velo;
这一条件语句的作用是用粒子在运动的位置值减去目标的位置值,如果这个值小于目标作用的范围就说明粒子运动到了目标物体所在的位置了,这时设置粒子的速度为0。
如图所示。

6) 将freezeField放置到粒子运动的路径上就可以看到效果了。当粒子运动到球体的位置里就会停下来,这个球体仅代表的是freezeField作用的范围。如图所示。