Maya Python API 2.0 - MSelectionList

从Maya2012开始我们迎来了新的Python API,对API不熟悉的朋友也许会问为什么要出个2.0的新API.其实1.0是通过SWIG来对大部分(基本是全部)C++ API来自动转换的,好处是我们能使用绝大部分的C++ API,而且制作速度快,但也有很多问题,首先API是为C++设计的,C++和Python的最大区别之一就是指针,API中使用指针的地方非常多,为了解决这个问题,Python API里多了一个专门处理指针的类(令Pythoner蛋疼的东西),而且很多类方法都是没有Python版本的,很多的Python特性也不支持,其实就感觉跟使用C++版本没太多的区别.
2.0就是他们重新给Maya设计的Python API,支持Python的特性,优化运行速度,更加Pythonic.

这里我要介绍的是MSelectionList,要能正常运行下面的Python代码,你需要Maya2012 HotFix 1以上版本,om代表1.0的版本模块,newom是2.0.
MSelectionList是存储在MAYA中被选中的物体集,其实不是当前选中的物体也行.

获取当前选中的五体物体
import maya.OpenMaya as om  # API 1.0
import maya.api.OpenMaya as newom # API 2.0

# API 1.0
selList = om.MSelectionList()
om.MGlobal.getActiveSelectionList(selList)

# API 2.0
mySel = newom.MGlobal.getActiveSelectionList()

MSelectionList selList;
MGlobal::getActiveSelectionList(selList);

你可以看到1.0的用法跟C++的基本一样,如果你只想通过API来打印所选择的物体名称
nodes = []
selList.getSelectionStrings(nodes)
nodes
# Result: [u'pCube1'] #

mySel.getSelectionStrings()
# Result: (u'pCube1',) #

获取节点
node = om.MObject()
selList.getDependNode(0, node)

myNode = mySel.getDependNode(0)

可以看到API 2.0更加Pythonic,其它的方法也都差不多一样的用法,具体请看文档.
的脚本 以下是一个基本的 Maya Python 脚本,用于自动分配软硬边: 1. 选择一个或多个网格 2. 运行脚本 3. 软边将根据角度分配给相邻面 4. 硬边将分配给不相邻的面 ``` import maya.api.OpenMaya as om def set_edge_hardness(mesh): sel = om.MSelectionList() sel.add(mesh) dag = sel.getDagPath(0) edge_iter = om.MItMeshEdge(dag) soft_edges = [] hard_edges = [] while not edge_iter.isDone(): curr_edge = edge_iter.current() # 获取当前边的相邻面 faces = edge_iter.getConnectedFaces() # 计算当前边的角度 angle = om.MVector() om.MScriptUtil.createVector(angle, 0, 0, 0) if len(faces) == 2: normal1 = om.MVector() normal2 = om.MVector() om.MScriptUtil.createVector(normal1, 0, 0, 0) om.MScriptUtil.createVector(normal2, 0, 0, 0) om.MFnMesh(dag).getFaceNormal(faces[0], normal1) om.MFnMesh(dag).getFaceNormal(faces[1], normal2) angle = normal1.angle(normal2) # 将软边和硬边添加到相应列表中 if angle > om.MAngle(30, om.MAngle.kDegrees): soft_edges.append(curr_edge) else: hard_edges.append(curr_edge) edge_iter.next() # 将所有软边设置为软边 for edge in soft_edges: om.MFnMesh(dag).setEdgeSmoothing(edge, False) # 分配硬边 for edge in hard_edges: om.MFnMesh(dag).setEdgeSmoothing(edge, True) # 获取当前选择的网格 sel = om.MGlobal.getActiveSelectionList() for i in range(sel.length()): dag = sel.getDagPath(i) if dag.node().hasFn(om.MFn.kMesh): set_edge_hardness(dag) ``` 注意:此脚本仅适用于 Maya API 2.0,需要在 Maya 2016 或更高版本中运行。如果您使用的是旧版本的 Maya,请改用 Maya Python API 1.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值