前沿
首先介绍一下什么是Locator,运行Maya, 选择菜单Create --> Locator, 我们将看到如下界面:
Locator是属于shape可以被绘制,在Maya中任何一个shape的位置、缩放、旋转是通过它的父节点Transform实现的,但是Locator有自己的local Postion和Local Scale(参考右边的属性编辑界面)。
MyLocator的实现
自定义的Locator需要从MPxLocator继承。看如下类定义:
这里重载了函数:
1. draw, 用于绘制MyLocator, 由Maya调用;
2. isBounded, 告诉Maya,该shape有包围盒;
3. boundingBox,返回包围盒,用于选择检测。
static const MTypeId m_typeId; // Node ID, 用于标识该类, 在Maya二进制文件中会使用之.
static const MString m_typeName; // Node Type Name, 相当于类名称.
static MObject m_size; // 自定义的属性, 表示Locator的底部正方形的边长
static MObject m_height; // 自定义的属性, 表示Locator的高度
MyLocator的实现如下:
initialize() 函数在插件被加载时被调用,它告知Maya,MyLocator新增了2个新属性,相当于MyLocator类新增加了2个成员变量(以动态的形式),例如:m_height = fn.create("height", "h", MFnUnitAttribute::kDistance); 创建了一个名字叫height、类型是kDistance的属性,但是这并不表示它的Value保存在m_height中,我们可认为m_height是个变量句柄,以后的文章中将谈到Value保存在DataBlock中。oh.... 这让我想起了Java,句柄+实际的内存块。
DLL的导出函数
同前面的插件一样,同样是在导出函数中进行注册,不过这里我们要注册的是Node.
注册函数
MStatus status = plugin.registerNode(MyLocator::m_typeName,
MyLocator::m_typeId, // 自定义的Node Id
MyLocator::creator, // 创建MyLocator对象
MyLocator::initialize, // 注册时被调用,动态完成MyLocator的扩充
MPxNode::kLocatorNode); // 该Node是个Locator Node.
OK! 编译运行,并加载MyLocator.Mll,在Mel命令行中输入
createNode "MyLocator" 按Enter键后,我们会看到如下内容:
如果此时设置Locator Attributes是没用的,因为在draw()中,压根就没被使用!
加入自定义的Attribute Editor界面
咦,怎么不见右边的编辑窗口中有 height 和 size的编辑呢,那时因为我们没有加入界面,下面要加入一个Attribule Editor Template, 用于加入自定义的属性。 我们的脚本文件名为AEMyLocatorTemplate.MLL, 名字是由 AE + 自定义节点名 + Template.MLL, 放在Maya用户目录的scripts下面。 当我们选择自定义节点时,该脚本将会自动执行!
OK,当我们选择自定义的MyLocator时,将出现编辑界面如下:
查看对象的生存
OuputWindow的显示如下:
MyLocator::initialize()
initializePlugin
MyLocator::creator()
MyLocator() construction
sizePlug is Non-Networked
heightPlug is Non-Networkde
MyLocator::draw()
选择菜单File -->NewScene, 看到MyLocator对象被销毁
~MyLocator() destruction
实例代码vs2005 URL: http://download.csdn.net/source/2702834