[MAYA脚本] 根据材质分离OBJ文件脚本

MAYA导入OBJ的时候经常会遇到这种即使勾选了多重物体之后导入的模型也是相连在一起的情况,

可以点击Mesh→Seperate将模型按照相连的面片分离,

但是遇到那种分离之后有成百上千零件的物体想再把同类的部分合并起来就麻烦了,比如这只冰箱

实际上其他软件导出的obj如果设置正确都会一个mtl文件

如果maya读取到了这个文件的话就会把物体的材质组信息一起导入进来,我们可以根据这个材质组来选择物体的面进行分离(当然你也可以选择fbx或者abc格式)


一个一个分离太麻烦了,我们输入脚本来按照材质自动将模型分离好,复制以下代码
#The selected item must be Obj by imported
import maya.cmds as cmds
def seperateObj(merger):
mergerShape = cmds.listRelatives(merger, s=1)[0]
allSG = cmds.listSets(o=mergerShape, type=1)
for sg in allSG:
locals()[sg]=[]
components = cmds.polySeparate(merger, ch=0)
grp = cmds.listRelatives(components[0], p=1)
for element in components:
sgname = cmds.listSets(o=cmds.listRelatives(element, s=1)[0])[0]
locals()[sgname].append(element)
for sg in allSG:
if len(locals()[sg])==1:
cmds.sets(locals()[sg][0], e=1, forceElement = sg)
cmds.rename(locals()[sg][0], (merger+"_"+sg))
else:
part = cmds.polyUnite(locals()[sg], ch=0, n=(merger+"_"+sg))
cmds.sets(part, e=1, forceElement = sg)
cmds.parent(part, grp)
for obj in cmds.ls(sl=1):
seperateObj(obj)
打开脚本编辑器,粘贴到python标签页,选中需要分离的物体点击执行

OK,分离好了,每个物体的名字是未分离物体的名字加上属于它的着色组名字作为后缀

也支持多选物体一起分离


不想每次都打开脚本编辑器执行的话可以选择保存到工具架把脚本变成按钮

Tip:不推荐在maya里进行面给材质这样的操作
(发现有时候会遇到不存在于任何面上的材质导致脚本失效,更新了一下代码,详情在这个最后面https://www.bilibili.com/read/cv6783312)