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

标签 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);

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

最佳答案

此问题的解决方案:

你只需要做:

myMPxTransformClass* newDerived = (myMPxTransformClass*)&transformedObj;  // 1)

// For debugging
MGlobal::displayInfo(newDerived->className());

1) 我们在这里所做的基本上是创建一个类类型的指针,并将指针类型转换为创建的 MObject 并分配给它。 。编译器不允许类型转换 MObject本身,但指向它的指针可以类型转换为类的指针( myMPxTransformClass* )。

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

附:以dynamic_cast为例,尝试转换 MObject直接不起作用,因为 MObject不是多态类型(故意)。


侧面推荐:

顺便说一句,我想添加这一点。 这主要是我的观点。由于我不知道您想用代码做什么,因此请对这个建议持保留态度。

根据Maya核心原理,

Thou shall never access member functions of a node/MObject in Maya.

一旦创建,就完全受 Maya 控制。您可以(某种程度上)控制它的唯一方法是使用 Maya 为该节点类型提供的函数集( MFn 类)(在您的情况下 MFnTransform 设置,因为您的节点是 kPluginTransformNode 这是一个变换节点)。

如果您有可能想要以编程方式操作和操作的类数据成员,则必须将它们设置为该节点的实际 Maya 属性(从而将它们公开给 Maya)。然后,您将能够得到它们 MPlugs并做你的事情。

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

希望这有帮助!

关于c++ - 如何在 Maya API 中从 MObject 获取 Node 类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30637438/

相关文章:

c++ - 为什么在将 LPBYTE 复制到 LPTSTR(剪贴板)期间使用 memcpy 时抛出异常?

c++ - 如何使函数不要求基于初始输入的额外输入

javascript - TypeError : require(. ..).jsdom 不是函数

c - LinkedList函数在c中崩溃

c++ - 将子项目插入一行 QTreeWidgetItem

c++ - 需要帮助理解代码以计算设置为 1 的位

scala - IDEA插件开发中无法使用akka

css - 如何在 facebook 评论社交插件后删除意外空间?

video - CKEditor 4.1.1 的 Html 5 视频插件

c - C中如何指向当前节点的上一个节点和当前节点的下一个节点?