本篇文章主要讲述如何获取Maya文件的一些节点。
这种东西以前我就说过好几遍了哈,最后一次说了哈,别管中间操作是什么样,别想着某个操作的命令怎么写,直接手动操作一遍看最终的节点链接效果,结果生成了多少相关节点就用多少个
createNode
,打上了哪些链接就给哪些链接上connectAttr
,各自节点的属性是什么就setAttr
,需要什么父子关系就parent
,需要重命名就rename
,需要获取关系就listRelatives
,需要获取链接就listConnections
,查询transform信息就xform
,列出场景节点就ls
。节点(createNode
)-链接(connectAttr
)-属性(setAttr
)永远围绕着3个东西来转。最终呈现给你的并不是中间怎么操作,而是最终的结果,使用到的命令来回就这几个,就是这些命令最终能组成可以生效的节点网络,完毕。————劲爆羊厂长
在Maya内开发的时候通常需要获取当前文件内的某些节点,来更改名称或者设置一些属性。Maya也提供了获取节点的command命令ls
。接下来将围绕ls
来展开讲讲一们会用到的一些commands命令
通过命令直接获取
Maya的ls
命令有内置的获取一些基础物体的参数。例如:
#python
from maya import cmds
cmds.ls(ap=1)#获取当前场景所有节点
cmds.ls(sl=1)#获取选择的节点
cmds.ls(ca=1)#获取所有相机的shape节点
cmds.ls(mat=1)#获取所有材质球
#剩下的就不例举了
通过节点类型获取
在编写脚本的过程中,经常会遇到需要获取某个类型的节点,例如模型,Aistandsurface等
-
创建一个名为
pSphere1
的球 -
获取节点类型
objectType
cmds.objectType("pSphere1") # Result: transform #
-
使用
ls
获取某个类型的所有接单cmds.ls(type = "transform") # Result: [u'front', u'pSphere1', u'persp', u'side', u'top'] #
-
注意
Maya的模型分为transform
节点和shape
节点,这两个节点的type
不一样,在使用时要注意。
从某种类型获取场景中的某些节点比直接用ls
内置的要来的方便,例如cmds.ls(mat=1)
,会返回所有材质,里面可能有一些事我们不想要的,而通过类型获取可以避免这种情况。同时还有获取不到某些材质球的情况,这个问题后面会开一篇文章来讲述
通过节点名获取
在写脚本过程中,会用到获取某个命名的节点,例如:我要获取命名中包含某个字符串的模型,这个要怎么做到呢?
- 创建一些基础物体,命名为
aaa_bbb,bbb_aaa,bbb_aaa_ccc
- 利用简单的表达式获取
ls
命令可以使用一些简单的表达式,通过观察,我们可以发现3个物体的名称中都有aaa,我们可以以这个作为突破点cmds.ls("aaa*") # Result: [u'aaa_bbb', u'aaa_bbbShape'] cmds.ls("*aaa") # Result: [u'bbb_aaa'] cmds.ls("*aaa*") # Result: [u'aaa_bbb', u'aaa_bbbShape', u'bbb_aaa', u'bbb_aaaShape', u'bbb_aaa_ccc', u'bbb_aaa_cccShape']
- 在通过命名获取节点时,经常会因为namespace的问题,造成大大小小的干扰,这时我们可以用下参数
recursive
,我们将文件保存为ccccc.ma
,在Maya中新建一个场景,然后reference刚刚保存的文件,我们可以看到模型文件的命名前方多了ccccc:
cmds.ls("*aaa") # Result: []
居然返回为空,这时候我们加上参数
cmds.ls("*aaa", recursive=1) # Result: [u'ccccc:bbb_aaa']
多种方法混合
在刚刚运行命令cmds.ls("*aaa*")
的时候,我们得到了6个节点的名字,这里面3个是transform,3个是shape,这时,我们可以加上type参数,来精确筛选
cmds.ls("*aaa*", type="transform")
# Result: [u'aaa_bbb', u'bbb_aaa', u'bbb_aaa_ccc']
长短名称问题
在获取节点的时候有时候会返回一个很长的名字,例如|group3|group2|group1|bbb_aaa_ccc
。
这是因为Maya中有同名物体的原因,Maya同层级下是禁止重命名的,如果2个物体的命名一样,Maya会自动更改后命名的物体的名称。但是不同层级是可以创建相同命名的物体。Maya为了区分同名的不同物体,加了一个长名称的概念,其实自己观察不难发现,他就是文件所在的层级的全称。
那么我们也可以主动去获取长名称
cmds.ls("*aaa*", type="transform", long=1)
# Result: [u'|aaa_bbb', u'|bbb_aaa', u'|group3|group2|group1|bbb_aaa_ccc']
你好,我有个问题,我想判断”基于摄像机选择”这个功能是否开启,有办法实现吗?
可以的,api可以实现这个功能