304 lines
10 KiB
Python
304 lines
10 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import maya.cmds as cmds
|
|
|
|
def mesh_detach(topology):
|
|
"""
|
|
根据不同的拓扑类型分离模型
|
|
Args:
|
|
topology: 拓扑类型 ('DAZG8F', 'DAZG8M', 'DAZG9', 'CC3')
|
|
"""
|
|
topology_map = {
|
|
'DAZG8F': daz_g8f_detach,
|
|
'DAZG8M': daz_g8m_detach,
|
|
'DAZG9': daz_g9_detach,
|
|
'CC3': cc3_detach
|
|
}
|
|
|
|
if topology in topology_map:
|
|
topology_map[topology]()
|
|
|
|
def 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 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 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 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 |