因为需要,查看了些资料,制作了动态的龙卷风,先看效果。
首先画一条曲线,不要分太多的段,对其进行从建,如下图。作用会在下面讲到。并将曲线改名为axis
制作一段骨骼,并给骨骼一个线条IK,将曲线绑定到骨骼上.利用骨骼运动带动曲线运动.大家可以用簇变形来做,怎么做大家都会吧.要将每个蔟子化到梗骨骼上,方便整体运动.如图
下面,关键时刻到了.建立一个粒子发射器.简单的进行设置,如图
现在给粒子的位置属性设置表达式:
float $para=sin(1.57*particleShape1.age/particleShape1.lifespan);
float $poi[]=`pointOnCurve -pr $para -p axis`;
float $rad=0.6+pow(particleShape1.age/1.5,6);
float $ang=particleShape1.age*3+(particleShape1.particleId+rand(0.1,0.3))*0.25;
float $x=$rad*sin($ang);
float $z=$rad*cos($ang);
particleShape1.position=<<($x+$poi[0]),$poi[1],($z+$poi[2])>>;
然后对梗骨骼的位移进行动画,龙卷风就会跑起来.下面,我来对表达式进行解释.
float $para=sin(1.57*particleShape1.age/particleShape1.lifespan);
这句大家可以发现"particleShape1.age/particleShape1.lifespan",
particleShape1.age的值是从0到particleShape1.lifespan,而particleShape1.lifespan的值始终是2,不变,所以"particleShape1.age/particleShape1.lifespan"的值就是从0到1,而1.57是弧度值对应的角度值是90度.所以
"$para=sin(1.57*particleShape1.age/particleShape1.lifespan)"的值就是从0到1,这是粒子中常用的技巧.而第2句
float $poi[]=`pointOnCurve -pr $para -p axis`利用到了$para,我来解释下这句,pointOnCurve是个获得曲线信息的命令 -pr是曲线参数命令,后面跟的是个数 ,而$para的范围正好覆盖了整个曲线,0-1(因为重建曲线时已经标总化,大家可以回头看看) -p 得到的是每个点的空间坐标,是个失量,axis是曲线名,必须跟在后面.然后将得到的每个点的空间位置存在一个数组$poi[]中.记住加单引号,是ESC键下面那个,别搞错了.
这样就找到了曲线上每点的空间位置信息.float $x=$rad*sin($ang);
float $z=$rad*cos($ang);这两句比较好理解,是圆周运动必要的.前面的
$rad是半径.float $rad=0.6+pow(particleShape1.age/1.5,6);用一个函数定义了半径的变化,也就是龙卷风从下到上的半径变化.为什么用这么一个函数呢?因为他的曲线符合我的要求,你们也可以用别的函数来定义.
a越大,龙卷风的半径越大,b越大转弯处离根部越远,N越大则转弯越急.
float $ang=particleShape1.age*3+(particleShape1.particleId+rand(0.1,0.3))*0.25;
这句很明显,particleShape1.age*3是让粒子持续运动,(particleShape1.particleId+rand(0.1,0.3))*0.25;是让每个粒子的初始转角不同,这样才会行成面,不会是线.particleShape1.particleId大家都知道吧,每个粒子的都不同.
particleShape1.position=<<($x+$poi[0]),$poi[1],($z+$poi[2])>>; 最后将粒子自身定义的运动与曲线上点的位置叠加就可以了.我只是给大家一个思路,大家自己回理解的.