最近修改一个maya中的jlCollisionDeformer工具,该工具有一个明显不足,变形后顶点分布太乱,无法满足生产需求。于是考虑对该变形后的顶点进行平滑处理。既然要做平滑处理就要获取当前点及与该点保持连接关系的点的坐标,再以此为基础代入平滑算法。
我的基本思路是利用maya.OpenMaya模块中现有的api来获得一个基于当前模型的顶点迭代器(MItMeshVertex)。然后利用迭代器内置方法来逐顶点的进行平滑。
第一次使用OpenMaya模块还是很不熟练,看了好几天的技术文档。废话不多说,直接上代码:
1 ##############create a new MObject!##################### 2 vertexcount = self.newpoints.length() 3 inMeshFn.getVertices(mesh_counts,mesh_connect) 4 polycount = inMeshFn.numPolygons() 5 6 tempMeshData = OpenMaya.MFnMeshData() 7 tempObject = OpenMaya.MObject() 8 tempObject = tempMeshData.create() 9 newObject = OpenMaya.MObject() 10 11 MeshFs = OpenMaya.MFnMesh() 12 #create a DAG path 13 14 newObject = MeshFs.create(vertexcount,polycount,inPoints,mesh_counts,mesh_connect,tempObject) 15 16 Inmesh_vertex_iter = OpenMaya.MItMeshVertex(newObject)
第二行或者当前模型的顶点数量。
第三行获取了当前模型的顶点分布信息。
第四行获取了当前模型的多边形面数。
第六行为tempMeshData对象分配内存地址,该对象为MFnMeshData类型。
第七行为tempObject对象分配内存空间,该对象为MObject类型。
第八行利用tempMeshData对象的create()方法创建一个内存空间,并赋值给tempObject对象。这样tempObject对象就有了内存空间去存储对应信息了。
第九行为newObject对象分配内存地址,该对象为OpenMaya.MObject()。用于存储返回值。
第十一行为MeshFs对象分配内存地址,该对象为MFnMesh类型。
第十四行利用MFnMesh类的create方法创建一个新的MObject对象,返回给tempObject及newObject对象。
第十六行以newObject对象为参数,初始化MItMeshVertex对象,生成一个顶点迭代器,并返回给Inmesh_vertex_iter对象。
不得不说maya中构建顶点迭代器的方法很麻烦,但这样的方式可以保证程序的安全稳定高效,充分利用了内存的特质。本人目前看的OpenMaya技术文档还仅限几个类,该文如有不足还请指正。
有了这个迭代器我们就可以非常快速高效的植入平滑算法了,你可以通过这种方法多次迭代产生平滑度更高的pointsArray信息。
以上。