论坛's Archiver

nsxz 发表于 2008-3-4 23:47

Maya MEL & C++ plugin 作者hmaya

表达式(Expression)、脚本(MEL Script)、插件(Plug-in)<br/>
MAYA中的表达式(Expression)、脚本(MEL Script)、插件(Plug-in)三者究竟有着怎样的关系呢?下面笔者简要的概述一下。<br/>
MAYA Expression(表达式),是执行Window | Animation Editors | Expression Editor,在表达式编辑器中输入相应的表达式语句,从而控制物体的运动、旋转、可见性、材质等属性,如图。<br/>
        <br/>
        <br/>
MAYA Expression有如下特点:<br/>
1.含有全局变量:time、frame<br/>
2.语法规则与MEL一致<br/>
3.一般表达式是全局有效,在任意时刻都起作用,除非对time添加条件判断<br/>
4.解释执行,速度不快,尤其物体很多的情况下。<br/>
5.物体的名称与表达式关系密切,修改物体名称后,表达式会失效。<br/>
        <br/>
        <br/>
MEL Script(脚本),是在Script Editor(脚本编辑器)中输入一段MEL代码,执行,从而控制物体的造型、动画、材质等属性,如图。<br/>
        <br/>
        <br/>
MEL Script有如下特点:<br/>
1.解释执行,速度不快<br/>
2.依赖于MAYA提供的MEL命令集<br/>
3.可以使用proc定义函数,封装一个或多个MEL命令,实现特定的功能<br/>
4. ``可以返回一条语句的执行结果<br/>
5.类C语言,支持过程,不支持面向对象,对海量代码支持的不好,1000行以下?<br/>
        <br/>
        <br/>
MAYA C++ Plug-in(MAYA插件),是基于VC.net和MAYA API,编译后得到的.mll文件,如图,即C++插件。.mll文件类似Windows的.dll文件(动态链接库)。<br/>
        <br/>
        <br/>
MAYA C++ Plug-in有如下特点<br/>
1.C++插件是编译过的二进制文件,无需解释执行,速度快<br/>
2. 可嵌入MEL命令<br/>
3.MEL完全开源,而C++插件是二进制的,可以保护产权<br/>
4 .net环境下,具备开发大型插件的能力,例如上万行的代码的维护。<br/>
5.可以面向对象编程<br/>
安装Maya Plug-in Wizard<br/>
在Win32操作系统下,如果要为MAYA7.0/8.0开发插件(Plug-in),必须安装Microsoft Visual Studio .NET 2003。如果大家习惯于VC++6.0,则可以尝试为MAYA4.0开发插件。<br/>
找到MAYA的安装目录,在devkit文件夹下找到pluginwizard文件夹,然后找到它内部的MayaPluginWizard2.0.zip文件。该文件的路径一般是: <br/>
C:\Program Files\Alias\Maya8.0\devkit\pluginwizard<br/>
        <br/>
Maya Plug-in Wizard的安装步骤如下:<br/>
①        将MayaPluginWizard2.0.zip文件解压缩,如图,得到如下文件。<br/>
        <br/>
        <br/>
②. 将下面的文件<br/>
MayaPlugInWizard.vsdir<br/>
        MayaPlugInWizard.vsz<br/>
        MayaPlugInWizard.ico<br/>
拷贝到如下路径:<br/>
"C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\vcprojects"<br/>
        <br/>
③. 然后将文件夹<br/>
MayaPlugInWizard<br/>
拷贝到如下路径<br/>
"C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\VCWizards"<br/>
        <br/>
        这样我们就成功安装了Maya Plug-in Wizard。<br/>
今后当我们启动Visual Studio .NET 2003,创建Visual C++项目时,就可以看到新增了一个MayaPlugInWizard图标,选择它,即可创建MAYA插件,如图。<br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
在C++ API中嵌入MEL命令<br/>
        MAYA的C++ API与MEL之间互为补充。我们可以在C++插件中嵌入MEL命令。MAYA的C++
API提供了MGlobal::executeCommand()接口,并有许多重载的版本,使用这个接口,我们可以轻松的将MEL命令嵌入插件中。<br/>
首先我们需要把MEL命令变成MString,再把这个MString填入MGlobal::executeCommand()中即可。下面是两个例子:<br/>
例1:<br/>
//假设场景中存在名为obj的物体<br/>
//duplicate -rr -n theTempObj obj<br/>
//上面的MEL语句是复制obj,并将复制得到的物体命名为theTempObj<br/>
        <br/>
//定义MString型变量 duplicateCommand<br/>
//并将duplicateCommand初始化为MEL命令<br/>
MString duplicateCommand("duplicate -rr -n theTempObj obj");<br/>
        <br/>
//执行MEL命令<br/>
MGlobal::executeCommand(duplicateCommand);<br/>
        <br/>
例2:<br/>
//float $pos[] =`xform –t –q –ws …`;<br/>
//上面MEL语句的作用是将查询到的物体的世界坐标存储到名为$pos的浮点数组中<br/>
//下面的C++ API实现了和上面的MEL语句几乎一样的功能。<br/>
        <br/>
//定义MString型变量bbCommand<br/>
MString bbCommand;<br/>
        <br/>
//将MEL语句赋予bbCommand<br/>
bbCommand = MString("xform -q -bb -ws ") + theDagPath.fullPathName(); <br/>
        <br/>
//定义MDoubleArray型变量bbPos,<br/>
//相当于double型的数组,类似于MEL中的float $pos[]<br/>
MDoubleArray bbPos;<br/>
        <br/>
//执行MEL命令,并将结果返回到bbPos中<br/>
MGlobal::executeCommand(bbCommand,bbPos);<br/>
        <br/>
//下面调用MDoubleArray类的成员函数get()<br/>
//将bbPos中的数据存储到普通的double型数组中<br/>
double p[]; //定义double型数组<br/>
bbPos.get(p);// 将bbPos中的数据存储到数组p中<br/>
        <br/>
//调用MDoubleArray类的成员函数length (),获取数组中元素的个数<br/>
int count = bbPos.length();<br/>
值得注意的是:如果把大段大段的MEL脚本嵌入到C++中,编译执行,会出现什么结果?<br/>
这样虽然可以,但笔者不建议这么做!在C++插件中,请尽可能的使用C++ API!<br/>
因为C++中嵌入的MEL命令执行速度比直接在MAYA中运行MEL脚本要慢得多!<br/>
笔者曾经做过一个测试,执行同样的功能,分别用MEL 和C++ API实现,运行时间如下:<br/>
MEL  100~125秒<br/>
C++ API         10~14秒<br/>
最后笔者完全不使用C++ API,只是把MEL原封不动的嵌入C++,运行时间如下:                        C++嵌套MEL  6分钟 +<br/>
可以看到C++嵌套MEL的运行速度,相比直接使用MEL,慢了不是一点半点。所以建议大家在C++插件中,尽可能的使用C++ API!<br/>
        当然,使用C++ API可以获得更快的执行时间,但相比MEL来说,C++ API很不直接,因为MAYA的核心被隐藏,不允许改动,也就意味着使用C++ API远比MEL要繁琐。<br/>
下面的例子,实现了同样的功能,都是设置时间线的当前时间,但MEL相当简洁和直观,C++ API则很麻烦。<br/>
        <br/>
//功能:设置当前时间到第10帧<br/>
C++ API        <br/>
double currentTime = 10;<br/>
MTime tm(currentTime, MTime::kFilm);<br/>
MAnimControl anim;<br/>
anim.setCurrentTime(tm);<br/>
        <br/>
MEL        <br/>
currentTime 10;<br/>
        <br/>
                                               <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
Maya插件初步<br/>
        这里笔者给出一个创建简单的MAYA C++插件的流程。<br/>
        笔者给出MEL和C++插件两个版本,实现了同样的功能。<br/>
这个插件的背景是这样的,大多人听说MAYA8.5问世之后,都是欣喜万分,终于可以感受新版本的MAYA了。唯独方老板听到这个消息后,一筹莫展,并怨恨交加。下面的MEL和C++插件都是实现这样的一个想法。<br/>
MEL版:<br/>
float $maya_version = 8.5;<br/>
string $boss = "bossFang";<br/>
string $person = "bossFang";<br/>
if($maya_version == 8.5 &amp;&amp; $person != $boss){<br/>
print ("happy : ) Enjoy maya 8.5 \n");<br/>
}<br/>
        <br/>
if($maya_version == 8.5 &amp;&amp; $person == $boss){<br/>
print (" : ( Fuck! Fuck! sign,why now? \n");<br/>
}<br/>
        <br/>
输入脚本编辑器并执行,结果如图。<br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
C++ plug-in for maya7.0 版:<br/>
在.NET中执行文件 | 新建 | 项目,如图。<br/>
        <br/>
        <br/>
        在Visual C++项目中选择MayaPlugInWizard,如图,然后选择文件路径并给定名称,这里笔者使用boss为名。<br/>
        <br/>
        <br/>
单击确定后,Maya Plug-in Wizard会自动进入Plug-in setup(插件设置)窗口,如图,选择Maya7.0,即可为Maya7.0创建插件,下面还要选择MAYA的安装路径,并填写作者名称。<br/>
        <br/>
        <br/>
        单击左侧的Plug-in Type(插件类型),选择MEL Command,即可创建MEL命令型插件,输入插件名,这里笔者设为boss,将来在命令行输入boss,即可执行该插件了。<br/>
        <br/>
        <br/>
        最后,单击左侧的Included Libraries(包含的库),可以设定该插件包含哪些库文件。对于我们要创建的简单插件来说,默认的库就够了,单击Finish(完成)。<br/>
        <br/>
        <br/>
这样,在Maya Plug-in Wizard的指导下,我们成功创建了所需的cpp文件,如图,在doIt函数中插入代码即可。<br/>
        <br/>
        <br/>
如图,在文件顶部包含所需的maya头文件<br/>
#include &lt;maya/MGlobal.h&gt;<br/>
#include &lt;maya/MString.h&gt;<br/>
并在doIt中加入自定义的代码。<br/>
        <br/>
        <br/>
        <br/>
最后,在.NET中执行生成 | 生成解决方案,即可得到.mll文件了,如图。关于插件的加载和使用,将在下面一招加载和使用插件里介绍。<br/>
        <br/>
        <br/>
下面是该插件所有的代码:<br/>
        <br/>
// Copyright (C) lizhihao<br/>
// File: bossCmd.cpp<br/>
// MEL Command: boss<br/>
// Author: Maya Plug-in Wizard 2.0<br/>
// <br/>
#include &lt;maya/MSimple.h&gt;<br/>
#include &lt;maya/MGlobal.h&gt;<br/>
#include &lt;maya/MString.h&gt;<br/>
        <br/>
DeclareSimpleCommand( boss, "lizhihao", "7.0");<br/>
        <br/>
MStatus boss::doIt( const MArgList&amp; args )<br/>
             <br/>
{<br/>
        MStatus stat = MS::kSuccess;<br/>
        <br/>
        <br/>
        MString info;<br/>
        <br/>
                MString  boss("BossFang");<br/>
                MString  person("BossFang");<br/>
                double maya_version = 8.5;<br/>
                if(maya_version == 8.5 &amp;&amp; person == boss){<br/>
                       info = MString(": ( Fuck! Fuck! sign,why now? \n");<br/>
                  }<br/>
        <br/>
                if(maya_version == 8.5 &amp;&amp; person != boss){<br/>
                       info = MString("happy : ) Enjoy maya 8.5  \n");<br/>
                  }<br/>
        <br/>
    //显示字符串,相当于MEL中的print <br/>
MGlobal::displayInfo(info);<br/>
        <br/>
        <br/>
        setResult( "boss command executed!\n" );<br/>
        <br/>
        return stat;<br/>
}<br/>
        <br/>
加载和使用插件<br/>
        在前面我们已经创建了插件,生成了boss.mll文件。下面介绍MEL命令型插件的加载和使用方法。<br/>
执行Window | Settings/Preferences | Plug-in Manager,如图,打开插件管理器。<br/>
        <br/>
        <br/>
        在插件管理器(Plug-in Manager)中单击Browse(浏览),如图,找到前面我们编译好的boss.mll文件,加载。<br/>
        <br/>
        <br/>
        加载boss.mll插件后的插件管理器,如图。<br/>
        <br/>
        <br/>
        此时我们就可以在命令行输入boss并执行,运行该插件了。运行结果如图。大家可以和前面MEL代码运行的结果对比一下。
[align=right][color=#000066][此贴子已经被作者于2008-3-4 23:50:15编辑过][/color][/align]

蜡笔 发表于 2008-3-13 14:30

谢谢提供

airborne 发表于 2008-4-2 18:07

好詳細,多謝分享:handshake

hmaya 发表于 2008-5-2 00:02

:lol 哪里转来的?
呵呵,带有图片的版本在
[url]www.cg-discovery.com[/url]

3974771 发表于 2008-5-28 01:37

纯支持
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶  
顶顶顶顶顶顶 顶顶顶顶顶顶顶顶顶顶 顶顶顶  顶顶顶顶顶  
顶顶顶顶顶顶    顶顶顶顶顶顶顶 顶顶顶顶 顶顶顶顶顶  
顶顶顶顶顶   顶顶顶顶顶顶顶顶顶 顶顶顶顶  顶顶顶顶  
顶顶顶顶  顶顶顶顶顶顶顶顶顶顶顶顶 顶   顶顶 顶顶  
顶顶  顶 顶顶顶顶顶顶顶顶顶顶  顶顶顶 顶顶   顶  
顶顶顶顶顶 顶顶顶顶顶顶顶顶顶   顶顶顶   顶顶顶顶  
顶顶顶顶   顶顶顶顶顶顶顶顶顶顶 顶  顶 顶顶顶顶顶  
顶顶顶顶顶顶顶 顶顶顶顶顶顶顶顶顶  顶  顶   顶顶  
顶顶   顶  顶顶顶顶顶顶顶顶顶 顶顶顶顶  顶顶顶顶  
顶 顶顶   顶顶顶顶顶顶顶顶   顶   顶 顶顶顶顶  
顶顶顶顶顶  顶顶顶顶顶顶顶顶 顶  顶顶 顶 顶顶顶顶  
顶顶顶顶    顶顶顶顶顶顶 顶顶 顶顶顶顶顶 顶顶顶顶  
顶顶顶  顶顶   顶顶顶顶 顶  顶顶 顶顶 顶顶顶顶  
顶   顶顶顶顶    顶顶顶顶顶 顶顶顶   顶顶顶顶  
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

ghij612 发表于 2008-8-22 04:32

啊哦。。。

不错







                                                                                                   







[color=silver][size=1]SIGNATURE[/size]____________________________________________________________________
[/color]
活着的时候请尽量快乐,因为你将死的很久

[b][url=http://www.junzitang.com/files/article/html/2/2397/]神墓[/url][/b][b] [url=http://www.junzitang.com/files/article/html/19/19039/]盘龙[/url][/b] [b][url=http://www.junzitang.com/files/article/html/19/19733/]龙蛇演义[/url][/b] [b][url=http://www.junzitang.com/files/article/html/18/18439/]星辰变后传[/url][/b]

uu123456 发表于 2008-8-29 00:32

hmaya 兄留个QQ交流一下嘛,同是一行人,哈哈哈

hmaya 发表于 2008-9-17 00:13

675283427
:lol
欢迎mm

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.