0

我正在尝试使用 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);
}

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

谢谢你。

4

1 回答 1

0

啊,我需要在 Maya 主线程中更新视口。这可以使用以下方法完成:

MTimerMessage::addTimerCallback

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

于 2018-02-19T21:00:17.417 回答