[MAYA脚本] 根据材质分离OBJ文件脚本
优化了下https://www.bilibili.com/read/cv6298807/UP提供的代码 评论区发送代码会改变字符串, 本来是英文的()的括号会变成这个【】 导致复制也运行不了
以下是代码
import maya.cmds as cmds
def separate_obj(merger):
merger_shape = cmds.listRelatives(merger, s=True)[0]
all_sg = cmds.listSets(object=merger_shape, type=1)
for sg in all_sg:
locals()[sg] = []
components = cmds.polySeparate(merger, ch=False)
parent_grp = cmds.listRelatives(components[0], parent=True)
for element in components:
sg_name = cmds.listSets(object=cmds.listRelatives(element, s=True)[0])[0]
locals()[sg_name].append(element)
for sg in all_sg:
if len(locals()[sg]) == 1:
cmds.rename(locals()[sg][0], (merger + "_" + sg))
cmds.sets(locals()[sg][0], forceElement=sg)
else:
part = cmds.polyUnite(locals()[sg], ch=False, n=(merger + "_" + sg))
cmds.sets(part, forceElement=sg)
cmds.parent(part, parent_grp)
for obj in cmds.ls(selection=True):
separate_obj(obj)

下面是给工作中需要用到这个代码的魔改版,会根据用户的材质球用户自定义名字赋予分离的模型,比如用户的材质球名字是 H2333_LOW 分离模型后名字为H2333_LOW_Geo,

以下是代码
import maya.cmds as cmds
def separate_obj(merger):
merger_shape = cmds.listRelatives(merger, s=True)[0]
all_sg = cmds.listSets(object=merger_shape, type=1)
for sg in all_sg:
locals()[sg] = []
components = cmds.polySeparate(merger, ch=False)
parent_grp = cmds.listRelatives(components[0], parent=True)
for element in components:
sg_name = cmds.listSets(object=cmds.listRelatives(element, s=True)[0])[0]
locals()[sg_name].append(element)
for sg in all_sg:
if len(locals()[sg]) == 1:
obj_name = locals()[sg][0]
shader_name = cmds.listConnections(sg + ".surfaceShader")[0]
new_name = shader_name + "_Geo"
cmds.rename(obj_name, new_name)
cmds.sets(new_name, forceElement=sg)
else:
obj_list = locals()[sg]
shader_name = cmds.listConnections(sg + ".surfaceShader")[0]
new_name = shader_name + "_Geo"
part = cmds.polyUnite(obj_list, ch=False, n=new_name)
cmds.sets(part, forceElement=sg)
cmds.parent(part, parent_grp)
for obj in cmds.ls(selection=True):
separate_obj(obj)
祝您工作愉快

