当前位置: 主页 > 平面设计 > Maya用particle的instancer模拟帆船

Maya用particle的instancer模拟帆船

  • 2022-03-02
  • 来源/作者: PS.ONEGREEN.ORG    / 佚名    
  • 5 次浏览

  1、1instancer 基础

  要使用instancer必须先要准备好要替换的物体。这个物体需要朝向正确的方向,位移值,轴心点等必须归零,缩放值为1。这样做以后就不会发生不必要的麻烦,产生的结果才能和你预想的一样。

  maya的particle instancer功能是将要替换的物体固定在每个粒子上,这个物体并不是复制到每个粒子上的,而是用这个物体的外形替代了每个粒,所以称做“instance”。instancer并不会在场景中增加几何体。

  Maya用particle的instancer模拟帆船

  1.2 轴心和方向

  如果你在用instancer的时候出现问题了,首先检查:

  1>.物体的轴心是不是处于原始的轴心上。

  2>.轴向有没有与世界坐标的轴向对齐。

  3>.物体的前进方向是否对准X轴。

  4>.物体的transform值是否归0。

  如果没有归零,将方向,位置调整好,然后freeze transform。

  1.3 帆船的例子

  这个例子是一只帆船漂动在一个被wave变形的nurbs平面上,粒子被指定了一个简单的表达式,让它们沿着U方向前进。

  Maya用particle的instancer模拟帆船

  1)打开1_1instance_sailboat_base.mb这个场景文件。在这个文件里,实际上只有一只船,这么多的船其实都是粒子,使用instancer做的。船跟着粒子而动,那么我们怎么对准他们前进的方向呢?有两种方法:

  1>.使用maya

instancer的aimDirection 或者aimPosition功能.

  2>.使用每个粒子的运行表达式,改变每个粒子的速度向量从而改变粒子的旋转值。我来提供一个 vector2rot.mel 的脚本,用这个脚本可以帮助我们完成这项操作。让我们用第一种方法来调整船的方向。

[NextPage]

  1.选择这个粒子节点(boats_PTL),打开属性编辑器。

  2.增加一个per-particle的float属性,名称为rotationTypePP.在粒子的创建编辑器中输入rotationTypePP=1。

  3.在粒子属性中找到instancer栏。点击RotationType 旁边的列给框,选择rotationTypePP。

  Maya用particle的instancer模拟帆船

  4.这个属性将指定instancer物体的旋转方式(有三种,可以选择其中的一种)。

  .0(rotation)。如果选择这个表示你想直接控制instance的旋转,如果不用表达式,那么将很难控制他,但是这个选项将会提供给你更多的控制权。

  .1(aimDirection)。maya将使用一个已经提供的向量,如果你希望粒子指向他们的worldVelocity那么就选这个。

  .2(aimPosition)。使用这个选项,你可以使你的粒子指向一个特定的点。这个使用起来可能会很困难,但是它有很强的可控性。

  你可以让不同的粒子有不同的旋转方式,让我们先用aimDirection这种方式来完成我们的实例。

  5.单击aimDirection旁边的列给框,选择worldVelocity.重新播放场景,你可以发现,船身都是侧着向前的,这是因为船头没有指向X轴。在outline中找到sailboat_PLY,现在是隐藏的,将它显示出来,掉转船头向X方向,然

后freeze transform.重新播放看看不同了吧。

  1.4更深入的一个实例。

  我们打开下一个场景,这是一个更复杂的帆船场景。

  Maya用particle的instancer模拟帆船

  播放场景你会发现一部分船看起来好像不怎么正确.我们将使用pointOnSurface 这个Mel命令来得到表面法线的数据,然后使用这个向量来做为船朝上的方向。

[NextPage]

  1.打开1_2instance_sailboat_base.mb这个文件。

  2.将rotationTypePP值改为0.(在创建编辑器中改成rotationTypePP=0;).

  3.在粒子属性的instancer一栏中设置rotat

ion为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],$n
ormalF[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脚本来将我们刚才得到的两个向量转化为粒

子的旋转值。

[NextPage]

  //convert direction of travel and up vector into rotations
  float $rot[]=`vector2rot $vel $normal`;

  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 rotationvalues
  rotationPP=<<$rotX,$rotY,$rotZ>>;

  本一节教程就完了。

  Maya用particle的instancer模拟帆船

  接上一节教程。

  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
  radia
Type=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按钮。

  Maya用particle的instancer模拟帆船

  可以看到radial场有个属性输出给了粒子。

  7.选择boats_PTL然后添加一个float属性,名称为proximityPP我们将用这个属性储存粒子受到了多大的力量。

>  8.打开粒拥氖粜裕

 << 上一页  [11]