Maya教程之maya python
白羽 2018-08-09 来源 :网络 阅读 2004 评论 0

摘要:本文将带你了解Maya教程之maya python,希望本文对大家学Maya有所帮助

        本文将带你了解Maya教程之maya python,希望本文对大家学Maya有所帮助


 







由于语言的巨大差异,在 Python 中调用 Maya 命令的方式与在 MEL 中使用 Maya 命令的方式有许多区别。 
下面是 Maya 中使用 Python 的入门基础知识:
在 Maya 中输入 Python 命令
有几种方法可以在 Maya 中输入 Python。 
脚本编辑器(Script Editor)

为了便于在 Maya 中同时使用 MEL 和 Python 脚本,“脚本编辑器”(Script editor)已修改为每种语言具有单独的选项卡。输入到 MEL 选项卡窗口中的语句将发送到 MEL 进行处理;同样,输入到 Python 选项卡窗口中的语句将由 Python 处理。 
从 Python 返回的结果会带有 Python 注释字符 (#) 前缀。注意 在脚本编辑器中,可借助自动完成来更快地查找命令名。有关详细信息,请参见获取有关 MEL 命令的帮助。有关详细信息,请参见脚本编辑器。
命令行和“工具架”(Shelf)

也可在命令行输入简短的 Python 命令。通过切换可选择输入 MEL 命令或 Python 命令。  
与 MEL 脚本类似,也可使用鼠标中键 (  ) 将 Python 脚本拖动到“工具架”(Shelf)。此时将出现一个对话框,询问脚本是 Python 脚本还是
 MEL 脚本。 

 
Maya Python 模块
所有本地 Maya 命令的 Python 绑定位于 maya.cmds 模块中。为了访问这些命令,在每个会话中,必须在“脚本编辑器”(Script editor)的 Python 选项卡中输入以下命令:



import maya.cmds
复制代码
此命令允许用户使用 Maya 命令。例如:



maya.cmds.ls() maya.cmds.sphere( radius=4 )
复制代码
可以将 Maya 命令导入到不同且较短的名称空间:



import maya.cmds as cmd cmd.sphere()
复制代码
提示可以在 userSetup.py 文件中自动导入 maya.cmds。可以将此命令修改为使用首选前缀,例如:



import maya.cmds as mc mc.sphere()
复制代码
有关详细信息,请参见在 Python 中和为 Python 初始化 Maya 环境。
注意也可以使用以下命令将 Maya 命令导入到顶层级名称空间:



from maya.cmds import *
复制代码
然后,可以使用更简便的方法来引用 Maya 命令:



ls() sphere( radius=4 )
复制代码
警告:导入到顶层级名称空间会覆盖 Python 内置模块和其他模块中的定义。
例如,Python 具有其自身的帮助系统,调用 Python 版本的 help 将生成特定于 Python 的输出。调用 maya.cmds.help 将提供有关 Maya 命令的帮助。将 maya.cmds 导入到顶层级名称空间会导致不能访问 Python 帮助。 

标志(命名参数)
在 Python 中与在 MEL 中处理标志的方式不同。MEL 是使用 shell 命令样式语法设计的。 
对于 Python 中的 Maya 命令,命令参数语法已调整为适用于 Python 的方式。因此,标志(长短形式)会作为命名参数传递给命令。参数的名称是标志名称,标志的参数会传递给命名参数。 

单个参数
MEL 球体命令是:



sphere -radius 4;
复制代码
在 Python 版本中,标志 radius 作为命名参数被引用,由于只有一个参数,该值按以下形式传递:



maya.cmds.sphere( radius=4 )
复制代码

多个参数
如果标记具有多个参数,那么这些参数需要压缩到列表或元组中。以下是带有标志(包含三个参数)的命令的示例。



# With a tuple maya.cmds.ambientLight( rgb=( 0.2, 0.3, 0.4 ) ) # With a list maya.cmds.ambientLight( rgb=[ 0.2, 0.3, 0.4 ] )
复制代码

所需参数 (True/False)
命名参数必须具有与它们关联的值。但是,并非所有的 Maya 标志都需要一个值(例如,ls -sl)。为了保存一致的语法,Autodesk Maya Python 实现需要为通常不使用任何参数的标志指定布尔参数。如果布尔值为 False,那么将忽略该标志;如果为 True,那么将使用该标志。例如:



# Pass selection flag maya.cmds.ls( selection=True ) # Selection flag is ignored here maya.cmds.ls( selection=False )
复制代码

多个命名参数
可能会在一个命令调用中多次使用某些标志。例如,在 MEL 中:



ls -type nurbsSurface -type transform;
复制代码
在 Python 中,将使用命名参数 type 并以列表或元组传递这些值。



maya.cmds.ls( type=['nurbsSurface','transform'] )
复制代码
在标志被多次使用和具有多个参数的情况下,该值将是列表的列表。也可以使用元组来代替列表,因此您可以使用列表元组、元组列表或元组的元组。例如,MEL 中的 curveOnSurface 命令:



curveOnSurface -d 3 -uv 0 0 -uv 0.3 0.5 -uv 0.5 0.6 -uv 0.9 1.0 surface1;
复制代码
在 Python 中:



maya.cmds.curveOnSurface( 'surface1', d=3, uv=[(0,0),(0.3,0.5),(0.5,0.6),(0.9,1.0)] )
复制代码
如果使用多个参数标志,Python 会返回错误(“Duplicate keyword argument”)。
范围
Maya 命令中有三种类型的范围:时间、索引和浮点。在 Python 中必须使用元组指定所有范围。任意元组都可能有一个或两个值。具有一个值的元组指定为一个值(加括号并后跟逗号);多个单值元组使用集表示法指定(请参见多个命名参数)。 
时间范围也支持单位。若要指定单位,必须使用字符串。由于每个值是单独解析的,因此可以混合使用单位。
以下是有效的时间范围:



(1,) (1,10) ('1sec','10sec') ('1min:2min')
复制代码
下表以 cutKey 命令为例来指定时间范围和索引范围。

MEL 范围

含义

Python 范围

-time 10pal


在第 10 帧(PAL 格式)处剪切关键帧


time=('10pal',)


-time 1.0sec -time 15ntsc -time 20


在时间 1.0 秒、第 15 帧(以 NTSC 格式)和时间 20(当前定义的全局时间单位)处剪切关键帧。


time=[('1.0sec',), ('15ntsc',), (20,)]


-time "10:20"


剪切 10 到 20(含 10 和 20,采用当前时间单位)的范围内的所有关键帧。


time=(10,20)


-time "10:"


剪切从时间 10(当前时间单位)以后的所有关键帧。


time=('10:',)


-time ":10"


剪切时间 10(当前时间单位)时及之前的所有关键帧。


time=(':10',)


-time ":"


剪切所有关键帧


time=(':',)


-index 0


剪切每条动画曲线的第一个关键帧。
(索引是基于 0 的。)


index=(0,)


-index 2 -index 5 -index 7


剪切第 3、6 和 8 个关键帧。


index=[(2,),(5,),(7,)]


-index "1:5"


剪切每条动画曲线的第 2、3、4、5 和 6 个关键帧。


index=[("1:5",)]


对某些命令标志的更改
对 Maya 命令所做的某些标志更改是必需的,因为 Python 中的多用途标志的参数必须以列表传递给标志。对于其中必须混合并匹配多用途标志的命令而言,这将导致出现问题。由于 Python 每个多用途标志的参数均以单独的列表提供,因此无法将这些参数混合使用。已扩展依赖于此的几个命令,以便单个多用途标志可以处理各个多用途标志的作业。 
这些命令包括: 

polyAppendVertex :可用于取代 point、vertex 和 hole 标志的新 append 标志。

polyAppend :可用于取代 point、edge 和 hole 标志的新 append 标志。

polySplit :可以用于取代 facepoint 和 edgepoint 标志的新 insertpoint 标志。

polyCreateFacet :经过修改后可用于指定洞的现有 point 标志。

roundConstantRadius :可替换使用应该混合使用的 sidea 和 sid b 的新 side 标志。CommandsPython 参考文档中记录了所有这些标志的使用。
在所有情况下,这些标志都是向后兼容的。所有旧标志仍保留在原位。 

参数和对象
上面的 curveOnSurface 示例还表明了另一 Python 语法要求。除了标志,Maya 命令还使用参数和对象。参数是命令所需的固定类型的值。例如,move 命令使用三个参数表示移动的 X、Y 和 Z 值。对象是命令在其上操作的实体(例如,场景中的某个对象或 UI 元素)。基于当前的选择列表,一个命令针对的对象数量是变化的,并且有时对象是隐式的。 
对象和参数将如同在 MEL 中一样传递给命令,但传递的顺序必须如下所示:



command arguments object flags/named arguments
复制代码
这不同于 MEL,MEL 中的排序要求对象显示在参数列表结尾处。但是,Python 要求命名参数显示在所有其他参数之后。 
参数类型的摘要
下表显示了可在 Maya Python 模块中使用的标志(命名参数)类型的摘要。

标志类型

示例

注释

普通标志


MEL: ls -selection
Python: maya.cmds.ls( selection=True )


不带参数的标志将获得布尔值 True/False 切换


具有单个参数的标志


MEL: sphere -radius 10
Python: maya.cmds.sphere( radius=10 )


  

具有多个参数的标志


MEL: ambientLight -rgb 0.2 0.3 0.4
Python: maya.cmds.ambientLight( rgb=( 0.2, 0.3, 0.4 ) )


使用元组指定多个参数


多用途标志


MEL: ls -type nurbsSurface -type transform
Python: maya.cmds.ls( type=['nurbsSphere','transform'] )


使用列表以包含多个标志值


具有多个参数的多用途标志


MEL: curveOnSurface -d 3 -uv 0 0 -uv 0.3 0.5 -uv 0.5 0.6 surface1
Python: maya.cmds.curveOnSurface( 'surface1', degree=3, uv=[(0,0),(0.3,0.5),(0.5,0.6)] )


使用元组列表。
(也可以使用一个元组或多个元组、列表的列表或列表的元组。)


命令参数


MEL: move 2.0 1.0 1.0
Python: maya.cmds.move( 2.0, 1.0, 1.0 )


除参数必须在前外,与 MEL 相同


带有标志的命令参数


MEL: move -objectSpace 2.0 1.0 1.0
Python : maya.cmds.move (2.0,1.0, 1.0,objectSpace=True)


  

命令对象


MEL: select nurbsSphere1
Python : maya.cmds.select nurbsSphere1 ("")


与 MEL 相同


带有参数和标志的命令对象


MEL: move -objectSpace 2.0 1.0 1.0 nurbsSphere1
Python : maya.cmds.move (2.0,1.0, 1.0,"nurbsSphere1",objectSpace=True)


对象必须在标志之前


标志/参数使用值的查询


MEL: skinCluster -q -inf;
Python maya.cmds.skinCluster (q=True, inf=True)


需要布尔值 True 的查询标志。


标志/参数不使用值的查询


MEL: skinCluster -inf joint1 -q -dr;
Python: skinCluster (q=True, inf='joint1', dr=True)


  

标准输入 (stdin) 实现
Python 支持从 STDIN(标准输入)进行读取。在 Python 脚本中,这是通过从 sys.stdin 进行读取或调用 raw_input 来实现的。当 Maya 在 GUI 模式(与批处理模式相对)下运行时,Maya 会拦截来自 Python 的调用并通过一个对话框来提示用户在其中键入输入。 
Maya 会使用其自身的实现来覆盖 sys.stdin。如果要使用 Python 自身的标准输入对象,可通过引用 sys.__stdin__ 来实现此目的。
示例
在“脚本编辑器”(Script Editor)中输入以下内容之一来显示 Python STDIN 对话框: 

使用 raw_input



raw_input()
复制代码

使用 sys.stdin



import sys
复制代码




inp = sys.stdin.readline()
复制代码

自定义命令提示



import maya.cmds as cmds
复制代码




inp = cmds.promptDialog(message='hello')
复制代码
MEL/Python 通信
新的 MEL 命令 (Python) 会提取字符串并将其传递到 Python 中予以执行。Python 命令会尝试将结果转化为 MEL 类型。



python( "import maya.cmds" ) python( "maya.cmds.ls" )
复制代码
注意 
只有带有单个 Python 语句的字符串才能返回结果。这是当前由 Python 施加的限制。
Python 的类型系统比 MEL 更复杂,因此无法将所有 Python 数据类型转化为本地 MEL 类型。Python 命令会转化自身知道如何进行处理的数据类型。对于其他数据类型,则会需要一个字符串来表示对象并进行返回。 下表显示了当前支持的对照关系:

Python 返回值

MEL 转化

字符串


字符串


unicode


字符串


整型


整型


浮点型


浮点型


包含数字的列表,至少包括一个浮点


float[]


仅包含整型或长整型的列表


int[]


包含非数字的列表


string[]


其他内容


字符串


空 Python 列表


空字符串数组 (string $array[])


从 Python 调用 MEL
若要从 Python 调用 MEL,请使用 maya.mel.eval() 函数。由于 Python 的类型支持更灵活,此函数的转化效果会比 MEL 的 Python 命令更好。
必须导入以下 maya.mel 模块才能使用此命令:



import maya.mel as mm mm.eval("polySphere;")
复制代码
下表列出了支持的转化:

MEL 返回值

Python 转化

字符串


字符串


整型


整型


浮点型


浮点型


矢量


3 元组值


矩阵


列表的列表,其中列表的每个子列表包含一行矩阵


string[]


字符串列表


int[]


整型列表


float[]


浮点列表


vector[]


3 元组的列表


位置参数
位置参数指的是 UI 元素向其回调脚本传递的参数。例如,浮点滑块控件的回调 MEL 脚本可以包含 # 1。在运行此回调时,浮点滑块的值将替换为此位置参数。
Python 支持两种在回调中替换来自控件的值的方法。如果回调是一个要对其求值的字符串,Maya 就以 MEL 中的方式进行字符串替换。但是,会使用 Python 的格式运算符进行替换。格式操作将会获得一个传递来的用于替换的项目字典,其中值的名称为 1、2 等等。例如:



maya.cmds.floatSlider( cc="print '%(1)s'" )
复制代码
(稍后,在执行此字典之前,会先将其应用于字符串。在执行脚本之前,floatSlider 命令使用当前滑块值对此字符串进行格式设置。对于格式操作,用户为其提供格式字符串,UI 元素为其提供字典。)
Python 回调的第二个样式使用编译的函数,其中 Maya 将值作为参数传递给该函数:



def doPrint( arg ): print arg cmds.floatSlider( cc=doPrint )
复制代码
使用回调函数时,如果回调没有使用正确数量的参数,则会收到错误消息。



def badStuff(): print "bad" cmds.floatSlider( cc=badStuff )
复制代码
在移动滑块时会看到以下错误:



# TypeError: badStuff() takes no arguments (1 given)
复制代码
如果要创建可使用任意数量的参数的回调,请使用变量参数列表:



def genericCallback( *args ): print( "args: " + str ( args ) ) cmds.button( command=genericCallback )    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标常用软件之Maya频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved