资源描述
MayaPython第一篇-介绍 大家好,这是一个简易的MAYA PYT HON学习教程。简易教程的目的是可以让更多的人快 速掌握这些知识,而不是拘泥于理论的研究。最好的学习方式无疑是实践,我会提供简单实 用的代码来帮助学习者了解脚本的实际运用。如果你是初学MAYA PYT HON,特别是非程 序员的初学者,不妨先看一下下面的内容,以帮助你对MAYA PYT HON有一个大致的了解。为什么要学习简易教程?简易教程的特点就是尽可能做到简单,容易理解。我的文档会涉及到尽可能多的内容,但不 会说的很深。因为很多复杂的应用往往是许多简单部分的组合,学会如何组合是更重要的事 情:)另外,任何学习都需要一个很好的getting started,好的入门,往往决定今后深入 学习的质量。万事开头难,但是一个好的开始,就是成功的一半。希望我的简易教程可以带 大家进入MAYA PYT HON的大门。这个文档的适用人群是哪些?具有一定MAYA操作经验,但无编写脚本经验的用户具有一定MEL基础的用户始终徘徊在MAYA脚本门口,但找不到切入点的初级用户什么是 MAYA PYTHON?简单来说,MAYA PYT HON就是用PYT HON语言包裹起来的MEL命令。什么是PYTHON?PYT HON是一门简单易学,但功能又非常强大的编程语言。(我会在下一篇中提供简单实用 的PYT HON入门教程)为什么要学习MAYA PYTHON?大幅度地提高工作效率挖掘MAYA隐藏功能,更全面地掌握MAYA快速开发脚本插件如何学习MAYA PYTHON?最好的方法是学习别人写的源代码。而最好的代码资源其实就在你的电脑里:你的MAYA 帮助文档。如果你有良好的英语阅读能力,这样你可以充分理解帮助文档里所说的内容。但 是如果英语能力不是很理想的朋友也千万不要着急,我的文档会帮助你学习MAYA PYT HONo另外,MAYA的帮助文档中的脚本部分对每条命令的参数以及每个节点的属性 解释的都非常详细,个人认为,学会使用MAYA的帮助文档是学习PYT HON脚本的制胜法 宝。第一篇完MavaPython第二篇PYTHON(点击标题阅读全文)如果你是PYT HON高手,可以跳过这篇:)因为节下来我要讲述PYT HON的基本应用。由 于我的PYT HON教程主要是针对MAYA的应用,所以PYT HON基本应用的介绍主要会涵 盖MAYA环境中经常会使用到的PYT HON功能。学习过程中,尽量运用已学到的知识自己 也试着编写一些代码,发挥主观能动性。这样学习,效果会十分显著。该篇主要含盖以下内 容:2.1 脚本编辑器(Script Editor)2.2 PYT HON常用数据类型和操作符2.3 流程语句2.4 定义函数2.5 常用模块2.1 脚本编辑器(Script Editor)MAYA界面中有2处地方可以编辑PYT HON脚本,一处是左下角的快速命令行,这个命令 行可以在PYT HON和MEL间快速切换,如下图:-Click to toggle between MEL and Python execution of the command line source一处是右下角的Script Editor按钮,点开窗口如下:我们的PYT HON代码就是写在PYT HON选项卡中,如果PYT HON脚本在MEL选项卡中 执行将会出错,vice versa o我们在MAYA中执行的操作会通过MEL语言打印在上面灰色区域,也就是输出区域。这些 MEL语言都可以非常快地转化成PYT HON代码。这个数据输出区域同时也会打印PYT OHN 脚本的执行结果以及出错信息。现在我们来执行一条简单的PYT HON语句,来一个初体验:PYT HON页面中输入print hello maya,然后按数字键盘上的小回车(注意:小回车是执行代码,大回车是换行)。我们看到输出区域的打印结果如下:print hello mayahello maya第一行是告诉用户,你执行了 print hello maya这条命令,第二行hello maya是执行 这条命令的结果,这里的执行结果就是:hell。maya被打印出来了。命令执行成功。但是 我们发觉PYT HON页面里的代码也消失了。如果需要反复执行代码,可以选中需要执行的 代码,然后按小回车,这样,我们可以在执行代码的同时保留页面里的代码。(建议使用第 二种方法执行代码)接下来,再举个简单的例子来说明输出窗口中的报错信息。随意在命令行中输入一些字母 abed,然后执行,出现如下信息:abed#Error:NameEror:name abed is not defined#这是个简单的报错信息,说明abed没有被定义,电脑无法识辨。这条命令是无效的。最后就是#符号,#后的所有的代码(换行前)都被看作注释,不参与运算。例如:#print hellomaya:)虽然也是print命令,但是前面有#,所以无视。现在我们终于知道如何在PYT HON中执行代码,以及辨别代码是否有效。在下面的教程中,我将会用一些简单的实例来展示PYT HON的常用功能!2.2 PYTHON常用数据类型和操作符数据类型就是数据的类型-U,就是不同类型的数据,数据类型包括:整型,浮点,字符,列表,元组,字典。整型(INT)就是整数,比如:1,2,3,21,1000浮点(FLOAT)就是带小数点的数字,比如:1.12,4.5字符(ST RING)就是文字,需要用单或双引号,比如:string,hello,12,3.1415,列表(LIST)就是一系列数据的组合,用中括号,比如:口,2,3,tom,jerry,marry,14元组(T U PLE)用小括号,和列表的区别是他是不可变的:(1,2,3),(tom,jerry),(marry,14)操作符,形象的说就是用来操作数据的工具,包括数学操作符,比较操作符,逻辑操作符。数学操作符:+(加)-(减)*(乘)/(除)%(取除法余数)*(乘方)比较操作符:V(小于)V=(小于等于)(大于)=(大于等于)=(等于)!=(不 等于)逻辑操作符:and or not下面来做一些热身,在实际运用中体会不同数据类型之间的配合!2.2.1 整数a=l#定义变量a,把整数1赋予给ab=3#定义变量b,把整数3赋予给ba+b运行结果为3,其他整数小数的加减乘除这里就不熬述了2.2.2 字符namel=tom#定义变量namel,把字符tom赋予给namel,注意双引号 name2=jerry#定义变量name2,把字符jerry赋予给name2,注意这里是单引号,都可以表示namel+name2运行结果为tomjerry,这里说明字符之间可以相加。但是不同数据类型之间不可以相加,变量a和变量namel就不可以相加,因为一个是整数,一个是字符。字符单引号和双引号 的不同用法我会再之后的实例中写出。2.2.3 列表listl=l,2,3#定义列表listl,包含3个整型数字Iist2=cube,sphere,plane#定义列表 Iist2,包含 3 个字符Iist=listl+list2#把listl和Iist2的相加结果赋予新的变量list print list运行结果为1,2,3Jcube,sphere,plane,可见,包含不同数据类型的列表之间可以 相力口我们可以对列表中的数据进行访问操作。执行以下命令:list0 +list2运行结果为4,因为listO指的是list列表中的第一项,list2指的是list列表中的第3 项。(注意,PYT HON数数是用0开始的),依次类推,list4指的就是sphere”。list3*listl运行结果为cubecube,其效果等同于”cube*2,可见,字符和整数间,可以做乘法运 算。同样,如果c*5的运算结果就是ccccc。userl=tom,catuser2=jerry/mouseuserlnfo=userl,user2#定义列表userinfo,该列表内又嵌套了 2个列表print userinfo#打印 userinfo运行结果为jeny,Jmouse,我们看到大列表中包含了 2个小列 表我们同样可以访问嵌套列表:userlnfo0 表示 userinfo 中的第一个列表 userl,userlnfo0 l表示 userl 中的第 2 个值cat。同样,如果要访问jerry,你可以通过userlnfol0 来访问。我们还可以对列表里的内容进行添加或移除:userinfo.append(jack,male)这样我们再次打印userinfo的时候,得到的结果应该为tom,cat,jerry,mouse,jack,maleuserinfo.remove(tom,cat)这样我们再次打印userinfo的时候,得到的结果应该为jerry,mouse,jack,male列表和字符还可以访问其区间的数据:a=lz2,3A5A7,8#定义列表 ab=abcdefg#定义字符 ba3:5#返回的值是4,5,6,是列表a的第4位到第6位bl:4#返回的值是bcdea3:#返回的值4,5,6,7,8,从第4位一直到结尾b:-4#返回的值是abc,从第1位到倒数第4位2.2.4 常用工具接下来,我给大家介绍一些不同数据类型中的常用工具!2.2.4.1+=操作符号a=la+=l#等同于 a=a+l 运行结果为2,因为a=l,a+1等于2,然后把2这个数字赋予给原来的a,这样,2就 替换掉原来的1 了,a就等于22.2.4.2 pow()乘方命令x=pow(4,3)#就是4的3次方y=pow(4,-2)#也就开根号Z.2.4.3 len()获取长度命令len()命令能够返回字符和列表的长度,如下:len(tommy)#返回结果是5len(l,2,6)#返回结果是3len(l,2,7,lock,jack,bach7davinci,vivaldi)#返回结果为 3,因为里面包含3个列表2.2.4.4 int()str()数据类型转换命令int()的str()是字符和整数转换的命令,非常实用:a=256b=int(256)#把字符256转换成整数256a-b#运行结果为0c=mayad=str(20 11)#把整数2011转换成字符2011”c+d#运行结果是“maya20 11”2.2.4.5 max()min()最大值最小值命令max。和min()可以用来比较数字的大小:max(l,7)#结果为7,两个取大的值min(3,6)#结果为3,两个取小的值2.3 流程语句2.3.1 if 语句if就是如果的意思,是条件判断语句的关键词,一般可以和elif或else语句结合使用。接 下来我会用一些简单实用的例子来说明if语句的用法:age=17#定义age等于17if age18:#假设第一种情况,注意要用冒号print you are not adult#注意代码缩进else:#假设第二种情况,注意冒号print you are adult这里的运行结果是you are nod adult,因为假设第一种情况是成立的。这里提一提代码 缩进,缩进就相当于写作文时每小节开头要空2字;代码缩进,就是指被缩进的代码是上 一行代码的子代码。name=tom#定义 name 变量if name=tom:#注意这里是不是print Hello,tom运行结果是打印Hello,tom。=和=的区别是:相当于是个动词,把tom这个 字符值传递给变量name;=表示一种状态。if name=torrT这句话翻译成人类的语 言就是:假设name的值等于tom这个状态是成立的。(一旦成立就执行后面的语句)a=3if al:#假设 1print al运行结果是匕1。很显然,a不小于1,也不等于1,那就只有执行else后面的语句了。2.3.2 for循环语句for语句的操作对象一般是一个序列,对序列中的每一个成员进行操作,举例:seq=lz2z3#定义一个列表fori in seq:#for即将对列表seq中的每个成员进行操作,成员我们用i来代替(这里成 员变量可以自定义)print i+1#操作的内容:给每个成员+1执行结果如下:234我们给每个成员都+1 了说到for循环语句,我们不得不提一下range。内置函数。range。可以针对数字提供一个 序列范围:range(lO)运行结果就是:0,1,2,3,4,5,6,7,8,9range(5,10)运行结果就是:56,7,8,9range(0,10z2)运行结果就是:0,2,4,6,8结合for语句,我们可以尝试执行以下代码:x=a/b,c/d,e,f,g/hfor i in range(0z10,2):#操作范围:0,2,4,6,8print xi#i将会被0,2,4,6,8中的每一项依次替代,替代后再执行print语句。运行结果:a ce g2.4 定义函数在PYT HON中,我们可以自己定义一个函数,定义函数的命令是def,如下:def MyFirstFunction():print this is my first function这里我们用def命令定义了一个函数名字叫MyFirstFunction,后面括号里面是用来填写 参数的,如果没参数,就留空。定义函数内的代码需要缩进。如果要执行函数,操作如下:MyFirstFunctionO#这样输入,就可以执行函数,函数内的所有命令都会被执行执行后,结果会打印this is my first function,说明定义函数内的代码被正确执行了。函数还有一种定义方式,就是在括号里加上一些参数:def MySecondFunc(a,b):#该函数包含了 a和b两个参数 print a+b然后我们来执行这个函数:MySecondFunc(2,5)#把2和5分别代入a和b,然后执行,函数内的print命令会 被执行。运行结果为7MySecondFunc(first,second)运行结果为firstsecond,两个字符串被相加了。函数还可以签套函数,如下:def funcl():a=1print adef func2():b=2print bfuncl()定义好funcl和func2后,执行func2(),结果为:21因为func2先执行打印b,在执行funcl,funcl会打印a2.5 常用模块简单说,模块就是一个打包的命令集合,以文件的形式存在。模块的使用方法是导入。我 们直接针对MAYA PYT HON的模块来具个简单的例子吧。2.5.1 maya 模块import maya.cmds#导入 maya模块中的cmds命令集这样,我们就在MAYA中导入了 cmds命令集,里面包含了所有可以在PYT HON环境中使 用的MAYA命令。现在我们来初试这个cmds命令集import maya.cmds#导入模块maya.cmds.polyCube()#调用模块中的 polyCube()命令。发觉场景里生成了一个方块,命令执行成功。但是这样打命令太长了,我们在导入maya.cmds时加上:import maya.cmds as me 这样maya.cmds就作为me导入了,我们就不用再打长长的maya.cmds 了。我们再创 建一个Cube:mc.polyCube()短很多了吧。接下来介绍几个常用的模块:import maya.mel#导入这个,可以调用所有的mel命令2.5.2 os 模块import osos模块也是用的比较多的。我经常会使用os.system。,括号中间可以写一些DOS命令:os.system(md c:MyFolder)这样就可以用PYT HON来调用DOS命令了。os.listdir(C:)listdir可以以列表的形式列出路径中的所有的文件和文件夹(注意:是列表的形式,像这样:a.py,AU T OEXEC.BAT,boot.ini)0接下来再介绍一个re模块,我经常用它来做字符的切割工具:2.5.3 re 模块import rea=Hello_Worldre.split(_,a)#split就是切割工具,有2个参数,”就是切割的根据,a是我们定义 的变量返回结果是一个列表,HelloJWorld,还有个是替换命令re.sub。:a=my4name4is4HuYongbinre.sub(4,_,a)#就是说把 4 替换成输出结果:my_name_is_HuYongbin2.5.4 time 模块import time#时间模块time.ctime()执行结果:#Result:Fri Jun 11 22:52:16 20 10#。也就是当前的时间。OK,PYT HON简易教程就写到这里,简易教程的内容肯定不是很完整,这里只是罗列出一 些实战中比较常用的功能。(也是我比较常用的)初学者可以抛弃理论,先玩起来再说。实 践太重要了。在下一篇中,我们将正式进入MAYA PYT HON实际应用。-第二篇完-MavaPvthon第二篇实战演习(点击标题阅读全文)在上一篇中,我主要介绍PYT HON的一些基础知识以及常用语法。在这一篇中,我们要结 合MAYA中的命令来编写一些基本PYT HON脚本。其实在上一篇接近尾声的时候,我已经 举例了如何导入模块的方法,这是真正使用PYT HON在MAYA中编写脚本的第一步。import maya.cmds as me#这里应该不用解释了吧,有疑问可以看第二篇的结尾模块 部分。:)这里顺便提一提,as me可以用任何名词来代替,as cc也可以。这样,如果要调用 polyCube。命令的话,就必须有cc.polyCube。作为前缀。基于笔者的个人习惯,我们这 里还是用me3.1 MEL命令和PYTHON命令之间的转化我们导入MAYA的模块,现在要运用模块中的命令编写一些东西了。但是大家可能会很疑 惑,写什么呢?我们总不见得整天在MAYA里做小学数学题吧-现在我们需要学习一些 MAYA的实用命令(比如上一篇提到的polyCube。创建一个立方体),学习实用命令的最 好的途径是通过执行手动操作命令来获取MEL命令语句,然后把MEL命令转换成PYT HON 命令。比如我们在MAYA3D视图中用传统的方法建立一个polygon的立方体,我会在脚 本编辑器的输出部分得到以下输出信息:polyCube-ch on-o on-w 9.9-h 7.1-d 10-cuv 4;注意大小写这是一句MEL命令,描述了如何创建一个Polycube。MEL命令的结构十分简单,开头的 polyCube就是这句MEL命令的主命令,后面的部分全部是参数。其中,带的,是参数 名称;没有的,是该参数的值。一般都是一个带号的参数名称,后面再跟一个不带 的值。有时后面会不跟值,这说明这个参数不需要值,它只是一个开关,带这个参数,说明 这个开关开着,不带说明关着。现在,我们就把这句MEL命令转换成PYT HON可以执行 的命令(我们暂时不去理会具体参数的作用,只是学习一个转换过程):mc.polyCube(ch=l,o=l,w=9.9,h=7.1,d=10,cuv=4)执行代码后同样得到了一个立方体。我们对比一下,可以发现PYT HON可以完全把MEL 的命令转化过来,只是格式不一样。格式不同体现在一下几点:有me前缀(MEL没有前缀),所有的参数信息需要放在主命令后的括号中(MEL没有括号)参数名和它的值之间用等号隔开(MEL是用空格)每个参数之间用逗号隔开(MEL用空格)有些参数的值是1,而ME是on关于最后一条,其实MEL的on也可以写成1,原因是,在PYT HON(包括其他程序语言),1这个值往往表示T rue,on等肯定意义的值,而0则表示False,off等否定意义的值。这 样的值叫做布尔值(boolean),这种数据类型只有2种答案要么1,要么0;要么真,要 么假;要么ON,要么OFF。例子中的1就是on,说明这个参数是可用的。关于布尔值(其实你在MAYA中也可以把它理解成一个开关),以后还会讲到它的用法。节 下来我们举一反三,熟练掌握MAYA命令转换的方法。拖一个球出来,得到以下命令:polySphere-ch on-o on-r 3;转成PYT HON代码,就是:mc.polySphere(ch=l,o=l,r=3)还有一中转化形式:我们如果在场景中选择了 pCubel这个物体,会得到以下MEL命令:select-r pCubel;这里我们就不能写成mc.select(r=pCubel)了,因为现在这个命令基本上属于一个动作,一个动词,既然是动词,就必须有一个动作施与的对象,这里这个对象就是pCubel,而r 这个参数其实replace的简写。注意这个r不是布尔值,它没有任何数据类型,只是一个 开关而已。在MEL中,这个开关是不需要值的,但在PYT HON中,需要像布尔值那样给 一个1的值,表示这个开关开启:mc.select(pCubel,r=l)#注意:PYT HON中,选择对象放在最前面。#注意名字的数据类型是字符,所以必须有双引号如果要同时选择pCubel和pSpherel的话,需要用到列表,如下:mc.select(pCuber,pSphere)#注意如果是选择集合的话,要用列表来表示#r参数在这里我就不加了,但是不影响执行,体会下可选的作用3.2 读取场景中信息的常用命令:刚才我们知道了一些如何创建物体,以及如何选择物体的PYT HON命令。下面咱们要学习 如何准确获取场景中你想要得到的信息,对于即将要编写的代码而言是十分重要的。比如,你要用命令对所选的顶点进行操作,那你就必须先要得到这些顶点信息,比如,这些点的 ID号是那些?同样,如果要对所选的MESH进行操作,那你至少得让MAYA知道是哪些 MESHo3.2.1 得到所选物体的名字列表那我们先来得到所选择的物体信息吧,这里用到一个新的命令Is(我这里提到命令绝对是常 用的):mc.select(pCubel,pSphere)#选择场景中的两个物体mc.ls(sl=l)#Is就是list的简写,我们要list 一些信息#sl=l表示,我们要列出sl(select)的信息,=1就是一个开关,我们打开了它。执行后,我们会从输出框中得到一个列表:pCubel,“Sphere。假如我们把第2行 命令的结果赋予一个变量,那这个变量将继承这个命令执行的结果,如下:sel=mc.ls(sl=l)print sei我们同样会得到pCubelJpSphere这个结果,并且我们保存了这个列表结果到sei 变量中去。假如你选择了 N个物体,那你执行这句命令后会得到N个物体的列表。3.2.1 得到和设置物体的属性getAttr。和setAttr()下面再介绍2个非常有用的命令,getAttr。和setAttr()0前面那个是得到节点属性,后 面那个是设置节点属性。我们同样可以借助MEL命令来获取一些命令信息。3.2.1.1 setAttr()我们选中刚才创建的pCubel,然后Ctrl+A打开属性窗口,找到pCubel节点中的 T ransform Attributes栏,我们把T ranslate行中的第一个值打成0,回车。现在我们在 输出窗口中得到了一条MEL命令:setAttr pCubel.translateX 0;pCubel.translateX就是表示这个节点的T ranslate/参数,后面的0表示它的值。这 样我们也就可以把它转成PYT HON可以用的命令:mc.setAttr(pCubel.translateX,4)#现学现用,我们把这个值再改成4 在PYT HON面板中执行后,发觉T ranslate行中的第一个值神奇地变成了 4。同样,视图 中的立方体也沿X轴平移了 4个单位。同理,我们可以通过改变其他参数来获取其动作的 MEL命令,然后把它转换成PYT HON可以用的命令。3.2.1.2 getAttr()下面,我给出如果获取属性值的命令:mc.getAttr(pCubel.translateX)#获取,pCubel 的 translateX 参数的值。执行后,我们得到4,也就是前面我们所设的那个数。同样,我们可以把这个值赋给一个变 量:a=me.getAttr(pCubel.translateX)print a打印 a 的结果就是 me.getAttr(pCubel.translateX)的结果。3.2.1.3 询问开关q还有一种查寻其属性的方式,就是利用询问参数q。这里我们以xform命令来举例,如下:mc.select(pCubel)mc.xform(q=lz translation=l)执行结果,返回一个包含了 pCubel的XYZ位置信息的列表。我们看到xform命令的参 数表中有2个参数,一个是q,一个是translation。其中,q=l表示当前这个命令已经进 入询问状态,改命令不会对所选的物体进行任何操作,只会询问;translation=l,表示我 们要询问的参数是translation,、=1相当于一个开关,说明我们要询问这个、=1的参数 值。假如,我们的命令是mc.xform(q=l,translation=l,rotation=l),这样会出错,因为询问状态下,只返回一个参数的值。相反,如果mc.xform(q=lz translational,rotation=0),也就是把rotation改成0,返回结果仍然会正确。3.3 帮助文档的使用(灰常重要!)有的人可能回问:我如何才可以知道,一个操作命令有多少个参数可以使用?一个节点到底 有多少个属性可以设置?接下来我会给大家介绍下MAYA帮助文档的使用方式。按F1打开MAYA帮助文档。在Content中找至U T echnical Documentation(技术文档),在这个技术文档中,我们需要用到的,就是CommandsPython和Nodes CommandsPython中包含了所有MAYA中的PYT HON命令以及其参数的使用方法;Nodes列出了 MAYA中所有的节点以及其属性的用法。现在我们列举一个xform命令来了解如何结合帮助文档来完成你的操作3.3.1 Python 命令 点CommandsPython进入页面,在By substring中输入xform命令,在下面出现的 Substring列表中选择xform,我们就可以进入xform命令页面。我们把该页面往下拖,跳过Notes,Related的内容,在Flags下有个长长表格,表格由3列组成:Long name(short name)长名(缩写),Argument types(数据类型),Properties(属性)。长名(缩写)的意思就是:比如mc.xform(q=lz translation=l)这条语句中translation 是一个参数,我们可以在Flags下的列表中找到这个参数,我们观察它的长名(缩写)一 列,translation后有一个(t),这个(t)就是他的缩写,我们可以用缩写来替代长名,如:mc.xform(q=lz t=l),效果完全一样。数据类型就是这个参数所支持的数据类型,如果它的数据类型是Int的话,说明它只能支持 整数,你只能把整数作为它的参数,或者在询问时只能得到整数的输出。同样如果是个 boolean值的话,它只能支持0或1。属性指的是这个参数的性能。这里的性能有4种,在MAYA帮助文档中用这4个字母表示:aiQEMo其中C表示这个参数可以在该命令执行操作的时候使用;Q表示这个参数可以在询问状态下使用;E表示这个参数可以在编辑状态下使用;M表示这个参数可以拥有多种 数据类型。一般情况下,CQE用得最多。比如:mc.xform(q=l,t=l)这句命令就是典 型的询问状态Q,询问内容是t,也就是translation。3.3.2 Nodes 信息 现在我们进入Nodes页面来了解下如何使用MAYA节点中的属性。Nodes页面中所罗列出来的其实是MAYA中的所有节点类型。MAYA中充满着节点,我们 任意选种场景中的某个节点,它都是属于某个Nodes页面中所罗列出来的类型。比如,我 们选择之前在场景里创建的pCubel,它是属于什么类型的节点?是pCube节点吗?不是,我们无法在Nodes页面中搜索到。我们可以通过以下命令来询问节点的类型:mc.objectT ype(pCubel)#objectT ype命令可以得到节点类型,实用推荐!执行后,得到结果:transform。说明pCubel这个节点是transform节点。同样,我们 询问:mc.object7ype(pSphere)执行后,同样得到结果:transformo所以,虽然pCubel和pSphere节点名称不同,但 是他们都是属于transform节点,千万不要认为他们是pCube类型或pSphere节点类型。得到节点类型后,我们到Nodes页面,输入transform。找至U transform,点入。找至ij Attributes下的长长列表。我们可以看到transform中有的参数。这些参数都可以通过 getAttr。和setAttr。来获取和设置。我们来做下测试吧:)mc.getAttr(pSphere.rz)#rz 就是 rotationZ 的缩写 返回0.0,我们就得到了他的信息了。关于文档使用的小结:其实我平时用的比较多的还是CommandsPython命令查询页面,因为在场景中很难找到命令及其参数的完整信息(当然,我们可以通过输出窗口中的MEL 记录,但这些信息远远不够)o关于Nodes,当我们需要知道某个节点的类型时,可以 用到objectT ype来查询;或者当我们需要得到节点中某些属性的时候,也会用的到这个页 面。3.4 一个简单的脚本实例这一节中,我要结合前三篇所讲的一些知识来作一个综合的小范例,并加上适当的注解,以 便学习。import maya.cmds as me#导入 MAYA 模块def height(h):#定义函数height,h为这个函数的一个参数sel=mc.ls(sl=l)#定义变量sei,把当前所选的内容赋予这个变量for i in range(0,len(sel):#在sei这个选集范围里,对其中的每一个对象进行操作mc.setAttr(seli+.ty,h*i)#所做的操作是:把每个对象的Y轴移动一个量。#这个量是这个函数的h参数乘以这个for循环的成员变量i先执行以上这写代码。现在我们在场景中创建一个立方体,然后按Ctrl+D水平复制出若干 个成一直线,全部选中这些立方体。如下图:然后执行:height(2)执行height函数后,发现这些立方体的高度会发生一些变化,形成一斜线。并且,height 的斜率会根据h的值的不同而不同。代码的简单分析:代码的结构不是很复杂,只有5行,前面3行应该不用作过多的解释,应该是很好理解的。我主要分析下最后的2行for循环语句。(看下面的文字时请注意对照源代码)第一行for:假设我的场景里有5个pCube,分另Li叫pCubel,pCube2,pCube3,pCube4,pCube5,如果我选择的他们的话,那么sei变量会是这样一个列表:pCubel,”Cube2,pCube3,pCube4,pCube5;len(sel)的值就是 5;range(O,len(sel)就等于 range(0z5),也就是0,1,2,3,4这样一个列表。所以说成员变量i的取值范围就在这个列 表中,i将逐个被列表中的每一个成员替代。第二行for:由于i有5个值可以取,所以setAttr会执行5次,每次执行时,就会把range 范围列表中的值代入i。比如,当i=0的时候,sel0就是指范围列表中的第一个值,也就 是pCubel,seli+.ty指的就是pCU bel.ty,也就是pCubel的Y轴的移动值;h*i指的就是这个移动值的具体数字,其中i是在这里就是0,h的值取决于你在调用函数 时在参数中所输入的数字,把整句话连接起来就是:当i=0时,并且h=2时(h值在我们 调用函数时得到),执行mc.setAttr(pCubel.tyz 2*0),pCubel的Y的位移值等于0;以次类推,当次4 时,并且 h=2 时,执行 mc.setAttr(pCube5.ty,2*5),pCube5 的 Y的位移值等于10。如果你有一定编程经验,相信这些代码理解起来不会很困难。如果你是初学着,建议多练习 for循环语句的使用,多尝试自己写一些代码,得以巩固。在下一篇中,我们会有更多的代 码演示及其分析,进入实战。-第三篇完-MavaPvthon第四篇宏战篇(点击标题阅读全文)上一篇,我们结束了演习,在这一篇中,我们将进入实战!我们将学习写一些实用的代码,以使我们的工作高效化。作为简易教程,我的范例代码的难度不会很大,学习者也可以触类 旁通,重组这些简单的零件,发挥自己的组合能力”。其实这个世界上真正复杂的东西 很少,但是复杂的组合却是很多。复杂的组合往往需要自己创造,发挥自己的想象力吧。4.1 自制吸附工具:事实上,MAYA自己也有吸附工具,可以吸附很多场景中的元素。我们下面的代码的主要是 用来吸附中心点位置的。在MAYA场景中,如果遇到有很多物体时,MAYA自带吸附功能 可能会有点不太好使(会吸到别的物体)。但也有可能是我MAYA掌握不全面-U。(事实 上,操作上我更习惯MAX,因为学的比较早,但从软件结构上,更偏爱MAYA)OK,不废 话了,先看看下面的代码吧:#执行代码前,请大家在自己的场景里建2个物体(任意),我这里是pCubel和pSpherel def snap():selection=mc.ls(sl=l)#把所选的物体命令存入变量selectionpos=mc.xform(selectionl,q=l,t=l,ws=l)#询问所选的第 2 个物体的位置信 息,并存入变量posmc.xform(selection0 z t=pos,ws=l)#把这个pos变量的值给所选的第一个物体先执行以上代码,什么也不会发生,因为我们现在已经定义了一个函数,这个函数叫snap,接下来,我们要执行这个函数了。先选pCubel,然后按Shift加选pSpherel,执行函数:snap()我们看到,pCubel的位置完全移到pSpherel的位置上去了。如果我们撤消操作,先选 pSpherel,再力口选pCubel,执行函数后结果就成了 pSpherel的位置完全移到pCubel 的位置上去了。这里我们看到选择的顺序对最终的执行结果形成了直接的影响。所以我们先 要测试MAYA中的选择顺序和mc.ls(sl=1)命令之间的关系。再次选pCubel,然后按Shift 加选pSpherel,然后执行:mc.ls(sl=l)我们看到MAYA返回了一个列表”pCubelJpSpherel”然后同样反过来操作,先选 pSpherel,再加选 pCubel,执行 mc.ls(sl=l),得到的列表结果是 pSpherel JpCubel。所以得出结论:加选的物体,会追加到列表的结尾。selection。就是先选的物体,selection 1就是后选的物体。如果我们想要把后选的物体作为目标位置的话,那我们就要获取后选物体的位置信息:pos=mc.xform(selectionl,q=l,t=l,ws=l)。我们再次用到了询问开关 q;t 就不 用多说了吧,如有疑问可以参考上一篇3.3.1;ws(worldspace)是世界空间的意思,打开 ws说明你所要获取或设置的参数是基于世界坐标的,而不是局部坐标(可以在帮助文档中 找到)。这样我们就把后选的那个物体selectionl的位置信息记录到了 pos变量里。随后我们把这个位置信息用mc.xformCselectiontO,t=pos,ws=l)命令赋予给先选的 物体selection0,这样selection。的位置就看上去像吸到selection:!上去了。扩展:我们可以
展开阅读全文