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

Posted

技术标签:

【中文标题】在 Maya 中使用 mel/python 创建一个简单的层次结构【英文标题】:Creating a simple hierarchy structure in Maya using mel/python 【发布时间】:2011-01-07 00:37:48 【问题描述】:

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

例如

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)”处收到此错误

# 错误:对象组 1 无效

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

知道如何使用完整路径执行此操作吗?例如"Group_Root|group_parent|group1"

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

名称对于 MEL 可能有点烦人。一般来说,最好不要相信名称就是您指定的名称。

这是一个如何*不做事的好例子:

group -n myGroup1 circle1 sphere1;

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

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

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

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

另一个需要关注的是命名空间功能(命名空间和命名空间信息),它可以用来为手头上唯一的***组定义一个新的命名空间。

希望有帮助

【讨论】:

【参考方案3】:

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

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 )

【讨论】:

以上是关于在 Maya 中使用 mel/python 创建一个简单的层次结构的主要内容,如果未能解决你的问题,请参考以下文章

使用 CSS 在元素后面创建一条线:before

在 Flutter 中动态创建一列行的好方法是啥

创建一个火猴组件

Sprite Kit:为所有场景只创建一次节点

如何在 testflight 上创建一组测试人员

如何使用自定义 tf.Estimator 在张量板事件文件中仅创建一份图形副本?