Maya曲线提取工具

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 中的问题:

  1. 一次polyToCurve命令的对象必须是一条曲线。
  2. Maya仅会将序号相连的线段组成曲线。(我的理解:Maya按照横向顺序排序)

经过对几种情况分别测试之后,设计了一个解决方案。

测试的情况分别为:

  • 分离的几条边;
  • 连续的边和分离的边;
  • 序号连续但实际不相连的边;
  • 序号不连续但实际相连的边;

设计的算法需要自己去对所有的边进行划分曲线:

  1. 读取所有选择的edge;
  2. for e in edge 进行分组;
    • 分组算法采用图的遍历(DFS)。
  3. 分组完,每个组的边组合成为连续的曲线,进行提取;
  4. 对新生成的曲线组合遍历,选中全部;

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 )

效果:

参考文献

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值