我正在尝试为 Autodesk Maya 2013 创建一个 64 位插件。这个插件的目的是能够通过 Kinect 对对象进行建模。
在上下文中,您可以使用插件选择已创建对象的 CV。要指定要移动选定点,选定 CV 的位置会不断更新。
这是我的问题,当我尝试更新对象的选定 CV 的位置时,结果未显示在屏幕上。
我尝试了很多方法都没有得到任何结果,例如:
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
位置(执行 a )时,修改后的 CV 的位置不会改变。
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) 在 Maya 中选择 CV 时,我尝试使用 MEL 命令移动这些点。为此,我使用了“MGlobal::executeCommand”函数,但仍然没有任何反应。
最后,我executeCommand
改为executeCommandOnIdle
. 在这种情况下,对象会正确更改,但过程可能会崩溃,因为此过程每秒执行多次。
如果有人可以帮助我解决这个问题或对此有所了解,我将不胜感激。