Я пытаюсь обернуть голову, перемещая объект, используя c ++ API Maya.
Я создаю соединение, используя:
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);
}
Но я вижу то же самое поведение. Нужно ли как-то обновить вид после перемещения объекта? Как я могу обновлять область просмотра?
Спасибо.
Ах, мне нужно обновить область просмотра в главном потоке майя. Это можно сделать с помощью:
MTimerMessage::addTimerCallback
http://download.autodesk.com/us/maya/2010help/API/class_m_timer_message.html
Других решений пока нет …