Maya插件(三)自定义Locator的实现

 前沿

首先介绍一下什么是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

 

 


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值