【问题标题】:Maya API - Get mesh from materialMaya API - 从材质中获取网格
【发布时间】:2019-03-22 09:16:29
【问题描述】:

我目前正在为 Maya 开发一个自定义视口插件。目前,我正在尝试将 Maya 中的材质解析为我自己的自定义框架材质。

我创建了一个回调,当添加 Lambert 着色器时调用它(参见下面的代码 sn-p)。我觉得这个回调甚至在初始化(刚刚)添加的 Lambert 着色器之前就被调用了,但这不是重点。

MCallbackId lambert_added_id = MDGMessage::addNodeAddedCallback(
    LambertAddedCallback,  // The callback function
    "lambert", // The type of object that triggers the callback
    m_material_parser.get(), // Client data
    &status // Return status
);

返回状态为MStatus::kSuccess。每当我添加 Lambert 着色器时,都会触发此回调。

虽然我的问题是.. 我如何获得添加此材质的网格节点?我尝试获取 Lambert 着色器的连接,但没有(参见下面的代码 sn-p)。

void LambertAddedCallback(MObject& node, void* client_data)
{
    assert(node.apiType() == MFn::Type::kLambert);

    MFnLambertShader fn_lambert(node);

    MGlobal::displayInfo(node.apiTypeStr() + MString(" added!"));

    {
        MString str = fn_lambert.parentNamespace();
        MGlobal::displayInfo((str + " = parentNameSpace").asChar());
    }

    {
        MPlugArray plug_array;
        fn_lambert.getConnections(plug_array);
        auto num = plug_array.length();
        MGlobal::displayInfo("Pluggies: ");
        for (int i = 0; i < plug_array.length(); ++i)
        {
            MGlobal::displayInfo(plug_array[i].name().asChar());
        }
    }
}

回调打印:

 = parentNamespace

没有打印任何其他内容,这意味着没有parentNamespace,也没有连接到它的插头..?我知道当您将朗伯着色器添加到网格时,它会作为着色器组中的表面着色器应用。但我在回调中找不到这种关系。

那么,我的问题是:我可以得到这个 Lambert 着色器(以及如何)绑定到的网格吗?

【问题讨论】:

    标签: c++ callback shader mesh maya-api


    【解决方案1】:

    我知道的唯一方法是遍历依赖图。形状不直接连接到着色器,它通过一个 kShadingEngine 节点,所以你需要锯齿形的图形。着色引擎在材质的下游,而节点在着色引擎的上游。

    这是一个使用 Python api 的示例:

    def get_shading_engine_from_material(m_object):
    
        shading_engine = None
        iterator = OpenMaya.MItDependencyGraph(m_object, OpenMaya.MFn.kShadingEngine,
                                               OpenMaya.MItDependencyGraph.kDownstream,
                                               OpenMaya.MItDependencyGraph.kDepthFirst,
                                               OpenMaya.MItDependencyGraph.kPlugLevel)
    
    
        if not iterator.isDone():
            obj = iterator.currentNode()
            if not obj.isNull():
               return obj
    
    def get_node_from_material(m_object):
    
        shading_engine = get_shading_engine_from_material(m_object)
        if shading_engine is None:
            return None
    
    
        iterator = OpenMaya.MItDependencyGraph(shader, OpenMaya.MFn.kMesh,
                                               OpenMaya.MItDependencyGraph.kUpstream,
                                               OpenMaya.MItDependencyGraph.kDepthFirst,
                                               OpenMaya.MItDependencyGraph.kNodeLevel)
        if not iterator.isDone():
            obj = iterator.currentNode()
            if not obj.isNull():
               return obj
    
    shape = get_node_from_material(mat)
    assert shape.apiType() == OpenMaya.MFn.kMesh
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2020-12-21
      相关资源
      最近更新 更多