今天在工作中遇到一个小问题,模型组的兄弟说:最近经常遇到做好的模型材质丢了,想给默认的lambert1材质又给不上,用鼠标中键把材质拖到模型上倒是管用,也不知道是不是maya2017的bug,总之很让人生气。
不管是不是maya的bug,问题还是要解决的。既然用鼠标中间还是能给上的,那么思路就是用代码给一遍试试,说不定可以呢。批量给所有模型给一遍默认材质,总比一个一个手动拖材质要快不少。
先直接上代码:

import pymel.core as pm
for obj_shape in pm.ls(type='mesh'):
    obj = pm.listRelatives(obj_shape.name(),p=1,type = 'transform')[0]
    shaderSG_name = "initialShadingGroup"
    pm.sets(shaderSG_name, forceElement=obj )

在maya中给模型材质的时候,Scripet Editor中会返回这句:

sets -e -forceElement blinn1SG;

这样你就不用把帮助看完才知道给材质需要sets这个方法

打开maya帮助
Technical Documentation > PyMel Reference > Module Documentation
打开之后一脸懵逼,虽然上面有搜索,但我还是靠着毅力找到了sets( pymel.core.general.sets),里面有范例代码。

sets( sg, forceElement=s )

需要两个参数,第一个是字符串(一个ShadingEngine节点的名字),第二个参数是一个transform节点对象。
然后一拍脑门想起来列出场景中所有的模型用ls:
pm.ls(type='mesh')
但是列出来的都是模型的shape节点

obj = pm.listRelatives(obj_shape.name(),p=1,type = 'transform')[0]

这样就可以把shape节点转成transform节点了

最后用一个for循环结束战斗。


后来又遇模型给新材质的时候无法断开默认材质连接,再从帮助里抄一句:

# 断开所有默认材质连接
for obj_shape in pm.ls(type='mesh'):
    obj = pm.listRelatives(obj_shape.name(),p=1,type = 'transform')[0]
    shaderSG_name = "initialShadingGroup"
    pm.sets(shaderSG_name, remove=obj )

然后再重新给材质吧.