gpt4 book ai didi

c++ - Maya API - 从 Material 中获取网格

转载 作者:行者123 更新时间:2023-12-03 12:47:21 24 4
gpt4 key购买 nike

我目前正在为 Maya 开发自定义视口(viewport)插件。目前,我正在尝试将 Maya 中的 Material 解析为我自己的自定义框架 Material 。

我创建了一个回调,在添加兰伯特着色器时调用该回调(请参阅下面的代码片段)。我觉得这个回调在初始化(刚刚)添加的兰伯特着色器之前就被调用了,但这不是重点。

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。每当我添加兰伯特着色器时,都会触发此回调。

虽然我的问题是..如何获取添加此 Material 的网格节点?我尝试获取兰伯特着色器的连接,但没有(请参阅下面的代码片段)。

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 并且没有连接到它的插头..?我知道当您向网格添加兰伯特着色器时,它会作为着色器组中的表面着色器应用。但我在回调中找不到这种关系。

所以,我向您提出的问题是:我能否获得该兰伯特着色器绑定(bind)到的网格(以及如何获得)?

最佳答案

我知道的唯一方法是遍历依赖图。该形状不直接连接到着色器,它通过 kShadingEngine 节点,因此您需要对图形进行锯齿形处理。着色引擎位于 Material 的下游,而节点位于着色引擎的上游。

以下是使用 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

关于c++ - Maya API - 从 Material 中获取网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55296313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com