【问题标题】:Maya c++ API, animating an object in a threadMaya c++ API,在线程中为对象设置动画
【发布时间】:2018-02-19 20:26:09
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: c++ maya maya-api


    【解决方案1】:

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

    MTimerMessage::addTimerCallback

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

    【讨论】:

    • 即使这适用于您的情况,您也应该小心地从另一个线程而不是主线程更改 Maya 元素。 Maya 可能非常挑剔,除非类或方法未明确标记为线程安全。这可能会导致未定义的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多