如何存储然后检索 parent-child 依赖数据(Maya MEL/Python 脚本)
How to store and then retreive parent-child dependency data (Maya MEL/Python script)
我有一个我需要的层次结构:
- 分手
- doSomething()
- 把它放回原来的样子。
我知道如何确定地破坏事物,并且已经计划了当它们在层次结构中扁平化时我需要做什么。问题是我如何 parent 他们回来?
详情
这与我之前的问题有关:
Freeze scale transform on a parent object with animated child (MAYA MEL/Python script)
我需要冻结层次结构中所有节点上的缩放变换。问题是节点上有转换动画,如果我尝试在 parent 节点上冻结比例,它的 child 动画会变得很奇怪。
但是看起来有一个解决方案,但我需要帮助来实施它。
我想:
- 每组object
- Parent各组到世界
- 为世界烘焙动画space(摆脱组节点)
- 冻结缩放变换
- 重新 Parent 他们回来
当我手动操作时它有效,所以一切都应该没问题。但是如果你认为有更好的方法来实现我的主要目标,请告诉我。
所以,我一直在考虑将所有节点写入一个字符串并从那里调用它们,但我不知道如何处理分支。
例如:
如果它是一个无分支的层次结构(一个 parent 和一个 child 一直)我可以通过两个调用它们,并且 parent 很容易。
但是分支使字符串中的名称像 "parent, child, child, child, parent..."
可能是我想多了,方向错了。有什么想法吗?
如果您还没有使用 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)
这基本上应该从您的顶级节点开始,然后递归地沿着层次结构向下移动,以创建一个几乎类似于嵌套字典的数据结构...每个键都是一个父节点,其键值是一个存储列表的元组儿童和儿童数据的字典。每个子字典都遵循相同的格式——子字典是一个键,它的子数据在元组中,等等,等等,直到层次结构的末尾。我正在使用带有列表和字典的元组,因为字典是无序的......列表基本上会确保你按照它们来自的相同顺序重新父级,但如果你真的不这样做,你可以只存储字典关心保留顺序...
为了让一切恢复原样,您需要这样做:
def reparent(tree):
for parent, data in tree.iteritems():
children, child_tree = data
mc.parent(children, parent)
reparent(child_tree)
reparent(hierarchy_tree)
现在...我还没有测试过这段代码 - 有点像在没有将它带入 Maya 的情况下即时编写的。我更关心重新父函数中弹出的错误,所以你可能需要一个 try/except 在那里,但希望它会跳过任何空的 dict 项目并让你接近你需要的东西in-parenting/re-parenting。这也假设您的所有节点都具有唯一的短名称...
哦,关于递归函数的注意事项...确保它们会在某个时刻终止,否则您可能会陷入无限循环(这应该没问题,因为我们正在跟踪具有确定的层次结构结束 - 即:不再有子节点)
我有一个我需要的层次结构:
- 分手
- doSomething()
- 把它放回原来的样子。
我知道如何确定地破坏事物,并且已经计划了当它们在层次结构中扁平化时我需要做什么。问题是我如何 parent 他们回来?
详情
这与我之前的问题有关:
Freeze scale transform on a parent object with animated child (MAYA MEL/Python script)
我需要冻结层次结构中所有节点上的缩放变换。问题是节点上有转换动画,如果我尝试在 parent 节点上冻结比例,它的 child 动画会变得很奇怪。 但是看起来有一个解决方案,但我需要帮助来实施它。 我想:
- 每组object
- Parent各组到世界
- 为世界烘焙动画space(摆脱组节点)
- 冻结缩放变换
- 重新 Parent 他们回来
当我手动操作时它有效,所以一切都应该没问题。但是如果你认为有更好的方法来实现我的主要目标,请告诉我。
所以,我一直在考虑将所有节点写入一个字符串并从那里调用它们,但我不知道如何处理分支。 例如: 如果它是一个无分支的层次结构(一个 parent 和一个 child 一直)我可以通过两个调用它们,并且 parent 很容易。 但是分支使字符串中的名称像 "parent, child, child, child, parent..."
可能是我想多了,方向错了。有什么想法吗?
如果您还没有使用 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)
这基本上应该从您的顶级节点开始,然后递归地沿着层次结构向下移动,以创建一个几乎类似于嵌套字典的数据结构...每个键都是一个父节点,其键值是一个存储列表的元组儿童和儿童数据的字典。每个子字典都遵循相同的格式——子字典是一个键,它的子数据在元组中,等等,等等,直到层次结构的末尾。我正在使用带有列表和字典的元组,因为字典是无序的......列表基本上会确保你按照它们来自的相同顺序重新父级,但如果你真的不这样做,你可以只存储字典关心保留顺序...
为了让一切恢复原样,您需要这样做:
def reparent(tree):
for parent, data in tree.iteritems():
children, child_tree = data
mc.parent(children, parent)
reparent(child_tree)
reparent(hierarchy_tree)
现在...我还没有测试过这段代码 - 有点像在没有将它带入 Maya 的情况下即时编写的。我更关心重新父函数中弹出的错误,所以你可能需要一个 try/except 在那里,但希望它会跳过任何空的 dict 项目并让你接近你需要的东西in-parenting/re-parenting。这也假设您的所有节点都具有唯一的短名称...
哦,关于递归函数的注意事项...确保它们会在某个时刻终止,否则您可能会陷入无限循环(这应该没问题,因为我们正在跟踪具有确定的层次结构结束 - 即:不再有子节点)