Maya曲线提取工具
零、前言
在Maya中通过脚本实现提取曲线的功能。
一、需求
美术在做Maya中做头发时如果每条头发都自己手动做会非常耗时。
希望可以选中某条曲线,然后进行复制,从而实现复用,提高工作效率。
二、Maya工具简单认识
2.1 用户观察操作
Alt+鼠标左键 旋转视图
Alt+鼠标右键/鼠标滚轮 缩放
A键 还原起始状态
F键 Focus
空格键 四视图View
2.2 视图操作
选中物体:
W 位置改变
R 旋转
E 缩放
2.3 支持脚本
Maya中支持的脚本有:
- PyMEL
- MEL
三、工具实现
3.1 预期功能
用户选择若干线段(可以是连续、也可以是不连续的),点击工具,复制一份所有选择的曲线。
3.2 polyToCurve命令
Maya中有一个polyToCurve命令,可以提取曲线。
它的功能为:连续的曲线进行提取。
但是该命令存在问题:
现象1:
- 选中两圈曲线,使用polyToCurve进行提取,无法成功。
- 因为PolyToCurve的输入必须为连续的线。(而图中为2个曲线)
现象2:
- 选中竖直的一个圈,使用polyToCurve进行提取,无法成功。
- 因为对于实际相连但序号不连续的不会组合成为曲线,因而无法正确提取。
3.3 问题分析与方案
总结 3.2 中的问题:
- 一次polyToCurve命令的对象必须是一条曲线。
- Maya仅会将序号相连的线段组成曲线。(我的理解:Maya按照横向顺序排序)
经过对几种情况分别测试之后,设计了一个解决方案。
测试的情况分别为:
- 分离的几条边;
- 连续的边和分离的边;
- 序号连续但实际不相连的边;
- 序号不连续但实际相连的边;
设计的算法需要自己去对所有的边进行划分曲线:
- 读取所有选择的edge;
- for e in edge 进行分组;
- 分组算法采用图的遍历(DFS)。
- 分组完,每个组的边组合成为连续的曲线,进行提取;
- 对新生成的曲线组合遍历,选中全部;
3.4 工具代码大概逻辑
核心代码:
def SlectedpolyListToCurve(AllEdgesList):
edgeCurveList=[]
for list in AllEdgesList:
pm.select( clear=True )
for edge in list:
pm.select( edge,add=True )
#print pm.selected()[0]
edgeCurve = cmds.polyToCurve(ch=False, form=2, degree=3)
edgeCurveList.append(edgeCurve)
return edgeCurveList;
### main
SeletedEdges = pm.selected()
inputEdgeList = getUserSlectedEdges(SeletedEdges)
# 构造图
g = Graph(inputEdgeList)
# 获得连通分量列表
SplitedList = g.connectedComponents()
# 分别对连通分量进行转换(执行一次polyToCurve)
CurveList = SlectedpolyListToCurve(SplitedList)
# 再手动选中曲线
pm.select(clear=True)
for edge in CurveList:
pm.select( edge,add=True )
效果: