maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...

前言:

原本目的是想寻求一种方式来对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数据类型。

流程:

  1. 下载swig,解压到本地,路径添加到添加到环境变量中
  2. 创建一个空的vs工程

7b53977c68dda1f80fac0c241cef777b.png

3. 添加一个文件compute.h,我们所有的代码都放这个头文件里面

223554b437a47c54775bad48767467c7.png

4. 针对所有平台,设置一下vs工程,方便代码提示

输出格式

596ad312ada78b45c854fec063f82063.png

包含目录,库目录

571f434a3cf9e2395580d07afef3ad49.png

依赖库,只用基本的数据类型

1039c30a0e91dfc42e4113c0b14e77d0.png

输出文件(带下划线,下面有解释)

44ed9e81b2e1150c8b7a743cf7c653ff.png

随便写一个累加的测试函数

// compute.h#pragma once
#include <maya/MIntArray.h>int 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"

添加到工程,设置一下生成事件,每次编译之前先生成包裹函数

8645381bc4e39155dd3587bed14ba68d.png

接下来编译就可以了

391ab26868d1abbb468ecff215e4476a.png

maya中测试:

import sys
sys.path.append('F:/swig_maya_test/swig_maya_test')
import TestMayaApiimport maya.OpenMaya as om
iList=om.MIntArray()
for i in range(100):iList.append(i)print TestMayaApi.testMIntArray(iList)

2202efb0e3fd3b8b1a9f0cf5c133168e.png

优化:

swig会生成两个文件py和pyd的,py是模块名,pyd是_模块名,要不然导入python模块会失败,要把pyd模块名的修改成TestMayaApi,只修改工程设置里面的输出文件是不行的,导入会报错,需要修改源码,这样我们只需要pyd就可以了。

  1. 先将输出文件修改

09bee8fb7dc7acccf5bfb17b6cbfe70a.png

2. 禁用生成事件,改为手动运行cmd

8dc18dc46711de301dceb0e5cbf72816.png

3. 将swig生成的compute_wrap.cxx添加进来,搜索替换模块名

每次运行swig都要重新生成替换。

e6f01a4e07e30819f00f77c935b7451a.png

重新生成后我们就不需要.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
iList=om.MIntArray()
for i in range(100):iList.append(i)outList=om.MIntArray()
TestMayaApi.testMIntArrayMul(iList,2,outList)
print outList

f40d82e874c4b100e4e23936227a68b5.png

总结:

算是maya plugin和python api的之外的一种计算模块的方式,编译之后maya 2016以下版本可以共用一个pyd,其它版本可能要单独编译,没测试很全。好处就是用起来更舒服,不用转换数据,和python api无缝衔接,可以直接用MxxxArray,并且支持OpenMP多线程计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS2010中预处理器定义

vs2010下的预处理器定义就是使该预定义下的宏定义在每个文件中都包括&#xff0c;便于跨平台编码格式或者其他的一些设置&#xff0c;便于处理&#xff0c;值得注意的是工程移植的时候需要考虑预处理定义否则代码运行的环境可能不同&#xff0c;导致结果出错。 详解&#xff1a…

Slip.js – 在触摸屏上实现 Swipe 对列表重新排序

Slip.js 是一个很小的 JavaScript 库&#xff0c;用于实现对触摸屏的互动 Swipe 和对元素重新排序列表&#xff08;Reordering&#xff09;。Slip.js 没有任何的依赖&#xff0c;你可以通过自定义 DOM 事件实现重新排序交互。 您可能感兴趣的相关文章Pace.js – 页面加载进度自…

suse10 linux安装,SuSE10.2 安装手记

SuSE10.2 安装手记发布时间:2007-04-05 00:31:51来源:红联作者:Reference1. 添加安装源SuSE提供了多种安装源的管理&#xff0c;你可以通过Yast方便的添加和删除各种安装源。(1) 本地安装源&#xff1a;YaST -> Software -> Installation Source -> Add -> Local D…

构建和运行Java 8支持

尚未提供对Java 8的Eclipse支持。 如果要使用它&#xff0c;则必须构建它。 Eclipsepedia的JDT Core / Java8页面包含有关使用Eclipse Java开发工具 &#xff08;JDT&#xff09;中不断发展的Java 8支持源来设置开发环境的说明。 说明中缺少一些内容&#xff1b; 待会儿我会回圈…

django异常日志_【python小随笔】Django+错误日志(配置Django报错文件指定位置)...

1: 自定义日志文件.py----------几个文件需要创建日志&#xff0c;就需要重新定义几份#1定义一个日志文件 创建一个操作日志对象loggerfile_1 logging.FileHandler(text_1.log, a, encodingutf-8) # text_1.log 定义日志文件名fmt logging.Formatter(fmt"%(asctime)s - %…

Django之管理权限

什么是权限&#xff1a; 谁对什么资源能做什么操作。 管理权限的实现有很多&#xff0c;这里实现一个最简单的管理权限的实现方式&#xff1a;rbac &#xff08; role based access control &#xff09; 实现的一个基本思路&#xff1a; 一张user用户表&#xff0c;一张role…

狄克斯特拉 Dijkstra 算法 C#实现

今天在看《算法图解》&#xff0c;看了加权最小路径算法&#xff0c;决定用代码实现一下。 首先是画有向图&#xff0c;在网上找了一下&#xff0c;有不错的开源软件graphviz,该源代码托管在GitLab上。该软件是一个图形可视化软件。 画了一个有向图如下&#xff1a; 画图用的代…

So Easy! 让开发人员更轻松的工具和资源

这篇文章给大家分享让开发人员生活更轻松的免费工具和资源。所以&#xff0c;如果你正在寻找一些为迅速解决每天碰到的设计和开发问题的工具和资源&#xff0c;不要再观望&#xff0c;试试这些工具吧。这些奇妙的工具不仅会加快您的生产&#xff0c;也让你的工作质量提升。 您可…

Java 8:按集合分组

在继续阅读Venkat Subramaniam的“ Java函数式编程 ”时&#xff0c;我到达了介绍Stream&#xff03;collect函数的那部分。 我们想收集一个人&#xff0c;按年龄分组&#xff0c;并返回一张方便的&#xff08;年龄->人名&#xff09;地图。 要刷新&#xff0c;这是Person…

android linux截图库,Android中截图(surfaceView)源码

总结了一个方法&#xff0c;实现了在Android当前Activity的截图&#xff0c;本人测试确实通过了&#xff0c;不过有朋友说截出来的图是黑色的&#xff0c;不能看。我心想&#xff0c;这没有问题啊&#xff0c;相同的代码我就可以执行通过&#xff0c;并没有没有在意这个问题。可…

xmta温度控制仪说明书_XMT系列数显温度控制器使用说明书

测温元件名称分度号测温范围℃分辩率热电偶镍铬—铜镍E(EA—2)0 - 300、0 - 400、0 - 6001℃镍铬—镍硅K(EU—2)0-400、0-600、0-800、0-1300铂铑—铂S(LB—3)0 - 1600、700 - 1600热电阻铜电阻Cu50(G)-50-150、0-50、0-100、0-1500.1℃铂电阻Pt100(BA1、BA2)-199 - 199、0 - 1…

WARNING: 'aclocal-1.14' is missing on your system.

源码安装zabbix agent时进行到make install时报如下错误&#xff1a; WARNING: aclocal-1.14 is missing on your system.You should only need it if you modified acinclude.m4 orconfigure.ac or m4 files included by configure.ac.The aclocal program is part of the GNU…

23套新鲜出炉的网站和手机界面 PSD 素材

Web 用户界面&#xff0c;移动用户界面和线框套件对设计师很有用&#xff0c;因为这些套件让他们使用快速和有效的方式复制用户界面。这些类型的工具包提供了一个基本的用户界面元素&#xff0c;用于它们需要制作的网站或软件模型。 在这篇文章中&#xff0c;我们展示的是自由和…

arcgis栅格邻域统计_ArcGIS 从基础到实战书正式出版,易智瑞技术总裁沙志友沙总推荐并亲自写序...

《ArcGIS 从基础到实战》书正式出版&#xff0c;易智瑞技术总裁沙志友沙总推荐并亲自写序&#xff0c;京东地址 https://item.jd.com/10025512034581.html第一章 ArcGIS基础和入门 11.1 ArcGIS 10.7 Desktop的安装 11.1.1 安装环境 11.1.2 安装步骤 21.1.3 注意的问…

date简述

Date 定义时间和日期的类 java.util.Date 1s1000ms; 时间的原点&#xff1a;公元1970年1月1日 00点00分00秒&#xff1b; public class DateDemo {public static void main(String[] args) {fun();}private static void fun() {Date dnew Date(0);System.out.println(d)…

WebLogic Classloader分析工具

WebLogic Server具有一个名为Classloader Analysis Tool的内置Web应用程序&#xff0c;您可以通过http&#xff1a;// localhost&#xff1a;7001 / wls-cat访问它 您需要使用为/ console Webapp配置的同一用户登录。 使用CAT&#xff0c;您可以检查应用程序在服务器中加载了哪…

python3 计算rsa私钥 已知n e计算d

# 分解模数n def rsa_moder(n):base 2while base < n:if n % base 0:return base, n // basebase 1# 求欧拉函数f(n) def rsa_get_euler(prime1, prime2):return (prime1 - 1) * (prime2 - 1)# 求私钥 def rsa_get_key(e, euler):k 1while True:if (((euler * k) 1) % …

linux算法平台,Linux实时调度算法与测试平台的研究与实现

摘要&#xff1a;实时系统在过去几年里迅速成长,但能够提供实时功能的操作系统往往价格极为昂贵.由于Linux代码公开,且性能优异,使其成为实时操作系统领域里的新宠.然而Linux本身作为一个通用的分时操作系统,将它应用于实时环境有许多缺点和不足,所以要对现有的Linux进行实时化…

Maplace.js – 小巧实用的 jQuery 谷歌地图插件

Maplace.js是一个小的显示谷歌地图的 jQuery 插件&#xff0c;帮助你把谷歌地图嵌入到你的网站&#xff0c;快速在地图位置上创建标记和控制菜单。它需要 jQuery 和谷歌地图 API v3 支持&#xff0c;所以这两个都需要引入到你的页面。它支持标记和自定义图标、缩放级别和自定义…

vue.js根据数据循环生成表格_vue.js循环for(列表渲染)详解

vue.js循环for(列表渲染)详解一、总结一句话总结&#xff1a;v-for{{ item.message }}var example1 new Vue({el: #example-1,data: {items: [{ message: Foo },{ message: Bar }]}})1、vue.js中的循环结构(列表渲染:for)如何使用&#xff1f;v-for用于循环的数组里面的值可以…