一 概述
不要把DG(Dependency Graph)和DAG混淆,依赖图中的节点是用来负责控制动画和维护网格构建历史的,而DAG中的节点则用于定义外形节点以及它的空间位置。
DG插件的开发实质上是创建一些新的节点,将这些节点添加到依赖图中即可形成新的操作。Maya提供了十二种基本的类,派生自它们可以实现各种所需的功能。DG插件开发就是创建派生自这些基本类的新类,这些类都是以”MPx”开头,从文档Maya插件开发基础中可以知道这些类属于代理类,用于依赖图中构建各种节点。
基本的父类是”MPxNode”,派生自该类可以创建新的依赖节点(Dependency Node),它是Maya中最基础的DG节点。其他的十一个类均是派生自”MPxNode”。
二 基本示例
创建sine节点,向该节点输入一个值x,该节点就输出sin(x),为Maya/devkit/plug-ins/sineNode这个项目。
1 该类定义
#include <string.h>
#include <maya/MIOStream.h>
#include <math.h>
#include <maya/MPxNode.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MFnPlugin.h>
#include <maya/MString.h>
#include <maya/MTypeId.h>
#include <maya/MPlug.h>
#include <maya/MVector.h>
#include <maya/MDataBlock.h>
#include <maya/MDataHandle.h>
classsine : public MPxNode
{
public:
sine();
virtual~sine();
virtual MStatus compute(const MPlug& plug, MDataBlock& data );
static void*creator();
static MStatus initialize();
public:
static MObject input; // The input value.
static MObject output; // The output value.
staticMTypeIdid;
};
2 函数解析
<1> 构造造函数
在节点被创建的时候被调用,或者调用createNode命令、MFnDependencyNode::create方法的时候也会触发该节点的构造函数。
<2> 析构函数
被定义成虚析构函数(参见虚析构函数的作用,讲的是使用基类指针删除派生类的对象的时候,这个时候可以触发派生类的析构函数)。该析构函数只有在节点真正被删除的时候才被调用。由于Maya中使用撤销操作队列,删除一个节点并不会真正导致该节点的析构函数被调用,所以假如删除操作被撤销,这个节点又可以被找回来而不是重新创建。一般来说,一个删除节点的析构函数只有撤销队列被flush的时候才会被调用。
<3> compute函数
virtual MStatus compute(const MPlug& plug, MDataBlock& data );
compute函数是DG节点的大脑,它进行由输入生成输出这个过程的真正运算工作
<4> creator函数