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
) しても、変更された 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
。この場合、オブジェクトは正しく変更されますが、おそらくこのプロシージャは 1 秒間に何度も実行されるため、プロシージャはクラッシュします。
誰かがこの問題について私を助けてくれたり、これについて何か知っていれば幸いです。