我在c ++中有一个Maya插件。在此插件中,只要Maya中的时间发生变化,就会触发timeChange函数 我想在达到给定时间时创建特定的网格形状。正确创建了形状,但是当想要为形状指定着色器时,它会告诉无法找到形状。通过按钮或MEL接口重新执行分配可正常工作 算法如下:
失败时:
- 时间变化
- 事件功能触发(静态功能)
- 形状创造
- 通过API使用mel命令分配着色器 - >错误
- 通过具有相同mel命令的界面分配着色器 - >作品
当它工作时:
- 按钮单击功能已解雇
- 形状创造
- 通过API使用mel命令分配着色器 - >作品
void MyClass::CreateOneShape()
{
MDagPath thisDagNode;
MFnDagNode dagPath;
MString rootName;
// CREATING SHAPE
log("Will create shape");
MFnDependencyNode fnPolySp;
MObject objPolySp = fnPolySp.create("polyPrimitiveMisc");
MFnDagNode fnPolyTrans;
MObject objPolyTrans = fnPolyTrans.create("transform");
MFnDagNode fnPolyShape;
MObject objPolyShp = fnPolyShape.create("mesh", objPolyTrans,&status);
rootName="Unit_";
fnPolyShape.setName(rootName+MString()+UnitId+"_Shape");
MFnTransform m(objPolyTrans);
m.setName(rootName+MString()+UnitId);
MFnDagNode n(theMesh,&status);
MDagPath dp;
status=n.getPath(dp);
MFnMesh fn(dp,&status);
MObjectArray shaders;
MIntArray indices;
status=fn.getConnectedShaders(0,shaders,indices);
for (int sh=0;sh<shaders.length();sh++)
{
MFnDependencyNode dep(shaders[sh]);
// Below is the command that fails when called in an event function and works when called via a button function.
MString cmd="select -cl ; select -r "+rootName+MString()+UnitId+"_Shape.f[" + MString()+int(surfaceNb) + "] ; sets -e -forceElement " + dep.name() + ";";
MGlobal::executeCommand(cmd);
surfaceNb++;
}
}
void timeChanged(MyClass *clientData)
{
clientData->CreateOneShape(); --> Gives error that shape cannot be found
}
void buttonClicked()
{
CreateOneShape(); --> Works fine
}
如何在事件触发函数中正确分配我的着色器?
答案 0 :(得分:0)
主要听起来很奇怪,但主要问题是你没有调用MDGModifier :: doIt()来强制Maya在尝试构建更多连接之前刷新其内部状态。我会在调用doIt()函数时使用MDagModifier :: createNode()代替在正确的撤销堆栈中捕获它。你这样做的方法是为每个创建一个撤消步骤,而你当然希望将所有步骤捕获到一个中。 MDagModifier是MDGModifier的衍生物,因此它也具有doIt()函数。因为有时创建着色器/组连接更难,所以调用MEL很好,但之前调用doIt(),这应该可以解决您的问题。如果没有让我知道,我会写一些代码来演示。