如何存储然后检索父子依赖数据(Maya MEL / Python脚本)

时间:2017-08-18 19:49:06

标签: python parent-child hierarchy maya mel

我需要一个层次结构:

  1. 分手
  2. doSomething的()
  3. 以与以前相同的方式将它重新组合在一起。
  4. 我知道如何打破这些事情,并且计划当他们在等级中保持平衡时我需要做什么。问题是如何让他们回来?

    详细

    这与我之前提出的问题有关:

    Freeze scale transform on a parent object with animated child (MAYA MEL/Python script)

    我需要在层次结构中的所有节点上冻结缩放变换。问题是节点在它们上面有翻译动画,如果我试图在父节点上冻结缩放,它的子动画会变得奇怪。 然而,看起来有一个解决方案,但我需要帮助实现它。 我想:

    1. 对每个对象进行分组
    2. 将每个小组分配给全世界
    3. 将动画烘焙到世界空间(摆脱群组节点)
    4. 冻结比例转换
    5. 让他们回来
    6. 当我手动操作时它会起作用,所以一切都应该没问题。但如果您认为有更好的方法来实现我的主要目标,请告诉我。

      所以,我一直在考虑将所有节点写入字符串并从那里调用它们,但我不知道如何处理分支。 例如: 如果它是一个无分支的层次结构(一个父母和一个孩子一直),我可以用两个叫它们,父母很容易。 但是分支在字符串中的名称就像"父母,孩子,孩子,孩子,父母......"

      可能我想的太多,方向错误。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

如果您还没有使用python,我建议您使用python - 您可以使用几乎任何数据类型,以便在单个数据结构中获得所需的内容。这将比创建一个长字符串更容易,并在以后重新打开它。

收集层次结构数据:

import maya.cmds as mc

def hierarchyTree(parent, tree):
    children = mc.listRelatives(parent, c=True, type='transform')
    if children:
        tree[parent] = (children, {})
        for child in children:
            hierarchyTree(child, tree[parent][1])

top_node = 'name_of_node'  # could also use mc.ls(sl=True)[0] if you want...
hierarchy_tree = {}
hierarchyTree(top_node, hierarchy_tree)

这应该基本上从你的顶级节点开始,递归地沿着层次结构创建一个几乎就像嵌套dicts的数据结构......每个键都是一个父节点,它的键值是一个存储子列表的元组和儿童数据的字典。每个子dict遵循相同的格式 - 子元素是元组中的子元素数据等等的密钥,等级到层次结尾。我正在使用带有列表和字典的元组,因为dicts是无序的......列表基本上会确保你按照它们来自的相同顺序重新使用它们,但如果你不真的那么你可以存储dict关心保留订单......

为了让它回归,你会做这样的事情:

def reparent(tree):
    for parent, data in tree.iteritems():
        children, child_tree = data
        mc.parent(children, parent)
        reparent(child_tree)

reparent(hierarchy_tree)

现在......我还没有测试过这段代码 - 有点把它写在飞行中而没有把它带入Maya。我更关心在重新父功能中弹出的错误,所以你可能需要尝试/除了那里,但希望它只是跳过任何空的dict项目并让你接近你需要的内容 - 育儿/重新养育。这也假设您的所有节点都有唯一的短名称......

哦,关于递归函数的注释......确保它们会在某个时刻终止,否则你可能陷入无限循环(这应该没问题,因为我们正在追踪一个有明确结束的层次结构 - 即:没有更多的子节点)