|
(3)然后就对粒子的运动和序列桢调用情况进行控制。这里我们主要测试序列桢的分别调用,运动没做过多的控制,只是让他们随机的左右移动。自定义一批控制属性,把sprite的一些需要的隐藏属性调出来。如图1-8所示  (4)我们计算的原理是这样的,创建两个Locator,分别点约束与目标摄像机的摄像机位置和目标位置。利用两个Locator的连线计算摄像机与水平方向的夹角,然后再计算摄像机与每个粒子的连线与水平方向的夹角。两个夹角的差值就是每个粒子于画面中心的夹角,把这个夹角的范围分为五份分别调入五个不同角度序列。如图1-9  (5) 表达式如下: Create expression(创建表达式) //赋予离子生命值 particleShape1.lifespanPP=20; //粒子生成后在nurbs表面随机分布 particleShape1.goalV=particleShape1.parentV; particleShape1.goalU=particleShape1.parentU; //赋予粒子大小随机值 particleShape1.spriteScaleYPP=rand(3.1,3.5); //将粒子随即分为两部分,一部分向左走,一部分向右走 particleShape1.Rand=rand(-1,1); //一部分向右走,横向缩放值等与纵向缩放值 if(particleShape1.Rand<0) particleShape1.spriteScaleXPP=particleShape1.spriteScaleYPP; //一部分向左走,当然走的姿势相应要镜像过来。 else particleShape1.spriteScaleXPP=particleShape1.spriteScaleYPP*-1; //面片整体偏移到地面之上,偏移量就是Y轴放缩的1/2。 particleShape1.goalOffset=<<0,particleShape1.spriteScaleYPP/2,0>>; //随即载入步伐循环的任意一个姿势 particleShape1.orig=rand(24); //获取摄像机那边的Locator的世界坐标值 Runtime expression:(运行表达式) //粒子如果移动到nurbs平面的边缘,就消失掉。 if(particleShape1.goalU>0.98||particleShape1.goalU<0.02||particleShape1.goalV>0.98||particleShape1.goalV<0.02) particleShape1.lifespanPP=0; //粒子在表面的移动速度,可以修改0.002这个数值来调整移动的快慢 particleShape1.goalU+=0.002*particleShape1.Rand; //贴图序列向前走 particleShape1.orig+=1; //每到25的倍数桢就循环到0桢 particleShape1.orig%=25; //以下部分为创建表达式与运行表达式都有的部分 vector $CL=<<CL.translateX,CL.translateY,CL.translateZ>>; //获取摄像机目标点的Locator的世界坐标值 vector $AL=<<AL.translateX,AL.translateY,AL.translateZ>>; //获取每个粒子的世界坐标值 vector $Pw=particleShape1.worldPosition; //算出摄像机与目标点连线与Z轴的夹角 float $anglec=angle(<<0,0,1>>,($CL-$AL)); //算出摄像机与每个粒子连线与Z轴的夹角 float $anglep=angle(<<0,0,1>>,($CL-$Pw)); //获得这个夹角的差值,并将这个范围在-15—15度(测试得到)之间分为五份(0-4) particleShape1.cyclenum=4*linstep(-15,15,rad_to_deg($anglec-$anglep)); //获得这个范围Id的整数部分。 int $num=trunc(particleShape1.cyclenum); //根据这五部分的0-4,分别载入整个序列分为的五部分 switch($num) {case 0: //载入序列的第一部分 particleShape1.spriteNumPP=particleShape1.orig; break; case 1: //载入序列的第二部分,与当前第一部分序列向后偏移25桢 particleShape1.spriteNumPP=particleShape1.orig+25; break; case 2: //载入序列的第二部分,与当前第一部分序列向后偏移50桢 particleShape1.spriteNumPP=particleShape1.orig+50; break; case 3: //载入序列的第二部分,与当前第一部分序列向后偏移75桢 particleShape1.spriteNumPP=particleShape1.orig+75; break; case 4: //载入序列的第二部分,与当前第一部分序列向后偏移100桢 particleShape1.spriteNumPP=particleShape1.orig+100; break;}
(6) 最终我们要实现的效果如图1-11所示,粒子所带数字为每套序列的ID号,即cyclenum得值。  (7)最终实现效果如图1-12所示  (8)这是对此方法的初次尝试,有什么不足的地方,或者更加完善的思路与方法,还望各位多多指教。下一部分我们再来测试一下 InstanceParticle(实物粒子)的动作控制,Instance肯定不会有什么角度透视的问题,控制***度会更大,我们将测试几个不同动作之间的切换,以及配合当前动作,如何影响粒子在表面的移动速度。
上一页 [1] [2] [3] [4]
|