2

我正在尝试为 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. 在这种情况下,对象会正确更改,但过程可能会崩溃,因为此过程每秒执行多次。

如果有人可以帮助我解决这个问题或对此有所了解,我将不胜感激。

4

0 回答 0