You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Maya Python API向场景添加材质并创建材质集合?

用Maya Python API创建并分配材质的完整方案

嘿,我来帮你搞定这个Maya材质自动化的问题!你说得没错,Maya里的材质确实和集合(sets)紧密相关——准确来说是着色组(shading group),它本质就是一种特殊的可渲染集合,用来关联材质节点和模型。下面我直接给你用最新的Maya Python API(OpenMaya 2.0)实现的完整方案,拆解每一步帮你理解:

核心步骤说明

创建材质并分配的流程其实分为4个关键环节:

  1. 创建着色节点(比如Lambert、Blinn这类实际定义材质属性的节点)
  2. 创建着色组(也就是你说的材质集合,必须标记为可渲染)
  3. 连接着色节点的outColor属性到着色组的surfaceShader属性(让材质效果能被着色组识别)
  4. 将模型的形状节点添加到着色组中(完成材质分配)

完整API代码示例

下面是一个创建红色Lambert材质并分配给选中多边形的示例:

import maya.api.OpenMaya as om

def create_and_assign_material(material_name="customLambert", selection=None):
    # 处理选中对象:如果没传入选择列表,就获取当前场景选中的对象
    if not selection:
        sel_list = om.MGlobal.getActiveSelectionList()
        if sel_list.length() == 0:
            om.MGlobal.displayError("请先选中一个多边形对象再执行!")
            return
        selection = [sel_list.getDagPath(i) for i in range(sel_list.length())]
    
    # 1. 创建Lambert着色节点
    lambert_factory = om.MFnLambertShader()
    lambert_node = lambert_factory.create()
    lambert_factory.setName(material_name)
    
    # 可选:修改材质属性,比如设置红色
    color_plug = lambert_factory.findPlug("color", False)
    color_plug.setMFloatVector(om.MFloatVector(0.8, 0.2, 0.2))  # RGB值
    
    # 2. 创建着色组(可渲染集合)
    shading_group_factory = om.MFnSet()
    shading_group_node = shading_group_factory.create()
    shading_group_factory.setName(f"{material_name}_SG")
    # 关键:标记这个集合为可渲染,否则不会被识别为材质组
    shading_group_factory.setRenderable(True)
    
    # 3. 连接材质节点和着色组
    # 获取材质的outColor属性插头
    mat_out_color = lambert_factory.findPlug("outColor", False)
    # 获取着色组的surfaceShader属性插头
    sg_surface_input = shading_group_factory.findPlug("surfaceShader", False)
    # 创建连接并执行
    modifier = om.MDGModifier()
    modifier.connect(mat_out_color, sg_surface_input)
    modifier.doIt()
    
    # 4. 将选中模型的形状节点添加到着色组
    for dag_path in selection:
        # 如果选中的是变换节点(比如pCube1),需要切换到它的形状节点(pCube1Shape)
        if not dag_path.hasFn(om.MFn.kShape):
            dag_path.extendToShape()
        # 添加到着色组集合中
        shading_group_factory.addMember(dag_path.node())
    
    om.MGlobal.displayInfo(f"材质 {material_name} 已创建并成功分配!")

# 调用函数:创建名为redLambert的材质并分配给当前选中对象
create_and_assign_material("redLambert")

扩展说明

  • 其他材质类型:如果要创建Blinn、Phong等材质,只需要把om.MFnLambertShader换成对应的om.MFnBlinnShaderom.MFnPhongShader即可,其余步骤完全一致。
  • Hypershade显示:只要创建了着色节点和着色组,它们会自动出现在Hypershade面板中,不需要额外的API调用。
  • 简化版(Maya.cmds):如果你觉得API写起来太繁琐,也可以用更简洁的cmds命令实现相同功能(本质是API的封装):
import maya.cmds as cmds

def create_material_with_cmds():
    # 创建材质节点
    mat = cmds.shadingNode("lambert", asShader=True, name="quickLambert")
    # 创建着色组
    sg = cmds.sets(renderable=True, noSurfaceShader=True, empty=True, name=f"{mat}_SG")
    # 连接材质和着色组
    cmds.connectAttr(f"{mat}.outColor", f"{sg}.surfaceShader", force=True)
    # 分配给选中对象
    selected = cmds.ls(selection=True)
    if selected:
        cmds.sets(selected, edit=True, forceElement=sg)

内容的提问来源于stack exchange,提问作者Kostyuk Rostyslav

火山引擎 最新活动