在Maya中使用mel/python创建简单层级结构
我想在Maya里创建一个非常简单的结构,里面有组节点和定位节点,然后把它导出到我的游戏关卡中。
比如说:
Group_Root
group_parent
- group1
- locator1
- group2
- locator2
- group3
文件里只有一个叫Group_Root的根组,还有很多叫group_parent的组(每个名字都不一样)。不过,所有的group_parent都有三个相同的子组名字("group1"、"group2"、"group3"),而且所有的group1里都有一个叫locator1的定位器。
我现在有的代码是:
group_parent = c.group( em=True, name="group_parent", parent="Group_Root")
modes = ["group1", "group2", "group3"]
for mode in modes:
mode_group = c.group( em=True, n=mode, parent=group_parent )
if mode == "group1":
s = c.spaceLocator(name="locator1")
c.parent( mode_group )
elif mode == "group3":
s = c.spaceLocator(name="locator2")
c.parent( mode_group )
但是在“c.parent(mode_group)”这一行我遇到了一个错误。
# 错误:对象group1无效
这可能是因为有多个叫“group1”的节点,所以它不知道该把哪个作为父节点。
有没有办法用完整路径来解决这个问题?比如说“Group_Root|group_parent|group1”。
3 个回答
我猜你在这两年里应该已经搞明白这个问题了,不过为了后人着想,我还是说一下这里有两个问题。首先,你说得对,确实需要使用绝对路径,但在你使用maya.cmds.parent()这个调用时也有一个小错误。我稍微改写了一下代码来说明一下,主要是你可以利用创建对象时它们默认会被选中的这个特点,而maya.cmds.ls()也足够聪明,可以返回你需要的东西。所以:
c.group( em=True, name="group_parent", parent="Group_Root")
group_parent = c.ls(sl=True)[0]
modes = ["group1" , "group2", "group3"]
for mode in modes:
c.group( em=True, n=mode, parent=group_parent )
mode_group = c.ls(sl=True)[0]
if mode == "group1":
c.spaceLocator(name="locator1")
s = c.ls(sl=True)[0]
# maya.cmds.parent() with something selected will actually
# parent the specified object to the selected object.
# You don't want that.
# We might as well use the explicit syntax to be sure
# (parent everything specified to the last item in the list)
c.parent( s, mode_group )
elif mode == "group3":
c.spaceLocator(name="locator2")
s = c.ls(sl=True)[0]
c.parent( s, mode_group )
在使用MEL的时候,名字有时候会让人感到烦恼。一般来说,最好不要完全相信你所指定的名字。
下面这个例子就是一个不好的做法:
group -n myGroup1 circle1 sphere1;
..因为这样做并不能保证你得到的结果一定会叫“group1”。更好的方法是先执行你的命令,然后把结果保存到一个字符串变量里,比如:
string $result = `group -n myGroup circle1 sphere1`;
然后,你可以用$result来引用这个结果组。即使这个组最后叫做'myGroup23',这样做也能正常工作。
我不太确定上面的代码在Python中是怎样的,因为我主要是熟悉MEL,但同样的原则应该是适用的。
还有一个可以关注的功能是命名空间(namespace和namespaceInfo),可以用来为当前的唯一顶级组定义一个新的命名空间。
希望这些对你有帮助。
你听说过 VFX Overflow 吗?这是一个关于视觉特效的问答网站,所以我想这里的很多人应该对Maya、MEL和Python这些工具比较熟悉。不过这个网站还比较新,用户还不多...