如何在Maya API中从MObject获取Node类实例

时间:2015-06-04 07:18:46

标签: c++ plugins nodes maya

在我使用Maya API开发的cpp插件中,我在initializePlugin函数中注册了一个自定义MPxTransform节点:

status=pluginFn.registerTransform("mympxtransform",
                                      myMPxTransformClass::id,
                                      &myMPxTransformClass::creator,
                                      &myMPxTransformClass::initialize,
                                      &myMPxTransformMatrixClass::creator,
                                      myMPxTransformMatrixClass::id);

然后以编程方式创建节点:

MDagModifier mdagmod;
MObject MyMObject;
MyMObject=mdagmod.createNode("mympxtransform",MObject::kNullObj,&status);

我可以在大纲中看到正确创建的节点 但是现在,我如何从获得的MyMObject访问我的自定义myMPxTransformClass?

2 个答案:

答案 0 :(得分:1)

解决此问题的方法:

你只需要这样做:

Therapist

1)我们在这里做的基本上是创建类'类型的指针,并为其创建类型指针到创建的myMPxTransformClass* newDerived = (myMPxTransformClass*)&transformedObj; // 1) // For debugging MGlobal::displayInfo(newDerived->className()); 。编译器不允许使用类型转换MObject本身,但可以将指针类型转换为类的指针(MObject)。

然后我们可以使用指针来访问类的方法等等。

P.S。对于myMPxTransformClass*,尝试直接投射dynamic_cast将无效,因为MObject不是多态类型(故意)。

侧面建议:

另一方面,我想补充一下。 这主要是我的观点。由于我不知道您要对代码执行什么操作,请谨慎使用此建议。

根据Maya的核心原则,

  

您永远不会在Maya中访问节点/ MObject的成员函数。

一旦创建,它完全由Maya控制。您可以(有点)控制它的唯一方法是使用Maya提供的函数集(MObject类)作为该节点类型(在您的情况下为MFn集,因为您的节点是MFnTransform是一个转换节点。)

如果您有可能希望以编程方式操作和操作的类数据成员,则必须为它们设置实际的Maya属性(从而将它们公开给Maya)。然后,您将能够将它们设为kPluginTransformNode并完成您的工作。

查看您的代码,我觉得您主要打算生成两个组件,一个节点(即您的自定义MPlugs);和函数类(即MPxTransform)对你的节点做一些事情。我建议将插件分成两个独立的组件:节点和命令。这样就明确分离了责任。因为,就目前而言,只需加载插件即可创建节点并对其进行操作。用户可能会对可能发生的事情感到困惑。如果将它们分成节点和执行该操作的命令,则可以按用户认为合适的方式使用它们。该命令可以是用户使用插件的入口点。

希望这有帮助!

答案 1 :(得分:1)

以下是使用api的另一种方式:

myMPxTransformClass* node= (myMPxTransformClass*)(MFnDependencyNode(myMObject).userNode());