如何通过Maya Python API向场景添加材质并创建材质集合?
用Maya Python API创建并分配材质的完整方案
嘿,我来帮你搞定这个Maya材质自动化的问题!你说得没错,Maya里的材质确实和集合(sets)紧密相关——准确来说是着色组(shading group),它本质就是一种特殊的可渲染集合,用来关联材质节点和模型。下面我直接给你用最新的Maya Python API(OpenMaya 2.0)实现的完整方案,拆解每一步帮你理解:
核心步骤说明
创建材质并分配的流程其实分为4个关键环节:
- 创建着色节点(比如Lambert、Blinn这类实际定义材质属性的节点)
- 创建着色组(也就是你说的材质集合,必须标记为可渲染)
- 连接着色节点的
outColor属性到着色组的surfaceShader属性(让材质效果能被着色组识别) - 将模型的形状节点添加到着色组中(完成材质分配)
完整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.MFnBlinnShader、om.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




