通过形状节点到变换节点的反向查询,精准筛选模型,再用 cmds.parent()实现场景自动化整理。
重点:
使用parent()创建父子关系
cmds.parent(
child_nodes, # 移动谁
target_parent, # 移动到谁下面
absolute=True, # 移动后保持世界坐标位置(T=保持/F=继承父坐标)
relative=True # 与absolute相反
# 如果myGroup不存在,创建组
if not cmds.objExists("myGroup"):
cmds.group(
empty=True,
name="myGroup"
1.cmds.objExists("myGroup"):检查场景中是否存在名为 myGroup 的节点,避免重复导致报错。
2.cmds.group(empty=True, name="myGroup"):创建一个空组,empty=True 表示不包含任何子物体,仅创建组节点。
目的:创建目标父组,为后续做准备。
# 获取所有mesh形态节点
objShape = cmds.ls(type="mesh",long=True)
# 获取所有mesh变换节点
traList = []
for shapeNode in objShape:
traNodeList = cmds.listRelatives(
shapeNode,
parent=True,
fullPath=True
)
traList.append(traNodeList[0])
print("场景中的mesh变换节点:")
pprint(traList,width=60,compact=True)
cmds.ls(type="mesh", long=True):获取场景中所有mesh类型的形状节点。long=True保证完整路径,避免重名。cmds.listRelatives(shapeNode, parent=True, fullPath=True):通过形状节点,反向查询其父变换节点。traList.append(traNodeList[0]):将变换节点存入列表,[0]是因为一个形状节点必然对应唯一变换节点,取第一个元素就可以了。
目的:精准筛选出场景中所有模型的变换节点,作为打组的目标对象。
# 打组
cmds.parent(
traList,
"myGroup",
absolute=True,
)
1.cmds.parent(traList, "myGroup", absolute=True):将所有模型变换节点,父化到 myGroup 组下,实现打组。
2.absolute=True:打组后保持所有模型的世界坐标位置完全不变,不会因为打组导致模型位置偏移,是打组的关键安全参数。
目的:一键将场景中所有模型,批量打组到 myGroup 下,完成层级整理。
children = cmds.listRelatives(
"myGroup",
children=True
)
print("myGroup的子节点:")
pprint(children,width=50,compact=True)
cmds.listRelatives("myGroup", children=True):查询 myGroup 组的所有直接子节点。
检验打组是否成功