Maya c ++ 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);
}

Но я наблюдаю то же поведение. Нужно ли мне как-то обновлять вид после перемещения объекта? Как я могу постоянно обновлять область просмотра?

Спасибо.


person anti    schedule 19.02.2018    source источник


Ответы (1)


Ах, мне нужно обновить область просмотра в основной ветке Maya. Это можно сделать с помощью:

MTimerMessage::addTimerCallback

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

person anti    schedule 19.02.2018
comment
Даже если это сработает в вашем случае, вы должны быть осторожны, изменяя элементы maya из другого потока, но не из основного потока. Maya может быть довольно разборчивой, и если класс или метод явно не помечены как потокобезопасные. Это может привести к неопределенному поведению. - person haggi krey; 20.02.2018