使用mel / python在Maya中创建一个简单的层次结构

时间:2010-01-19 21:38:43

标签: python maya autodesk mel

所以我想在Maya中用组和定位器节点创建一个非常简单的结构,然后将其导出以用于我的游戏级别。

e.g。

Group_Root
  group_parent
    - group1
      - locator1
    - group2
      - locator2
    - group3

文件中只有一个Group_Root,有很多group_parents(每个都是唯一命名的) 但是所有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)”

中收到此错误

#Error:对象group1无效

大概是因为有多个节点叫做“group1”,所以它不知道哪个节点是父节点。

知道我如何用完整路径做到这一点?例如“Group_Root | group_parent |组1”

3 个答案:

答案 0 :(得分:0)

你见过VFX Overflow吗?这是视觉效果的Q& A,所以我希望许多观察者对Maya / MEL和Python非常熟悉。也就是说,这是相当新的,所以用户群仍然很小......

答案 1 :(得分:0)

MEL的名称可能有点烦人。一般来说,最好永远不要相信你所指定的名称。

这是*不做事情的一个很好的例子:

group -n myGroup1 circle1 sphere1;

..因为这绝不能保证会产生名为“group1”的东西。更好的方法是运行命令并将结果捕获到字符串变量中,例如:

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

然后,使用$ result来引用结果组。即使该小组最终被称为“myGroup23”,这仍然有效。

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

另一个需要注意的是名称空间功能(名称空间和名称空间信息),它可用于为手头的唯一顶级组定义新的名称空间。

希望有所帮助

答案 2 :(得分:0)

我猜这是两年多了,你现在已经想到了这个......但是对后人来说,有两个问题 - 首先,你需要绝对路径,但是有你应用maya.cmds.parent()调用的方式也有一点点错误。我刚刚做了一些简单的重写来说明 - 主要是你可以使用这样一个事实:当你创建它们时它们会被默认选中,而maya.cmds.ls()足够聪明,可以返回你需要的东西.. Ergo:< / p>

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 )