Maya硬件渲染粒子与软件渲染元素结合(5)

4/5/2006来源:Maya教程人气:8465

Maya硬件渲染粒子与软件渲染元素结合
V.创建尘土粒子外观

  SPRites-调整spriteScale和Twist

  效果开始合成一起,但是还有改进的余地。当创建一个sprite基础上的效果的时候,sprites顶部每个分层都赋予它最终效果。利用不同的缩放值和扭曲值并在此基础上动画,可添加角色到模拟。

  为粒子物体添加以下的动力学属性,方法和你添加spritNumPP属性一样:

spriteScaleXPP

spriteScaleYPP

spriteTwistPP

  在AddAttibute窗口New栏目里,保留Float,PerParticle属性添加以下属性:

randXPP

randYPP

randTwistPP

spriteTwistMultPP

spriteScaleMultPP

  给spriteTwistMultPP和spriteScaleMultPP贴上凹凸贴图,重新命名这些贴图,名字要能正确反映他们要连接的属性,可以命名为spriteTwistramp,spriteScaleRamp等等。反过来,于spriteTwistMultPP有联系的rump贴图,底端设为black,顶端设为white。

  打开粒子物体需要的creationExpression并键入:

//generaterandomnumbersforXandX

//

float$randx=rand(0.3,1.3)

float$randy=rand(0.8,1.2)

//storearandomnumberforXandY

//

//

randXPP=$randx

randYPP=$randY

//setspriteScaleXPPandSpriteYPP

//

spriteScaleXPP=0

spriteScaleYPP=0

//setrandTwistPP

//

randTwistPP=rand(-180,180)

  每个粒子X,Y,Twist的数值都是任意指派的,这些值会赋予每个粒子独特的特征,并会被用在RuntimeExpression里。既然我们用rand功能生成值并且边缘功能返回结果总是不一样,那么,我们就在单粒子属性里保存这些值,以便以后使用。

  用rump给spriteTwistMultPP和spriteScaleMultPP贴图,也可将它们作为增效器,并给我们一个插值,但是,能否给我们一个interpolation,那就要看粒子的年龄如何。可以用常规表达式控制扭曲和放缩值,但是在控制基于时间的属性改变上,增加一个由rump控制的乘数,会给我们更大的控制灵活性。

  为什么用0值初始化spriteScaleYPP和spriteScaleYPP?因为cg/image/的一个bug,rump在Creation上没有正确估算,产生了不可预料的结果。

  打开粒子物体需要的RuntimeExpression并键入:

//setspriteScaleXPPandspriteScaleYPP

//

spriteScaleXPP=spriteScalex*spriteScaleMultPP*randXPP;

spriteScaleYPP=spriteXcaleY*spriteScaleMultPP*randYPP*randXPP

  为sprite渲染类型创建默认属性时,cg/image/添加了一个spriteScaleX,spriteScaleY和spriteTwist属性。如果没有这些属性的单粒子版本,比如spriteScaleXPP,cg/image/就会用scalar属性代替,例如spriteScale。既然有了这些属性的单粒子版本,缩放版本就被忽略了。我不忽略它们,在全局增效器中,我习惯用他们作为表达式的一部分。用一个你众所周知的属性名字,这个名字不仅用在保存创建一个新属性阶段(作为增效器),也展示给使用者一个属性——具有相似的方式相似的功能。在通道盒里改变spriteScaleX或spriteScaleY,这会改变粒子总值。

在下面一行中:

spriteScaleXPP=spriteScaleY*spriteScaleMultPP*randYPP*randXPP;

spriteScaleYPP和spriteScaleXPP的值大体相当,回到creationexpression,randYPP,随意初始化一个值——0.8至1.2之间,这会导致sprite在x轴成矩形的—— /-20。

  添加下面几行到runtimeExpression:

//spriteTwistPP

//

spriteTwistPP =spriteTwistMultPP*sign(spriteTwistPP)*spriteTwist;

  如果值是正的,用sign功能返回1;如果值是负的,用sign功能返回-1。spriteTwist属性是用用默认Sprite属性创建的,在这种情况下,我们添加它的值到当前sprite的twist上,引起sprite每帧旋转。利用spriteTwistMultPP,你可以改变每个spritetwist的速率,sprite越大,自转越慢。

  此时,你可以开始回放场景,交互式地调整被当作spriteTwist,spriteScaleX和spriteSclaeY属性创建的rmaps值。该阶段有很大的扭曲空间,要得到sprites正确的缩放和扭曲值需要花点时间,但是,利用ramp贴图,就可以创建一些非常有趣的效果。

  打开尘土粒子属性编辑器,在AddDynamicAttribute栏点击Opacity按钮。

1、为透明度创建PerObject和PerParticle属性

2、点击color按钮,为色彩添加PerParticle属性

3、点击General按钮,作为Float,PerParticle添加属性:

intensityPP

opacityOrgPP

opacityMultPP

4、用ramp贴图为opacityMulPP贴图,正确重新命名。

5、在creation表达式中键入

//opacityPP

//

opacityOrgPP=rand(0.1,0.4)

opacityPP=0

  用相对较低的值初始化透明度,该值保存在opacityOrgPP里,Runtime表达式要用到它。

既然spriteScaleXPP和spriteScaleYPP属性已经设置0,当sprite缩放到0并无法看见时,就没有必要初始化opacityPP一个值。