前言
在插件(三)中,我们使用了自定义的Locator结点,它也是个DG Node,本文目的是学习和理解Mplug && Attribute。
MyDGNode是我们自定义的结点, 有输入、输出Attribute,下图是一个用法:
将时间结点time1的输出-->MyDGNode1-->sphere1(Transform结点).
MyDGNode的实现
从MPxNode继承。MyDGNode.h
1. virtual MStatus compute(const MPlug &outPlug, MDataBlock &dataBlock);
当DG网络出现脏数据时,该函数将被调用,用于更新数据.
2. static MStatus initialize();
初始化该结点,创建Attributes(相当于动态添加类成员变量).
3. static MObject m_inTime; static MObject m_outValue;
新的Attribute标识符(句柄).
实现代码MyDGNode.cpp
注册MyDGNode, pluginMain.cpp
Attribute Editor模板MEL
放在Maya用户目录的Scripts下面。
编译工程.....
加载插件后,在MEL窗口中执行如下脚本
// run this MEL to test the MyDGNode
{
$myNode = `createNode "MyDGNode"`;
// create a polygon sphere
string $psphere[] = `polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -tx 1 -ch 1`;
// connect the output of the node to the x-scale of the ploy sphere
string $plugName = `connectAttr ($myNode + ".output") ($psphere[0] + ".sx")`;
print $plugName;
print("/n");
// connect the time1 output to the "time" of myNode
$plugName = `connectAttr "time1.outTime" ($myNode + ".time")`;
print $plugName;
print("/n");
}
然后开启时间滑块,你会发现球体的缩放动画。
做个实验
在MEL命令中继续输入如下命令:
connectAttr "time1.outTime" "MyDGNode1.output";
直接将time1连接到MyDGNode1的ouput, 发现对显示无影响,看看连接图如下:
如果输入的命令是:
connectAttr "pSphere1.sy" "MyDGNode1.time";
将出现错误, Error: line 1: 'MyDGNode1.time' already has an incoming connection from 'time1.outTime'.
说明incoming的来源只能是一个!