这种效果用MEL应该很容易做的,但目前为止俺还不会写mel程序,所以想了一下这个效果如何做。就是车轮前进时自身会跟着一起滚动一定角度的,这里要做的就是不用MEL而用节点来完成这样的工作。第一步先创建一个物体,这里用的是一个比较简单的NURBS做的车轮。有一点要说明,那就是模型的局部坐标一定要放置在模型的中心,这很重要,因为我们要做的就是利用模型的移动距离来计算出它的转动角度。
这里是场景文件,下载后用MAYA打开,场景中有一个NURBS模型,名称是Che.或者随便创建一个有点像车轮的模型。
看看这张图,我们来想想如何根据移动的距离计算出它应该转动的角度,都是数学知识就不多说了。
[page]打开节点窗口,单击window->hypergraph,如图
或者把面板布局成这样的:然后在hypershader中创建一个乘除节点
[page]创建乘除节点
并且重命名为zhouchang,ctrl+a打开属性编辑,设置参数为下图,注意图中的input2是模型的直径,这里是用长度标注得到的数据,可以根据具体的场景来更改,Operation模式(Multiply)。
[page]
然后,再新建一个乘除节点。重命名为X,然后鼠标中键按住模型(这里名称是Che)不放,拖动到乘除这里名称为X的节点上释放,在弹出的菜单中选择other
在随后的连接窗口中把左边窗口(che)的Translate属性下的Translate x和右边窗口(X)下的Input1下的Input1 x连接,方法就是单击左边的Translate x,然后单击右边的Input1 x。随后设置X的Operation模式为Divide,这里有三个选项,第一个是乘模式,第二个Divide是除模式,第三个是求幂。都是以input1为第一个参数,然后按照指定的运算模式运算Iupt2。
[page]
接下来中键按住Zhouchang节点,拖到X节点上释放,一样选择Other。在随后的连接管理窗口中把左边(Zhouchang)下的Output下的Output X和右边的X节点下的Input2下的Input2 X连接起来,如果看不到有些属性值,在菜单中把隐藏的属性打开。顺便说一下,所有的拖动操作都是在Hypergraph完成的。
现在重要的一点要来了,我们现在要做的就是求出物体的角度,再新建一个乘除节点,并且重命名为Angle,中键按住X节点,拖到Angle上释放,选择Other,把左边Output下的Output X和右边的Input2下的Input2 X连接,还要设定Angle节点的Input1值最左边的数值为360,这三个输入框相对应的值是X Y Z,运算模式选择乘。
[page]
连来连去,头都大了,接下来中键按下Angle节点,拖动释放到模型(che)节点上,选择Other,在连接管理窗口中把左边(Angle)的Output下的Output X和右边模型下的Rotate下的Rotate Z连接起来。注意,这个例子中的节点名称很重要,不要搞错了。
现在看看场景效果,沿X轴方向移动车轮模型,看到了没有?车轮跟随着X轴的不断变化而不停地旋转着。这个例子中我们用的是X轴的移动变化,当然也可以选择Y或者Z轴。不过好像不对劲,因为车轮的转动方向和移动方向不符合现实。这点很好办,只要我们把运算出的结果反转一下就可以了,而做这一点是反转节点reverse的拿手好戏。新建一个reverse节点,中键拖动Angle到刚建的reverse上,在弹出菜单中选择Input,这样就把运行结果反转了一下。
[page]
然后把已经反转的运算结果输出到模型(che)的rotate Z上,中键拖动reverse1到模型(che)上,选择other,在连接窗口中把左边(reverse1)下的Output下的Output X和右边窗口(che)下的rotate中的Ratate Z连接起來。
大功告成了,现在X方向移动场景中的模型,模型会随着X距离的变化转动,而且这个转动是个精确的数值。这个精度当然不是非常精确的,它受控于模型的直径和圆周率的值。换句话说,直径取得越精确,转动的结果越精确。
有朋友可能会问,那么如果我缩放了模型,这个值岂不错了。没错,如果把车轮模型进行缩放的话,这个结果的确不正确,现在我们就来让最后的结果可以随着车轮模型自动更新。当然这是有限制的,比如只能等比例缩放XY轴,不过好像也没有椭圆的车轮吧。回忆一下,在第一个乘除节点Zhouchang的Input2 X值取的是2,这是车轮模型的直径值,也就是说只要这个值能够随着模型的缩放更新的话,那么我们的目的就达到了。一句题外话,一定要保证模型现在的缩放值都是1,否则就没戏。
再创建最后一个乘除节点,重命名为Scale_R,然后中键拖动模型节点(che)到scale_R上释放,选择other,在连接窗口中把左边模型(che)下的scale和右边scale_R节点的Input1连接起来,接着把scale_R的Input2 X(就是input2最左边的)设为值设为2,这是模型的直径值(必须保证此时的模型缩放率为1),要视你的模型而定,我这里是2。
[page]
说说为什么一定要保证模型此时缩放率为1呢?因为我们要的是直径能够随着模型缩放而自动更新,这个结果说到底就是模型的缩放率乘以它缩放率为1时的直径值。其实有个更好的方法,就是把标注距离的节点下的值属性做为input1 X的,然后把标注节点做为子物体连接到模型上。不过我这maya不知道什么原因,怎样也找不到需要的那个属性。
最后一步,把上面的scale_R的输出值连接到计算周长的节点Zhouchang下的Input2中的Input2 X,这样就实现了周长的动态变化。中键按下scale_R,释放到Zhouchang节点上,选择other,把左边的scale_R下的Output中的Output X和右边的Zhouchang下的Input2中的Input2 X连接起來。
现在全部连接完毕。展开Hypergraph窗口中Che节点的输出和输入连接,可以看到如下图。
[page]
现在无论如何移动X轴或者XY轴缩放得到的结果都是正确的了。补充一点,如何你拖动模型节点(che)时连接窗口中找不到相应的属性,那么应该看看下面这图。
不要把下面那个Nurbsbook1选择了,这个只是阴影组节点的几何物体信息。