#!/usr/bin/env python # -*- coding: utf-8 -*- """ 版权所有: 深圳时光科技有限公司 联系方式: q.100@qq.com 创建日期: 2023/08/08 """ import maya.cmds as cmds def sg_meshe_detach(topology): """ 根据不同的拓扑类型分离模型 Args: topology: 拓扑类型 ('DAZG8F', 'DAZG8M', 'DAZG9', 'CC3') """ topology_map = { 'DAZG8F': sg_daz_g8f_detach, 'DAZG8M': sg_daz_g8m_detach, 'DAZG9': sg_daz_g9_detach, 'CC3': sg_cc3_detach } if topology in topology_map: topology_map[topology]() def sg_daz_g8f_detach(): """ 分离DAZ G8F模型的身体、头部、牙齿和眼睛 """ selection = cmds.ls(sl=True) if not selection: return shape_a = cmds.listRelatives(selection[0], s=True) # 定义边缘索引 edges_a = [ 52019,52021,53274,53278,54011,54013,54034,54037,54252,54256, 54289,54291,54600,54602,54624,54626,54648,54650,54674,54676, 54690,54692,54715,54717,54725,54727,57874,57881,58328,58330, 58363,58365,59260,59264,59265,59267,59307,59308,59311,59312, 59332,59344,59348,61354,61355,61385,61387,61395,61396,61397, 63352,63354,64601,64609,65323,65325,65344,65349,65561,65565, 65599,65601,65906,65908,65930,65932,65954,65956,65979,65981, 65995,65997,66024,66026,66033,66035,69124,69127,69540,69542, 69572,69574,70459,70464,70466,70467,70504,70505,70508,70509, 70530,70543,70549,72515,72516,72544,72546,72554,72560,72561 ] edges_b = [ 24644,24648,25049,25051,25127,25129,25139,25141,25144,25148, 25663,25665,25671,25673,25677,25683,25695,25697,25701,25705, 25798,25800,25814,25816,25822,25824,25828,25830,25847,25851, 26130,26132,27410,27412,27417,27419,28237,28243,28246,28248, 28250,28251,28304,28306,28604,28611,28996,28998,29066,29068, 29076,29078,29083,29089,29554,29556,29562,29564,29568,29572, 29586,29588,29590,29594,29688,29690,29706,29708,29714,29716, 29723,29725,29734,29738,30012,30014,31292,31294,31298,31300, 32066,32070,32076,32079,32080,32082,32137,32139 ] # 第一次分离 cmds.select(cl=True) for edge in edges_a: cmds.select(f"{selection[0]}.e[{edge}]", add=True) cmds.DetachComponent() cutting_a = cmds.polySeparate(shape_a[0], ch=False) # 处理牙齿 cmds.select(cl=True) for i in range(2, len(cutting_a)-4): cmds.select(cutting_a[i], add=True) cmds.polyUnite(n="DAZ_G8F_TeethA", ch=False) # 处理眼睛 cmds.select(cl=True) cmds.select([cutting_a[34], cutting_a[36]]) cmds.polyUnite(n="DAZ_G8F_EyeLeft", ch=False) cmds.select(cl=True) cmds.select([cutting_a[35], cutting_a[37]]) cmds.polyUnite(n="DAZ_G8F_EyeRight", ch=False) # 重命名主要部件 cmds.rename(cutting_a[0], "DAZ_G8F_Body") cmds.rename(cutting_a[1], "DAZ_G8F_HeadA") # 第二次分离(头部) shape_b = cmds.listRelatives("DAZ_G8F_HeadA", s=True) cmds.select(cl=True) for edge in edges_b: cmds.select(f"DAZ_G8F_HeadA.e[{edge}]", add=True) cmds.DetachComponent() cutting_b = cmds.polySeparate(shape_b[0], ch=False) # 合并牙齿 cmds.select(cl=True) cmds.select(["DAZ_G8F_TeethA", cutting_b[1]]) cmds.polyUnite(n="DAZ_G8F_Teeth", ch=False) cmds.rename(cutting_b[0], "DAZ_G8F_Head") # 将所有部件移到世界坐标系 for obj in ["DAZ_G8F_Body", "DAZ_G8F_Head", "DAZ_G8F_Teeth", "DAZ_G8F_EyeLeft", "DAZ_G8F_EyeRight"]: try: cmds.parent(obj, world=True) except: pass cmds.delete(selection[0]) def sg_daz_g8m_detach(): """ 分离DAZ G8M模型的身体、头部、牙齿和眼睛 """ selection = cmds.ls(sl=True) if not selection: return shape_a = cmds.listRelatives(selection[0], s=True) # 定义边缘索引 edges_a = [ 50883,50885,51704,51708,52433,52435,52456,52459,52674,52678, 56450,56452,56485,56487,57038,57042,57043,57045,57085,57086, 57089,57090,57110,57122,57126,58900,58901,58931,58933,58941, 58942,58943,60178,60180,60993,61001,61707,61709,61728,61733, 61945,61949,65640,65642,65672,65674,66223,66228,66230,66231, 66268,66269,66272,66273,66294,66307,66313,68047,68048,68076, 68078,68086,68092,68093,106855,106857,106902,106904,106926,106928, 106948,106950,106972,106974,106988,106990,107011,107013,107021,107023, 107058,107065,107647,107649,107689,107691,107713,107715,107736,107738, 107759,107761,107775,107777,107802,107804,107811,107813,107844,107847 ] edges_b = [ 24301,24396,24400,24801,24803,24879,24881,24891,24893,24896, 24900,25415,25417,25423,25425,25429,25435,25447,25449,25453, 25457,25550,25552,25566,25568,25574,25576,25580,25582,25599, 25603,25882,25884,27162,27164,27169,27171,27989,27995,27998, 28000,28002,28003,28056,28058,28265,28356,28363,28748,28750, 28818,28820,28828,28830,28835,28841,29306,29308,29314,29316, 29320,29324,29338,29340,29342,29346,29440,29442,29458,29460, 29466,29468,29475,29477,29486,29490,29764,29766,31044,31046, 31050,31052,31818,31822,31828,31831,31832,31834,31889,31891 ] # 第一次分离 cmds.select(cl=True) for edge in edges_a: cmds.select(f"{selection[0]}.e[{edge}]", add=True) cmds.DetachComponent() cutting_a = cmds.polySeparate(shape_a[0], ch=False) # 处理牙齿 cmds.select(cl=True) for i in range(1, len(cutting_a)-5): cmds.select(cutting_a[i], add=True) cmds.polyUnite(n="DAZ_G8M_TeethA", ch=False) # 处理眼睛 cmds.select(cl=True) cmds.select([cutting_a[34], cutting_a[36]]) cmds.polyUnite(n="DAZ_G8M_EyeLeft", ch=False) cmds.select(cl=True) cmds.select([cutting_a[35], cutting_a[37]]) cmds.polyUnite(n="DAZ_G8M_EyeRight", ch=False) # 重命名主要部件 cmds.rename(cutting_a[0], "DAZ_G8M_HeadA") cmds.rename(cutting_a[33], "DAZ_G8M_Body") # 第二次分离(头部) shape_b = cmds.listRelatives("DAZ_G8M_HeadA", s=True) cmds.select(cl=True) for edge in edges_b: cmds.select(f"DAZ_G8M_HeadA.e[{edge}]", add=True) cmds.DetachComponent() cutting_b = cmds.polySeparate(shape_b[0], ch=False) # 合并牙齿 cmds.select(cl=True) cmds.select(["DAZ_G8M_TeethA", cutting_b[1]]) cmds.polyUnite(n="DAZ_G8M_Teeth", ch=False) cmds.rename(cutting_b[0], "DAZ_G8M_Head") # 将所有部件移到世界坐标系 for obj in ["DAZ_G8M_Body", "DAZ_G8M_Head", "DAZ_G8M_Teeth", "DAZ_G8M_EyeLeft", "DAZ_G8M_EyeRight"]: try: cmds.parent(obj, world=True) except: pass cmds.delete(selection[0]) def sg_daz_g9_detach(): """ 分离DAZ G9模型的身体、头部和眼睛 """ selection = cmds.ls(sl=True) for sel in selection: shape_a = cmds.listRelatives(sel, s=True) vertex_count = cmds.polyEvaluate(shape_a[0], v=True) if vertex_count == 2120: # 处理眼睛 cutting_a = cmds.polySeparate(shape_a[0], ch=False) cmds.select(cl=True) cmds.select([cutting_a[0], cutting_a[2]]) cmds.polyUnite(n="DAZ_G9_EyeLeft", ch=False) cmds.select(cl=True) cmds.select([cutting_a[1], cutting_a[3]]) cmds.polyUnite(n="DAZ_G9_EyeRight", ch=False) for obj in ["DAZ_G9_EyeLeft", "DAZ_G9_EyeRight"]: try: cmds.parent(obj, world=True) except: pass elif vertex_count == 100676: # 处理身体和头部 edges_a = [ 168825,168827,168837,168839,168849,168851,168856,168860,168869,168873, # ... (其余边缘索引保持不变) ] cmds.select(cl=True) for edge in edges_a: cmds.select(f"{sel}.e[{edge}]", add=True) cmds.DetachComponent() cutting_a = cmds.polySeparate(shape_a[0], ch=False) cmds.rename(cutting_a[1], "DAZ_G9_Head") cmds.rename(cutting_a[0], "DAZ_G9_Body") for obj in ["DAZ_G9_Head", "DAZ_G9_Body"]: try: cmds.parent(obj, world=True) except: pass cmds.delete(sel) def sg_cc3_detach(): """ 分离CC3模型的身体、头部、睫毛和眼睛 """ selection = cmds.ls(sl=True) for sel in selection: shape_a = cmds.listRelatives(sel, s=True) vertex_count = cmds.polyEvaluate(shape_a[0], v=True) if vertex_count == 56412: edges_a = [ 34694,34698,35734,35738,35750,35752,36218,36222,36419,36425, # ... (其余边缘索引保持不变) ] cmds.select(cl=True) for edge in edges_a: cmds.select(f"{sel}.e[{edge}]", add=True) cmds.DetachComponent() cutting_a = cmds.polySeparate(shape_a[0], ch=False) # 合并头部 cmds.select(cl=True) for i in range(3): cmds.select(cutting_a[i], add=True) cmds.polyUnite(n="CC_Base_Head_Mesh", ch=False) # 合并睫毛 cmds.select(cl=True) for i in range(4, 8): cmds.select(cutting_a[i], add=True) cmds.polyUnite(n="CC_Base_Eyelash_Mesh", ch=False) cmds.rename(cutting_a[3], "CC_Base_Body_Mesh") cmds.parent("CC_Base_Body_Mesh", world=True) cmds.delete(sel) elif vertex_count == 2568: # 处理眼睛 cutting_a = cmds.polySeparate(shape_a[0], ch=False) cmds.select(cl=True) cmds.select([cutting_a[0], cutting_a[1]]) cmds.polyUnite(n="CC_Base_Eye_Right_Mesh", ch=False) cmds.select(cl=True) cmds.select([cutting_a[2], cutting_a[3]]) cmds.polyUnite(n="CC_Base_Eye_Left_Mesh", ch=False) # 如果直接运行此脚本 if __name__ == '__main__': pass