Maya API - 从材质获取网格
Maya API - Get mesh from material
我目前正在为 Maya 开发一个自定义视口插件。目前,我正在尝试将 Maya 中的材质解析为我自己的自定义框架材质。
我创建了一个在添加 lambert 着色器时调用的回调(请参阅下面的代码片段)。我觉得这个回调甚至在初始化(刚刚)添加的 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 着色器时,都会触发此回调。
虽然我的问题是..如何获取添加此材质的网格节点?我试图获取兰伯特着色器的连接,但没有(请参阅下面的代码片段)。
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 着色器添加到网格时,它会作为着色器组中的表面着色器应用,但我在回调中找不到该关系。
所以,我要问你的问题是:我能得到这个朗伯着色器绑定到的网格吗(以及如何)?
我知道的唯一方法是遍历依赖关系图。形状不直接连接到着色器,它通过 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
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 如何从 Skia 路径几何体中获取网格?
- 循环通过网格获取温度,但不知道如何告诉程序停止循环
- 获取网格中心的屏幕位置
- 从 CGAL 3D 网格生成中获取顶点坐标的 -6.27744e+66:mesh_implicit_sphere示例
- 我无法将数据从数据网格列传输到 C# 中的数组以获取文本框建议收集数据
- Maya API - 从材质获取网格
- CGAL:从表面网格中获取人脸数据
- C++Maya-从帧和子帧获取网格顶点
- 如何将自动递增的主键的数据从 sql 服务器获取到我的数据网格视图
- 获取实例化几何对象的网格
- 如何将用户输入的数据从数据网格视图获取到窗口窗体图
- 获取网格上最接近的点
- CUDA如何获取网格、块、线程大小和并行化非方阵计算