gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:09 26 4
gpt4 key购买 nike

在我使用 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?

最佳答案

这个问题的解决方案:

你只需要做:

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

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

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

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

附注对于 dynamic_cast,尝试直接转换 MObject 是行不通的,因为 MObject 不是多态类型(有意)。


侧面推荐:

在旁注中,我想补充一点。 这主要是我的意见。由于我不知道您要用您的代码做什么,所以请对这个建议持保留态度。

根据core 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com