暴雪国际动漫教育
  • 暴雪国际2024招生简章
  • 暴雪国际2024招生简章
  • 暴雪国际2024招生简章
  • 暴雪国际2024招生简章
在线咨询 预约课程 网上报名
Maya特效教程

Maya特效教程:Maya用particle的instancer模拟帆船

编辑:Penny来源:发布时间:2010-06-28
1、1instancer 基础
   要使用instancer必须先要准备好要替换的物体。这个物体需要朝向正确的方向,位移值,轴心点等必须归零,缩放值为1。这样做以后就不会发生不必要的麻烦,产生的结果才能和你预想的一样。
   maya的particle instancer功能是将要替换的物体固定在每个粒子上,这个物体并不是复制到每个粒子上的,而是用这个物体的外形替代了每个粒,所以称做“instance”。instancer并不会在场景中增加几何体。
  
   1.2 轴心和方向
  如果你在用instancer的时候出现问题了,首先检查:
   1 >.物体的轴心是不是处于原始的轴心上。
   2 >.轴向有没有与世界坐标的轴向对齐。
   3 >.物体的前进方向是否对准X轴。
   4 >.物体的transform值是否归0。
  如果没有归零,将方向,位置调整好,然后freeze transform。
   1.3 帆船的例子
  这个例子是一只帆船漂动在一个被wave变形的nurbs平面上,粒子被指定了一个简单的表达式,让它们沿着U方向前进。
  
   1)打开1_1instance_sailboat_base.mb这个场景文件。在这个文件里,实际上只有一只船,这么多的船其实都是粒子,使用instancer做的。船跟着粒子而动,那么我们怎么对准他们前进的方向呢?有两种方法:
   1 >.使用maya instancer的aimDirection 或者aimPosition功能.
   2 >.使用每个粒子的运行表达式,改变每个粒子的速度向量从而改变粒子的旋转值。我来提供一个 vector2rot.mel 的脚本,用这个脚本可以帮助我们完成这项操作。让我们用第一种方法来调整船的方向。
   1.选择这个粒子节点(boats_PTL),打开属性编辑器。
   2.增加一个per-particle的float属性,名称为rotationTypePP.在粒子的创建编辑器中输入rotationTypePP=1。
   3.在粒子属性中找到instancer栏。点击RotationType 旁边的列给框,选择rotationTypePP。
  
   4.这个属性将指定instancer物体的旋转方式(有三种,可以选择其中的一种)。
   .0(rotation)。如果选择这个表示你想直接控制instance的旋转,如果不用表达式,那么将很难控制他,但是这个选项将会提供给你更多的控制权。
   .1(aimDirection)。maya将使用一个已经提供的向量,如果你希望粒子指向他们的worldVelocity那么就选这个。
   .2(aimPosition)。使用这个选项,你可以使你的粒子指向一个特定的点。这个使用起来可能会很困难,但是它有很强的可控性。
  你可以让不同的粒子有不同的旋转方式,让我们先用aimDirection这种方式来完成我们的实例。
   5.单击aimDirection旁边的列给框,选择worldVelocity.重新播放场景,你可以发现,船身都是侧着向前的,这是因为船头没有指向X轴。在outline中找到sailboat_PLY,现在是隐藏的,将它显示出来,掉转船头向X方向,然后freeze transform.重新播放看看不同了吧。
   1.4更深入的一个实例。
  我们打开下一个场景,这是一个更复杂的帆船场景。
  
  播放场景你会发现一部分船看起来好像不怎么正确.我们将使用pointOnSurface 这个Mel命令来得到表面法线的数据,然后使用这个向量来做为船朝上的方向。
   1.打开1_2instance_sailboat_base.mb这个文件。
   2.将rotationTypePP值改为0.(在创建编辑器中改成rotationTypePP=0;).
   3.在粒子属性的instancer一栏中设置rotation为rotationPP(如果没有这个属性就自己填加上)。设置aimdirection为none.
   4.我们现在需要修改粒子的rotation属性,我们将创建一些表达式在运行表达式中。首先我们需要获取粒子的velocity,这样我们就可以得到他的方向了。我们用unit这个函数。
   //capture velocity
   vector $vel=unit(worldVelocity);   5.然后使用每个粒子的goalU和goalV属性,我们将用命令查询wave_surface_NRB's曲面的法线,它将提供给我们一个朝上的向量。
   //determine normal vector
   float $normalF[]=`pointOnSurface -u (goalU) -v (goalV) -normalizedNormal wave_surface_NRB`;
   vector $normal= <<$normalF[0],$normalF[1],$normalF[2]>>;   6.我们可以修改表面的法线来倾斜船,用来模拟风的效果。我们将使用expr_NUL.lean属性(在outline里可以找到expr_NUL,好像是建的一个空组)
   //lean boat depending on its speed
   float $lean=smoothstep(10,40,mag(velocity))*expr_NUL.lean;   7.确保$vel值为正。
   //if the boat X-position is decreasing,the boat leans the other way
   if($vel.x <0)$lean*=-1;   8.修改法线的值。
   //modify normal variable
   $normal+= <<0,0,$lean>>;   现在我们使用一个mel脚本来将我们刚才得到的两个向量转化为粒子的旋转值。
   9.maya的instancer有一个小小的bug,那就是不能直接用一个简单的角度值赋予它的旋转值。必须将这个值转化为弧度,并且得转两次。否则你将得到一个非常大的旋转值。
   float $rotX=deg_to_rad(deg_to_rad($rot[0]));
   float $rotY=deg_to_rad(deg_to_rad($rot[1]));
   float $rotZ=deg_to_rad(deg_to_rad($rot[2]));   10.将这个值指定给rotationPP。
   //finally,assign rotation values
   rotationPP= <<$rotX,$rotY,$rotZ>>;   本一节教程就完了。
  
  接上一节教程。
   1.5避免碰撞
   1.打开1_3_instance_sailboat_base.mb
   2.选择粒子节点boats_PTL.
   3.找到菜单fields.
   4.创建一个radial场,并设置属性值。
   magnitude=1
   attenuation=2
   maxdistance=40
   aplypervertex=on
   useMaxDistance=on
   radiaType=0   5.我们要让每个粒子都成为一个radial场的发射源。先选择radial场,再选择boats_PTL,然后选择菜单,fields >use selected as Source of Field.然后设置radial场的applyPverVertex值为on。因为粒子的goalPP属性设置的是1,所以radial场的效果没有表现出来。
   6.选择粒子,打开hypergraph,单击input and output connections按钮。

  
  可以看到radial场有个属性输出给了粒子。
   7.选择boats_PTL然后添加一个float属性,名称为proximityPP我们将用这个属性储存粒子受到了多大的力量。
   8.打开粒子进行替代。

上一篇:Maya特效教程:maya中粒子做草地生长动画

下一篇:Maya特效教程:粒子动力学模拟汽水泡泡教程

招生热线   

招生热线:0516-66666888

咨询电话:0516-66666999

快速导航   
学生作品