从零开始的Maya脚本编写(悠久之翼天使的阶梯动画实例)

大家好!本篇文章将会向你介绍:
用 Python 语言编写 Maya 脚本的基本操作
一个简单的 Maya 脚本实例:实现悠久之翼天使的阶梯动画

在编写 Maya 脚本之前需要做一些准备
Maya 向用户主要提供了两种脚本编写语言:MEL 和 Python。本文只会介绍使用 Python 进行Maya脚本的编写。
编写简单的 Maya 脚本需要熟悉 Python 语言吗?笔者自己对于 Python 语言也并不熟悉,所以认为这不是必须的,但如果掌握好它可以更好地帮助你进行脚本编写。然而,如果你完全没有任何编写程序的经验,阅读本文时可能会有一定的困难。
因为本文介绍的实例比较简单,所以会使用 Maya 内置的 Script Editor 进行编写。你可以在 Maya顶部菜单栏依次选择 “Windows” → "General Editors" → "Script Editor" 打开它。

打开后我们可以进行一个简单的测试,用 print 函数打印一句 "Hello World!",选中你所要执行的代码(这里强烈建议选中代码再执行,否则代码执行完就会消失),点击面板上方的蓝色按钮执行,发现执行结果无误。于是可以正式进行 Maya 脚本编写啦。

实际上,使用外部调试器是更好的选择,这样做会使你的编写效率更高。比方说 PyCharm。但本文并不打算这方面的东西。读者可以通过下面的链接自行了解 Maya 和外部调试器结合使用。
http://help.autodesk.com/view/MAYAUL/2018/CHS/?guid=GUID-8A96A8DB-FD6F-434F-A878-288DD84E99C7

使用 Maya 命令
使用 Maya 命令必须导入 maya.cmds 模块。可以通过以下语句导入
这样就可以使用 Maya 命令了,执行下面语句,你会得到一个宽度为11,高度为0.5,深度为4,名称为 "MyCube1",在宽度上细分数为11的立方体。你可以在大纲视图中看到它的名称。 Maya 用数字替换 # 号确保每个对象的名称是唯一的。所以当你再次执行一遍这条语句,你会得到一个完全相同的立方体,但它的名称是 "MyCube2"。

想要完全熟悉每个 Maya 命令是相当困难的事情。好在 Maya 官方为我们提供了详细的帮助文档,读者可以通过下面的网址访问:
http://help.autodesk.com/view/MAYAUL/2018/CHS/?guid=__CommandsPython_index_html
每个命令都有详细地介绍,包括书写格式,参数和返回值等信息。比方说刚刚使用的 polyCube() 命令就可以找到详细的说明。

实际上,我们编写 Maya 脚本,本质上只是在调用 Maya 已经存在的各种函数。你可能已经明白了 Maya 脚本工作的逻辑,机械性地记住每一条命令和每个参数的意思是枯燥的,让我们通过实例去学习吧。

悠久之翼天使的阶梯动画实例编写
(完整代码在文章末尾,可以直接执行)
本文要做的就是视频中楼梯向下螺旋生成的动画。
看一下我们最终要实现的效果:

执行脚本,我们会得到一个面板,输入阶梯的数量,点击 “Create Angel's Staircase” 按钮就会生成楼梯动画。当然你在编写过程中也可以选择向面板传入更多的参数,让这个效果更具实用性。在 Maya 底部的时间轴上可以定义动画的时间范围,因为我输入的是200,所以选择设定成了600帧。
可以看到,我们已经得到了楼梯动画,不过本文无法进行动态的呈现,读者可以自己去执行一次看看结果。

这样的效果在各种三维软件中都不难实现。在编写 Maya 脚本时思路也比较简单。首先我们需要创建单个的阶梯。
阶梯的参数可以根据读者的喜好而定,详细的参数设置需要去上文提到的网站上查看。
得到了一个阶梯,接下来我们只需要通过循环控制每一级阶梯的变换就可以得到完整的阶梯。仔细观察可以发现,每一级阶梯相比其下一级阶梯仅在高度和旋转上有所改动,于是我们可以定义 angle 和 ystep 两个变量,每一次循环都使其增加一个恒定的增量。理所当然地,我们可以写出这样的代码
move() 函数可以移动物体,而 rotate() 函数则可以旋转物体。传入定义好的 angle, ystep 变量就可以实现阶梯的规律性变化。更加详细的参数可以查阅帮助文档。
使用函数是一个好习惯,这样做会使你的代码结构更加清晰。Python 语言还支持面向对象,不过在本文中并没有使用类的必要。上面的代码得到了这样的结果

虽然这样的效果也很有趣,但并不是我们想要的。我们发现每一级楼梯都以自身的几何中心进行旋转,于是我们需要重设旋转的轴心。在 rotate() 函数中,可以通过设置 pivot=(20, 0, 0) 改变旋转轴心。这个参数接受一个列表,接受轴心的坐标。将轴心坐标移动到合适位置后。我们还会发现,在大纲视图中创建了两百级阶梯,它们占满了大纲视图,这实在令人沮丧。于是,想要将其都归入一个组中。为此,只需要定义一个 Group 包含所有的阶梯即可。group() 函数为提供了这种功能,只需要调用 parent() 函数将其链接起来即可。于是我们得到了修改后的代码:
执行一下,发现我们已经得到了想要的效果,大纲变得干净整洁,阶梯也得到了想要的效果。那么如何制作阶梯螺旋向下生成的动画呢。在 Maya 物体的属性中,有一向叫做 Visibility,只接受两个参数,控制物体的可见性。于是可以这样计算,假设我们现在有600帧,200级阶梯,因为阶梯是由下往上生成的,所以我需要在600帧处将第一级阶梯的可见性关掉,三帧之后将其可见性打开。依次类推,但是手动为200个物体 key 帧是难以想象的。
于是我们将编写第二个函数用于关键帧的设置,Maya 为我们提供了 setKeyframe() 函数,在上一个函数中,我们在生成每一级阶梯时调用 setKeyframe() 函数,相应的数据已经在前文计算过。只需要 设置 TimeKey 变量每次循环依次递减即可。我们仍可以调用 playbackOptions() 函数获取当前时间轴长度,这样,无论我们的时间轴是多少帧,都可以生成相应的阶梯动画。
如果此时调用 CreateStairs() 函数,已经可以得到最后的结果。但是,我们还想实现与用户的交互,这应该怎么做呢?
Maya 提供的 window() 函数和 showWindow() 函数为我们解决了这个问题。为了方便用户的使用,我们甚至可以调用 intSliderGrp() 函数,它的好处是可以通过滑动条控制传入数值的大小,这样更加直观。对于 button() 函数,我们要设置其相应方式,确保当用户点击 “Create Angel's Staircase” 时,函数得到执行。
就这样,我们得到了这个流程的完整代码。

完整代码
做完这个实例,也许你已经了很多自己的想法想要去实现,结合官方的帮助文档,编写自己的Maya 脚本吧。

本篇文章到此结束啦,谢谢你的阅读。