Maya Python 简易教程Word文档格式.docx
《Maya Python 简易教程Word文档格式.docx》由会员分享,可在线阅读,更多相关《Maya Python 简易教程Word文档格式.docx(36页珍藏版)》请在冰点文库上搜索。
一处是右下角的ScriptEditor按钮,点开窗口如下:
我们的PYTHON代码就是写在PYTHON选项卡中,如果PYTHON脚本在MEL选项卡中执行将会出错,viceversa。
我们在MAYA中执行的操作会通过MEL语言打印在上面灰色区域,也就是输出区域。
这些MEL语言都可以非常快地转化成PYTHON代码。
这个数据输出区域同时也会打印PYTOHN脚本的执行结果以及出错信息。
现在我们来执行一条简单的PYTHON语句,来一个初体验:
PYTHON页面中输入print"
hellomaya"
,然后按数字键盘上的小回车(注意:
小回车是执行代码,大回车是换行)。
我们看到输出区域的打印结果如下:
print"
hello!
MynameisHuYongbin"
MynameisHuYongbin
第一行是告诉用户,你执行了print"
这条命令,第二行hello!
MynameisHuYongbin是执行这条命令的结果,这里的执行结果就是:
MynameisHuYongbin被打印出来了。
命令执行成功。
但是我们发觉PYTHON页面里的代码也消失了。
如果需要反复执行代码,可以选中需要执行的代码,然后按小回车,这样,我们可以在执行代码的同时保留页面里的代码。
(建议使用第二种方法执行代码)
接下来,再举个简单的例子来说明输出窗口中的报错信息。
随意在命令行中输入一些字母HuYongbin,然后执行,出现如下信息:
HuYongbin
#Error:
NameEror:
name'
HuYongbin'
isnotdefined#
这是个简单的报错信息,说明HuYongbin没有被定义,电脑无法识辨。
这条命令是无效的。
最后就是#符号,#后的所有的代码(换行前)都被看作注释,不参与运算。
例如:
#print"
hellomaya"
:
)
虽然也是print命令,但是前面有#,所以无视。
现在我们终于知道如何在PYTHON中执行代码,以及辨别代码是否有效。
在下面的教程中,我将会用一些简单的实例来展示PYTHON的常用功能!
数据类型就是数据的类型--U,就是不同类型的数据,数据类型包括:
整型,浮点,字符,列表,元组,字典。
整型(INT)就是整数,比如:
1,3,21,1000……
浮点(FLOAT)就是带小数点的数字,比如:
1.12,4.5……
字符(STRING)就是文字,需要用单或双引号,比如:
"
HuYongbin"
,"
12"
3.1415"
#_%)"
列表(LIST)就是一系列数据的组合,用中括号,比如:
[2,3],["
tom"
jerry"
],["
marry"
,14]
元组(TUPLE)用小括号,和列表的区别是他是不可变的:
(2,3),("
),("
,14)
操作符,形象的说就是用来操作数据的工具,包括数学操作符,比较操作符,逻辑操作符。
数学操作符:
+(加)-(减)*(乘)/(除)%(取除法余数)**(乘方)
比较操作符:
<
(小于)<
=(小于等于)>
(大于)>
=(大于等于)==(等于)!
=(不等于)
逻辑操作符:
andornot
下面来做一些热身,在实际运用中体会不同数据类型之间的配合!
2.2.1整数
a=1#定义变量a,把整数1赋予给a
b=3#定义变量b,把整数3赋予给b
a+b
运行结果为3,其他整数小数的加减乘除这里就不熬述了~
2.2.2字符
name1="
#定义变量name1,把字符tom赋予给name1,注意双引号
name2='
jerry'
#定义变量name2,把字符jerry赋予给name2,注意这里是单引号,都可以表示
name1+name2
运行结果为"
tomjerry"
,这里说明字符之间可以相加。
但是不同数据类型之间不可以相加,变量a和变量name1就不可以相加,因为一个是整数,一个是字符。
字符单引号和双引号的不同用法我会再之后的实例中写出。
2.2.3列表
list1=[1,2,3]#定义列表list1,包含3个整型数字
list2=["
cube"
"
sphere"
plane"
]#定义列表list2,包含3个字符
list=list1+list2#把list1和list2的相加结果赋予新的变量list
printlist
运行结果为[1,2,3,"
],可见,包含不同数据类型的列表之间可以相加
我们可以对列表中的数据进行访问操作。
执行以下命令:
list[0]+list[2]
运行结果为4,因为list[0]指的是list列表中的第一项,list[2]指的是list列表中的第3项。
(注意,PYTHON数数是用0开始的),依次类推,list[4]指的就是“sphere”。
list[3]*list[1]
cubecube"
,其效果等同于"
*2,可见,字符和整数间,可以做乘法运算。
同样,如果"
c"
*5的运算结果就是"
ccccc"
。
user1=["
cat"
]
user2=["
mouse"
userInfo=[user1,user2]#定义列表userInfo,该列表内又嵌套了2个列表
printuserInfo#打印userInfo
运行结果为[["
]],我们看到大列表中包含了2个小列表
我们同样可以访问嵌套列表:
userInfo[0]表示userInfo中的第一个列表user1,userInfo[0][1]表示user1中的第2个值"
同样,如果要访问"
,你可以通过userInfo[1][0]来访问。
我们还可以对列表里的内容进行添加或移除:
userInfo.append(["
jack"
male"
])
这样我们再次打印userInfo的时候,得到的结果应该为[["
]]
userInfo.remove(["
列表和字符还可以访问其区间的数据:
a=[1,2,3,4,5,6,7,8]#定义列表a
b="
abcdefg"
#定义字符b
a[3:
5]#返回的值是[4,5,6],是列表a的第4位到第6位
b[1:
4]#返回的值是"
bcde"
a[3:
]#返回的值[4,5,6,7,8],从第4位一直到结尾
b[:
-4]#返回的值是"
abc"
,从第1位到倒数第4位
2.2.4常用工具
接下来,我给大家介绍一些不同数据类型中的常用工具!
2.2.4.1+=操作符号
a=1
a+=1#等同于a=a+1
运行结果为2,因为a=1,a+1等于2,然后把2这个数字赋予给原来的a,这样,2就替换掉原来的1了,a就等于2
2.2.4.2pow()乘方命令
x=pow(4,3)#就是4的3次方
y=pow(4,-2)#也就开根号
2.2.4.3len()获取长度命令
len()命令能够返回字符和列表的长度,如下:
len("
tommy"
)#返回结果是5
len([1,2,6])#返回结果是3
len([[1,2,7],["
lock"
],["
bach"
davinci"
vivaldi"
]])#返回结果为3,因为里面包含3个列表
2.2.4.4int()str()数据类型转换命令
int()的str()是字符和整数转换的命令,非常实用:
a=256
b=int("
256"
)#把字符"
转换成整数256
a-b#运行结果为0
c="
maya"
d=str(2011)#把整数2011转换成字符"
2011"
c+d#运行结果是"
maya2011"
2.2.4.5max()min()最大值最小值命令
max()和min()可以用来比较数字的大小:
max(1,7)#结果为7,两个取大的值
min(3,6)#结果为3,两个取小的值
2.3.1if语句
if就是如果的意思,是条件判断语句的关键词,一般可以和elif或else语句结合使用。
接下来我会用一些简单实用的例子来说明if语句的用法:
age=17#定义age等于17
ifage<
18:
#假设第一种情况,注意要用冒号
youarenotadult"
#注意代码缩进
else:
#假设第二种情况,注意冒号
youareadult"
这里的运行结果是"
youarenodadult"
,因为假设第一种情况是成立的。
这里提一提代码缩进,缩进就相当于写作文时每小节开头要空2字;
代码缩进,就是指被缩进的代码是上一行代码的子代码。
name="
#定义name变量
ifname=="
:
#注意这里是“==”,不是“=”
Hello,tom"
运行结果是打印"
“==”和“=”的区别是:
“=”相当于是个动词,把"
这个字符值传递给变量name;
“==”表示一种状态。
这句话翻译成人类的语言就是:
假设name的值等于"
这个状态是成立的。
(一旦成立就执行后面的语句……)
a=3
ifa<
1:
#假设1
a<
1"
elifa==1:
#这里出现了假设2
a=1"
#如果两种假设都不成立的话……就执行下面的语句
a>
运行结果是"
很显然,a不小于1,也不等于1,那就只有执行else后面的语句了。
2.3.2for循环语句
for语句的操作对象一般是一个序列,对序列中的每一个成员进行操作,举例:
seq=[1,2,3]#定义一个列表
foriinseq:
#for即将对列表seq中的每个成员进行操作,成员我们用i来代替(这里成员变量可以自定义)
printi+1#操作的内容:
给每个成员+1
执行结果如下:
2
3
4
我们给每个成员都+1了
说到for循环语句,我们不得不提一下range()内置函数。
range()可以针对数字提供一个序列范围:
range(10)
运行结果就是:
[0,1,2,3,4,5,6,7,8,9]
range(5,10)
[5,6,7,8,9]
range(0,10,2)
[0,2,4,6,8]
结合for语句,我们可以尝试执行以下代码:
x=["
a"
b"
d"
e"
f"
g"
h"
foriinrange(0,10,2):
#操作范围:
printx[i]#i将会被[0,2,4,6,8]中的每一项依次替代,替代后再执行print语句。
运行结果:
a
c
e
g
在PYTHON中,我们可以自己定义一个函数,定义函数的命令是def,如下:
defMyFirstFunction():
thisismyfirstfunction"
这里我们用def命令定义了一个函数名字叫MyFirstFunction,后面括号里面是用来填写参数的,如果没参数,就留空。
定义函数内的代码需要缩进。
如果要执行函数,操作如下:
MyFirstFunction()#这样输入,就可以执行函数,函数内的所有命令都会被执行
执行后,结果会打印"
,说明定义函数内的代码被正确执行了。
函数还有一种定义方式,就是在括号里加上一些参数:
defMySecondFunc(a,b):
#该函数包含了a和b两个参数
printa+b
然后我们来执行这个函数:
MySecondFunc(2,5)#把2和5分别代入a和b,然后执行,函数内的print命令会被执行。
运行结果为7
MySecondFunc("
first"
second"
)
firstsecond"
,两个字符串被相加了。
函数还可以签套函数,如下:
deffunc1():
printa
deffunc2():
b=2
printb
func1()
定义好func1和func2后,执行func2(),结果为:
1
因为func2先执行打印b,在执行func1,func1会打印a
简单说,模块就是一个打包的命令集合,以文件的形式存在。
模块的使用方法是“导入”。
我们直接针对MAYAPYTHON的模块来具个简单的例子吧。
2.5.1maya模块
importmaya.cmds#导入maya模块中的cmds命令集
这样,我们就在MAYA中导入了cmds命令集,里面包含了所有可以在PYTHON环境中使用的MAYA命令。
现在我们来初试这个cmds命令集
importmaya.cmds#导入模块
maya.cmds.polyCube()#调用模块中的polyCube()命令。
发觉场景里生成了一个方块,命令执行成功。
但是这样打命令太长了,我们在导入maya.cmds时加上:
importmaya.cmdsasmc
这样maya.cmds就作为mc导入了,我们就不用再打长长的maya.cmds了。
我们再创建一个Cube:
mc.polyCube()
短很多了吧。
接下来介绍几个常用的模块:
importmaya.mel#导入这个,可以调用所有的mel命令
2.5.2os模块
importos
os模块也是用的比较多的。
我经常会使用os.system(),括号中间可以写一些DOS命令:
os.system("
mdc:
\\MyFolder"
)
这样就可以用PYTHON来调用DOS命令了。
os.listdir("
C:
\\"
listdir可以以列表的形式列出路径中的所有的文件和文件夹(注意:
是列表的形式,像这样:
['
a.py'
'
AUTOEXEC.BAT'
boot.ini'
])。
接下来再介绍一个re模块,我经常用它来做字符的切割工具:
2.5.3re模块
importre
a="
Hello_World"
re.split("
_"
a)#split就是切割工具,有2个参数,"
就是切割的根据,a是我们定义的变量
返回结果是一个列表,["
Hello"
World"
],还有个是替换命令re.sub():
my4name4is4HuYongbin"
re.sub("
4"
a)#就是说把4替换成"
输出结果:
my_name_is_HuYongbin"
2.5.4time模块
importtime#时间模块
time.ctime()
执行结果:
#Result:
FriJun1122:
52:
162010#。
也就是当前的时间。
OK,PYTHON简易教程就写到这里,简易教程的内容肯定不是很完整,这里只是罗列出一些实战中比较常用的功能。
(也是我比较常用的)初学者可以抛弃理论,先玩起来再说。
实践太重要了。
在下一篇中,我们将正式进入MAYAPYTHON实际应用。
---第二篇完---
MayaPython第三篇-实战演习
在上一篇中,我主要介绍PYTHON的一些基础知识以及常用语法。
在这一篇中,我们要结合MAYA中的命令来编写一些基本PYTHON脚本。
其实在上一篇接近尾声的时候,我已经举例了如何导入模块的方法,这是真正使用PYTHON在MAYA中编写脚本的第一步。
importmaya.cmdsasmc#这里应该不用解释了吧,有疑问可以看第二篇的结尾“模块”部分。
:
这里顺便提一提,asmc可以用任何名词来代替,ascc也可以。
这样,如果要调用polyCube()命令的话,就必须有cc.polyCube()作为前缀。
基于笔者的个人习惯,我们这里还是用mc
3.1MEL命令和PYTHON命令之间的转化
我们导入MAYA的模块,现在要运用模块中的命令编写一些东西了。
但是大家可能会很疑惑,写什么呢?
我们总不见得整天在MAYA里做小学数学题吧--现在我们需要学习一些MAYA的实用命令(比如上一篇提到的polyCube()创建一个立方体),学习实用命令的最好的途径是通过执行手动操作命令来获取MEL命令语句,然后把MEL命令转换成PYTHON命令。
比如我们在MAYA3D视图中用传统的方法建立一个polygon的立方体,我会在脚本编辑器的输出部分得到以下输出信息:
polyCube-chon-oon-w9.9-h7.1-d10-cuv4;
//注意大小写
这是一句MEL命令,描述了如何创建一个Polycube。
MEL命令的结构十分简单,开头的polyCube就是这句MEL命令的主命令,后面的部分全部是参数。
其中,带“-”的,是参数名称;
没有“-”的,是该参数的值。
一般都是一个带“-”号的参数名称,后面再跟一个不带“-”的值。
有时后面会不跟值,这说明这个参数不需要值,它只是一个开关,带这个参数,说明这个开关开着,不带说明关着。
现在,我们就把这句MEL命令转换成PYTHON可以执行的命令(我们暂时不去理会具体参数的作用,只是学习一个转换过程):
mc.polyCube(ch=1,o=1,w=9.9,h=7.1,d=10,cuv=4)
执行代码后同样得到了一个立方体。
我们对比一下,可以发现PYTHON可以完全把MEL的命令转化过来,只是格式不一样。
格式不同体现在一下几点:
有mc前缀(MEL没有前缀)
所有的参数信息需要放在主命令后的括号中(MEL没有括号)
参数名和它的值之间用等号隔开(MEL是用空格)
每个参数之间用逗号隔开(MEL用空格)
有些参数的值是1,而ME是on
关于最后一条,其实MEL的on也可以写成1,原因是,在PYTHON(包括其他程序语言),1这个值往往表示True,on等肯定意义的值,而0则表示False,off等否定意义的值。
这样的值叫做布尔值(boolean),这种数据类型只有2种答案要么1,要么0;
要么真,要么假;
要么ON,要么OFF。
例子中的1就是on,说明这个参数是可用的。
关于布尔值(其实你在MAYA中也可以把它理解成一个开关),以后还会讲到它的用法。
节下来我们举一反三,熟练掌握MAYA命令转换的方法。
拖一个球出来,得到以下命令:
polySphere-chon-oon-r3;
转成PYTHON代码,就是:
mc.polySphere(ch=1,o=1,r=3)
还有一中转化形式:
我们如果在场景中选择了pCube1这个物体,会得到以下MEL命令:
select-rpCube1;
这里我们就不能写成mc.select(r=pCube1)了,因为现在这个命令基本上属于一个动作,一个动词,既然是动词,就必须有一个动作施与的对象,这里这个对象就是pCube1,而r这个参数其实replace的简写。
注意这个r不是布尔值,它没有任何数据类型,只是一个开关而已。
在MEL中,这个开关是不需要值的,但在PYTHON中,需要像布尔值那样给一个1的值,表示这个开关开启:
mc.select("
pCube1"
r=1)#注意:
PYTHON中,选择对象放在最前面。
#注意名字的数据类型是字符,所以必须有双引号
如果要同时选择pCube1和pSphere1的话,需要用到列表,如下:
mc.select(["
pSphere"
])#注意如果是选择集合的话,要用列表来表示
#r参数在这里我就不加了,但是不影响执行,体会下“可选”的作用
3.2读取场景中信息的常用命令:
刚才我们知道了一些如何创建物