求助:编写MEL脚本实现Maya多条曲线合并的方案
解决MEL脚本合并多条曲线的问题
先上完整可运行的脚本:
// 获取选中对象,保留完整路径避免重名冲突 string $selected[] = `ls -selection -long`; string $curveTransforms[] = {}; // 遍历选中对象,筛选出所有包含曲线的transform节点 for ($item in $selected) { string $nodeType = `nodeType $item`; // 处理选中的曲线shape节点 if ($nodeType == "nurbsCurve") { string $parent[] = `listRelatives -parent $item`; if (size($parent) > 0 && !stringArrayContains($parent[0], $curveTransforms)) { appendStringArray($curveTransforms, $parent); } } // 处理选中的transform节点,检查是否包含曲线shape else if ($nodeType == "transform") { string $shapes[] = `listRelatives -shapes -type "nurbsCurve" $item`; if (size($shapes) > 0 && !stringArrayContains($item, $curveTransforms)) { appendStringArray($curveTransforms, $item); } } } // 校验选中数量 if (size($curveTransforms) < 2) { error "请至少选中两条不同的曲线对象!"; } // 目标父节点:首个有效曲线transform string $targetParent = $curveTransforms[0]; // 合并曲线并清理空节点 for ($i = 1; $i < size($curveTransforms); $i++) { string $sourceTransform = $curveTransforms[$i]; string $sourceShapes[] = `listRelatives -shapes -type "nurbsCurve" $sourceTransform`; // 逐个将shape节点以shape-parent方式移到目标父节点,保持世界位置不变 for ($shape in $sourceShapes) { parent -s -r $shape $targetParent; } // 删除空transform节点 delete $sourceTransform; } print ("已成功将" + (size($curveTransforms)-1) + "条曲线合并到" + $targetParent + "下!\n");
关键问题拆解
1. 区分transform与shape节点
- 用
nodeType $item直接判断节点类型:- 若为
nurbsCurve,通过listRelatives -parent获取其所属的transform节点 - 若为
transform,用listRelatives -shapes -type "nurbsCurve"验证是否包含曲线shape,排除非曲线的空transform
- 若为
- 用
stringArrayContains避免重复添加同一transform(比如同时选中了shape和它的父节点)
2. 正确使用parent -s命令
- 必须加
-s参数:实现shape级别的父子关系,让曲线shape直接成为目标transform的子节点,而非把整个transform嵌套进去 - 配合
-r参数:保持曲线在世界空间的位置不变,避免合并后曲线错位
3. 删除空transform节点
- 移走所有shape节点后,原transform已无有效子节点,直接用
delete命令清理即可
内容的提问来源于stack exchange,提问作者Ralf_Reddings
相关产品推荐
相关产品推荐

