网站制作商家入驻,系统花钱做任务的小说魅网站,陕西公路工程建设有限公司网站,旅游网站制作文献前言#xff1a;原本目的是想寻求一种方式来对cpu计算密集型代码部分进行加速替代#xff0c;但是maya中mll插件的插件套路在传递参数上会占用大量的io#xff0c;对于数据比较大的部分也会有相当消耗。如果全部写在c部分又感觉缺乏灵活性#xff0c;所以琢磨的一种可以在p…前言 原本目的是想寻求一种方式来对cpu计算密集型代码部分进行加速替代但是maya中mll插件的插件套路在传递参数上会占用大量的io对于数据比较大的部分也会有相当消耗。如果全部写在c部分又感觉缺乏灵活性所以琢磨的一种可以在python中实现逻辑pyd中实现算法的方式。问题 纯python api来编译pyd的计算模块会有大量的数据转换比如获取模型所有的顶点会得到MFloatPointArray获取所有SkinMesh的蒙皮权重会得到MDoubleArray这些数据直接获取都很快但是要把他们转换成python api所支持的数据格式就很麻烦计算完成后还要转换回来一旦模型面熟很高很耗费时间。作为一个懒人不能忍~思路 maya api 1.0使用swig做封装借助swig解封PyObject指针的功能自动将python指针对象转换成maya内置的M数据类型。流程下载swig解压到本地路径添加到添加到环境变量中创建一个空的vs工程3. 添加一个文件compute.h我们所有的代码都放这个头文件里面4. 针对所有平台设置一下vs工程方便代码提示 输出格式 包含目录库目录 依赖库只用基本的数据类型 输出文件带下划线下面有解释随便写一个累加的测试函数// compute.h#pragma once
#include maya/MIntArray.hint testMIntArray(MIntArray input)
{int sum 0;for (int i 0; i input.length(); i){sum input[i];}return sum;
}
编写swig的compute.i%module TestMayaApi%{
#include compute.h
%}%include compute.h
添加到工程设置一下生成事件每次编译之前先生成包裹函数接下来编译就可以了maya中测试import sys
sys.path.append(F:/swig_maya_test/swig_maya_test)
import TestMayaApiimport maya.OpenMaya as om
iListom.MIntArray()
for i in range(100):iList.append(i)print TestMayaApi.testMIntArray(iList)优化:swig会生成两个文件py和pyd的py是模块名pyd是_模块名要不然导入python模块会失败要把pyd模块名的修改成TestMayaApi只修改工程设置里面的输出文件是不行的导入会报错需要修改源码这样我们只需要pyd就可以了。先将输出文件修改2. 禁用生成事件改为手动运行cmd3. 将swig生成的compute_wrap.cxx添加进来搜索替换模块名每次运行swig都要重新生成替换。重新生成后我们就不需要.py文件了直接删掉只保留TestMayaApi.pyd返回值的坑c函数不能直接返回maya内置类型如果函数定义成这样python中接受到的返回值是swig object指针传递给其它python api时会出错MIntArray testMIntArray(MIntArray input)
解决办法将参数传递改成引用类型这样就可以直接修改数据不用返回和api 1.0大多数做法一致void testMIntArrayMul(MIntArray input,int mul, MIntArray output)
{output.setLength(input.length());for (int i 0; i input.length(); i){output[i] input[i] * mul;}
}
maya测试代码import sys
sys.path.append(F:/swig_maya_test/swig_maya_test)
import TestMayaApiimport maya.OpenMaya as om
iListom.MIntArray()
for i in range(100):iList.append(i)outListom.MIntArray()
TestMayaApi.testMIntArrayMul(iList,2,outList)
print outList总结:算是maya plugin和python api的之外的一种计算模块的方式编译之后maya 2016以下版本可以共用一个pyd其它版本可能要单独编译没测试很全。好处就是用起来更舒服不用转换数据和python api无缝衔接可以直接用MxxxArray并且支持OpenMP多线程计算。