Maya群组动画实现思路探讨(一)
http://tech.ddvip.com 2007年09月01日 社区交流
内容摘要:Maya群组动画实现思路探讨
(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肯定不会有什么角度透视的问题,控制***度会更大,我们将测试几个不同动作之间的切换,以及配合当前动作,如何影响粒子在表面的移动速度。
责编:豆豆技术应用