首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c++中使用maya-api对对象应用颜色和着色

如何在c++中使用maya-api对对象应用颜色和着色
EN

Stack Overflow用户
提问于 2020-12-15 19:28:32
回答 1查看 177关注 0票数 0

我想知道如何在c++中对对象应用颜色和着色(使用maya-api映射2D纹理),以下是我的代码:

代码语言:javascript
复制
MString MNEUT_FILE("G:/repos_cpp/data/eye_base.obj");
MGlobal::executeCommand(MString("file -import -namespace \"EYETemp\" -mergeNamespacesOnClash true") + "\"" + MNEUT_FILE + "\"");
MGlobal::executeCommand(MString("select \"EYETemp:*\""));
MGlobal::executeCommand(MString("rename ") + "eyeNeutral");

stat = MGlobal::executeCommand(MString("shadingNode -asShader lambert -name eyeball"));
stat = MGlobal::executeCommand(MString("sets -renderable true -noSurfaceShader true -empty -name lambert3SG"));
//stat = MGlobal::executeCommand(MString("defaultNavigation -connectToExisting -source eyeball -destination lambert3SG"));
stat = MGlobal::executeCommand(MString("connectAttr -f eyeball.outColor lambert3SG.surfaceShader"));
stat = MGlobal::executeCommand(MString("shadingNode -asTexture file -name eyeball_TGA"));
stat = MGlobal::executeCommand(MString("connectAttr -f eyeball_TGA.outColor eyeball.color"));
stat = MGlobal::executeCommand(MString("setAttr -type \"string\" eyeball_TGA.fileTextureName \"G:/repos_cpp/data/eyeball.TGA\""));
MGlobal::executeCommand(MString("select -r eyeNeutralShape"));
stat = MGlobal::executeCommand(MString("hyperShade -assign lambert3SG"));
if (!stat)
{
    cout << "error::8\n";
}
stat = MGlobal::executeCommand(MString("sets -e -fe lambert3SG eyeNeutralShape"));
if (!stat)
{
    cout << "error::9\n";
}

当我运行这段代码时,"error::8“总是存在的!你能告诉我怎么解决它吗?非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-12-15 20:09:30

您只检查最后一个MGlobal::executeCommand的状态,所以您无法知道它实际上失败的地方。您也不需要检查错误文本来获取错误的解释。

考虑制作一个用于检查所有调用的包装器:

代码语言:javascript
复制
#include <stdexcept>

MCommandResult MayaCmd(MString cmd) {
    MCommandResult retval;
    std::cout << "Executing MayaCmd: " << cmd << '\n';
    auto stat = MGlobal::executeCommand(cmd, retval);
    if(!stat) throw std::runtime_error(stat.errorString().asChar()); // or asUTF8()
    return retval;
}

然后,您应该能够轻而易举地执行您的命令,并在异常发生时立即获得一个具有解释的异常。

示例:

代码语言:javascript
复制
try {
    MayaCmd(MString("file -import -namespace \"EYETemp\" -mergeNamespacesOnClash true") + "\"" + MNEUT_FILE + "\"");
    MayaCmd("select \"EYETemp:*\"");
    MayaCmd("rename eyeNeutral");

    MayaCmd("shadingNode -asShader lambert -name eyeball");
    MayaCmd("sets -renderable true -noSurfaceShader true -empty -name lambert3SG");
    //MayaCmd("defaultNavigation -connectToExisting -source eyeball -destination lambert3SG");
    MayaCmd("connectAttr -f eyeball.outColor lambert3SG.surfaceShader");
    MayaCmd("shadingNode -asTexture file -name eyeball_TGA");
    MayaCmd("connectAttr -f eyeball_TGA.outColor eyeball.color");
    MayaCmd("setAttr -type \"string\" eyeball_TGA.fileTextureName \"G:/repos_cpp/data/eyeball.TGA\"");
    MayaCmd("select -r eyeNeutralShape");
    MayaCmd("hyperShade -assign lambert3SG");
    MayaCmd("sets -e -fe lambert3SG eyeNeutralShape");
}
catch(const std::exception& ex) {
    std::cout << "Exception: " << ex.what() << '\n';
}

我还怀疑您应该与hyperShade -assign一起使用的名称是由前面的某个命令返回的名称,可能是shadingNode。示例:

代码语言:javascript
复制
auto ShaderNode = MayaCmd("shadingNode ...").stringResult();
...
MayaCmd("hyperShade -assign " + ShaderNode);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65304954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档