在Maya中使用mel/python创建简单层级结构

1 投票
3 回答
5229 浏览
提问于 2025-04-15 18:13

我想在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 个回答

0

我猜你在这两年里应该已经搞明白这个问题了,不过为了后人着想,我还是说一下这里有两个问题。首先,你说得对,确实需要使用绝对路径,但在你使用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 )
0

在使用MEL的时候,名字有时候会让人感到烦恼。一般来说,最好不要完全相信你所指定的名字。

下面这个例子就是一个不好的做法:

group -n myGroup1 circle1 sphere1;

..因为这样做并不能保证你得到的结果一定会叫“group1”。更好的方法是先执行你的命令,然后把结果保存到一个字符串变量里,比如:

string $result = `group -n myGroup circle1 sphere1`;

然后,你可以用$result来引用这个结果组。即使这个组最后叫做'myGroup23',这样做也能正常工作。

我不太确定上面的代码在Python中是怎样的,因为我主要是熟悉MEL,但同样的原则应该是适用的。

还有一个可以关注的功能是命名空间(namespace和namespaceInfo),可以用来为当前的唯一顶级组定义一个新的命名空间。

希望这些对你有帮助。

0

你听说过 VFX Overflow 吗?这是一个关于视觉特效的问答网站,所以我想这里的很多人应该对Maya、MEL和Python这些工具比较熟悉。不过这个网站还比较新,用户还不多...

撰写回答