好啦,开始吧:
当我们掌握了maya中expressions(表达式)的基础后,我们会发现自己经常用得着它们,比如最大限度的避免手动设置关键帧的麻烦。我认为表达式是maya中最有特色的部分,为了解说使用它们的基本用法,这个教程将展现如何创造一个非常简单的动画:使用速度控制属性完成一个小飞虫拍打翅膀的动画。这个模型十分粗糙,因为这不是我们这个教程的目的。
1.创建三个nurbs球体,通过变形和移动完成一个粗略的飞虫身体和一对翅膀的建模,分别命名翅膀为 "rWing" 和 "lWing", 命名身体为“bug”或者其他,如果你喜欢,也可以赋予他们一些简单的材质。
2.移动翅膀的轴点好让他们能围绕适当的轴(如图)旋转。
3.将翅膀子关系与身体,使其能跟随身体移动。
4.打开表达式编辑器(Window > Animation Editors > Expression Editor...)。 我们可以设其快捷键为ALT+e,(ALT+e在默认快捷键设置中没有被用到,这是个好的选择) 。在编辑器左边会看到我们当前选择的物体,而在右边是其可设关键帧的属性。表达式则是输入在底下的白框内。要知道的是我们输入的表达式不一定是与现在选择的物体关联的,我们可以为任何东西写表达式,例如别的物体,或者一个shader,任何我们想要的都可以。当然,如果我们已经有了一个选择的物体,就可以轻松的知道我们想控制的属性的确切名称了,因为所有的可设关键帧属性都已经列在该窗口的右边了。
5.在Expression Name一栏中输入"wingFlap" ,接着在表达式的对话框(该窗口底下)中输入如下内容:
lWing.rotateX = time * 10;
点击 "Create" 使该表达式生效。
这个句法是十分简单的,我们输入了物体的名字(确切的说是节点的名字),跟着是我们想要控制的属性和周期,在这个例子中,我们想要控制的是lWing的x轴,“time”属性是maya的内置值,它以秒为单位来跟maya交流,它以10为倍数因此运动效果也就更加显而易见了(翅膀拍打得更快)。在maya中每个表达式的表述最后都要用分号以示结束。
点击“Play”,我们会看到翅膀旋转起来了。
6.查看Hypergraph,我们会看到lWing受wingFlap表达式的控制,而在Channel Box,lWing的x轴属性数据则变成了橙色,并为某样东西所控制,我们不能直接改变它。
7.创建一个重复往返运动最简单的方法就是运用正弦函数。改动这个表达式为如下:
lWing.rotateX = sin (time * 10) * 40;
如果之前在表达式编辑器中输入的表达式不见了,只要点击Select Filter > By Expression Name,然后在左边的列表中点击wingflap即可。
这个正弦函数的结果乘于40,也就是说此运动描述了一个大的弧形,当然,也可以在两个很小的数值范围内作往返拍打运动,这视乎我们在此输入的数值。
点击“Edit”,在这里,此按钮代替了“Create”按钮,作用是更新我们对表达式所作的改变。如果出现"Error: Expression invalid after edit"这样的信息,清检查你表达式的语法,如果不修正这个错误,Maya将会自行执行你输入的最后一个“正确的”表达式,也就是 lWing.rotateX = time * 10;
8.播放此动画,可看到翅膀作往返拍打运动。
9.我们会发现这运动并不符合空气动力学,因为对应的一双翅膀在同一时间中X轴旋转的方向应该是相反的,也就是上下拍打的方向应该是一致的。为解决这个问题,我们在右边翅膀表达式的正弦函数前加一个负号,如下:
lWing.rotateX = sin (time * 10) * 40;
rWing.rotateX = -sin (time * 10) * 40;
10.播放动画,现在这只小飞虫能生存下去的机会更大啦
11.现在假设我们想要控制翅膀拍打的速度。当前,这个速度由表达式中 *10 这部分来决定。为翅膀的速度创建一个属性以让我们去改变动力速度甚至为它设置关键帧。在属性编辑器中,选择这个飞虫的转换节点(就是名为 "bug"的那个),接着选择Attributes > Add Attributes。
在属性名字(Attribute Name)一栏中输入WingSpeed,确定“Float”和 "Make Attribute Keyable"两项为选择,并设置最小值(Minimum value)为0,最大值(Maximum value)为10,默认值(Default value)为5,点击ok。——按钮“add”让我们可以在不必每次都关闭此窗口的情况下增加几个属性。
12.现在于飞虫转换节点窗口的附加属性中,我们会发现一个新的属性:“Wing Speed”,并已经根据我们的设置要求定值在5,现在我们不必管它。
13.让我们先回到表达式编辑器,并将两行表述中的10数值改为bug.WingSpeed,如下:
lWing.rotateX = sin (time * bug.WingSpeed) * 40;
rWing.rotateX = -sin (time * bug.WingSpeed) * 40;
14.需要注意两点:大小写(当我们要作定义时能正确的输入属性名字是非常重要的)和我们正在通过一个属性---在飞虫节点之下---控制着这个翅膀的事实,移动WingSpeed此属性的滑块并观察翅膀运动的效果。
15.重做这个练习,我们可以在各个步骤中尝试不同的方法,输入不同的数据,这样我们可以对此教程理解的更为透彻。别忘了,我们始终没有设过任何一个关键帧。Enjoy。