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.打开粒子进行替代。
要使用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.打开粒子进行替代。