Я пытаюсь создать 64-разрядный подключаемый модуль для Autodesk Maya 2013. Цель этого подключаемого модуля — возможность моделировать объекты с помощью Kinect.
В контексте, с помощью плагина вы можете выбрать резюме созданного объекта. Чтобы указать, что вы хотите переместить выбранные точки, положение выбранного резюме постоянно обновляется.
Вот моя проблема, когда я пытаюсь обновить позицию выбранного резюме объекта, результат не отображается на экране.
Я пробовал много способов, не получая никакого результата, например:
1) когда я делаю setPosition, точка не обновляется.
for ( ; !iter.isDone(); iter.next() ) {
iter.getDagPath( mdagPath, mComponent );
MItSurfaceCV sCvFn( mdagPath, mComponent, true, &stat );
if ( MS::kSuccess == stat ) {
for ( ; !sCvFn.isDone(); sCvFn.nextRow() ) {
for ( ; !sCvFn.isRowDone(); sCvFn.next() ) {
MPoint pto(pHand.posX, pHand.posY, pHand.posZ);
sCvFn.setPosition(pto, MSpace::kWorld);
}
}
}
sCvFn.updateSurface();
}
2) в этом случае, если вы перебираете массив newCVS перед выполнением setCVs
Вы можете увидеть обновленные точки.
Но тогда, когда делать setCVs
и ищет позицию в массиве CV объекта (делает getCVs
) позиция измененного резюме не меняется.
for ( ; !iter.isDone(); iter.next() ) {
stat = iter.getDagPath( mdagPath, mComponent );
if(stat == MS::kSuccess) {
MFnNurbsSurface surf(mdagPath);
MItSurfaceCV sCvFn( mdagPath, mComponent, true, &stat );
MPointArray currentCV;
surf.getCVs(currentCV, MSpace::kWorld);
MPointArray newCVS(currentCV.length(), MPoint::origin);
newCVS.setLength(currentCV.length());
for(unsigned i = 0; i < currentCV.length(); i++){
newCVS[i] = newCVS[i] + currentCV[i];
}
int index;
if ( MS::kSuccess == stat ) {
for ( ; !sCvFn.isDone(); sCvFn.nextRow() ) {
for ( ; !sCvFn.isRowDone(); sCvFn.next() ) {
sCvFn.getIndex(indexU, indexV);
int posArray = indexU * surf.numCVsInV() + indexV;
index = posArray;
MVector diff = MPoint(pHand.posX, pHand.posY, pHand.posZ) - currentCV[posArray];
newCVS[posArray] = newCVS[posArray] + diff;
}
}
surf.setCVs(newCVS, MSpace::kWorld);
surf.updateSurface();
}
}
3) Выбрав CV в Maya, я попытался переместить эти точки с помощью команд MEL. Для этого я использую функцию MGlobal :: executeCommand, но пока ничего не происходит.
Наконец то я поменял executeCommand
в executeCommandOnIdle
, В этом случае объект изменяется правильно, но процедура завершается сбоем, возможно, потому что эта процедура выполняется много раз в секунду.
Я был бы признателен, если кто-нибудь может помочь мне с этой проблемой или что-то знает об этом.
Задача ещё не решена.
Других решений пока нет …