Maya c ++ API,为线程

时间:2018-02-19 20:26:10

标签: c++ maya maya-api

我正试着用c ++ Maya API来移动一个对象。

我创建了一个关节,使用:

MFnIkJoint* rootJoint = new MFnIkJoint();
MObject rootTransform = rootJoint->create(MObject::kNullObj, &status);

然后我启动一个移动这个关节的线程:

bool dataStreamExit = false;
MStatus stat = MThreadAsync::init();
    if (MStatus::kSuccess != stat) {
        MString str = MString("Error creating MThreadAsync");
        MGlobal::displayError(str);
    }
    else
    {
        MThreadAsync::createTask(ApplyData, this, NULL, NULL);
    }

线程函数是:

MVector currentCamPos;

MThreadRetVal ApplyData(void* data)
{
    MStatus status;    

    while(dataStreamExit == false)
    {

        currentCamPos.x += 0.0001;      

        status = rootJoint->setTranslation(currentCamPos, MSpace::kTransform);

        Sleep(1);
      }
    return (MThreadRetVal)0;

}

我运行此功能,在视口中创建关节,然后开始移动。然后,几秒钟后,它将停止在视口中移动,但属性编辑器中的转换值会不断更新。

线程不断分配数据,但视口停止更新。我也试过这种方法:

MPlug plug = MFnDependencyNode(rootTransform ).findPlug("tx", false, &status);
if (status == true)
{
    plug.setFloat(currentCamPos.x);
}

但我看到了同样的行为。移动对象后,我是否需要以某种方式刷新视图?如何保持视口更新?

谢谢。

1 个答案:

答案 0 :(得分:0)

啊,我需要更新主Maya线程中的视口。这可以使用:

完成

MTimerMessage::addTimerCallback

http://download.autodesk.com/us/maya/2010help/API/class_m_timer_message.html