代码在最后,输入到python窗口,执行就可以了。也可以整体拖动到工具架。
插件介绍:
第一个按钮,用于同一个mesh里的重合面检查,如果重合,会被选中标记出来,用户可手动进行删除。
ps:如何确认是重面,可选中模型,然后按3光滑显示,重面的显示和其他面是不一样的,如图所示
第二个按钮,是多模型选择重合的面,由于多模型可能存在位置偏移,所以加入了一个控制变量,默认是0.000001,一般无需改动设置,但是如果出现漏选,或者是多选,可以适当增加threshold的倍数。
制作第二个功能是因为网上下载的很多角色的模型,尤其是游戏模型,发片儿都是重合在一起的,手动选择删除实在是太累了,而且很多不是完全百分百重合,存在0.000001的位置偏移,完全用第一个按钮的算法并不能保证完全适用,所以加入了参数控制。
如图所示,执行完毕选中后,删除即可。记得一定要先把模型打散啊(separate)
# coding=utf-8
import maya.cmds as cmds
#定义函数获取模型的面的位置坐标
def getFacePosList(inputFaceList):
f_pos_List=[]
for i in inputFaceList:
vertex_position_tri = cmds.xform(i, ws=True, q=True, t=True)#查询元素的坐标
vList_len = len(vertex_position_tri)/3
v_position = [0, 0, 0]
for vpos in range(vList_len):
for index in range(3):
v_position[index]+=vertex_position_tri[0]
del vertex_position_tri[0]
f_pos = [v_position[0]/vList_len, v_position[1]/vList_len, v_position[2]/vList_len]
f_pos_List.append(f_pos)
return f_pos_List
def singleDBF_Selection():
obj_list = cmds.ls(sl=True)
new_list = cmds.filterExpand(obj_list,sm=12)
cmds.select(new_list[0]+'.f[:]', r=True)
face_list = cmds.filterExpand(sm=34)
fPlist=getFacePosList(face_list)
db_Face=[]
for index in range(fPlist.__len__()):
if fPlist.index(fPlist[index])!=index:
db_Face.append(index)
cmds.select(cl=True)
for i in db_Face:
cmds.select(face_list[i], tgl=True)
#------------------------单个模型重面检查结束---------------------------
#------------------------下面开始多个模型重面检查-----------------------
#心得:那个range(3)然后del [0]的代码还挺有意思的,这个以后可以多用
def multiMeshDBF_selection():
obj_list = cmds.ls(sl=True)
obj_list = cmds.filterExpand(obj_list,sm=12)
count = 0
all_facePL=[]
while count < obj_list.__len__():
#print(count)
faceList_A = obj_list[count] + '.f[:]'
faceList_A = cmds.filterExpand(faceList_A, sm=34)
fa_Po_Li_A = getFacePosList(faceList_A)
all_facePL.append(fa_Po_Li_A)
count += 1
#print(all_facePL)
db_mesh_listA = []
db_mesh_listB = []
skipList=[]
for i in range(all_facePL.__len__()):
for j in range(all_facePL.__len__()):
if i==j:
continue
elif i in skipList or j in skipList:
continue
else:
for k in all_facePL[i]:
for m in all_facePL[j]:
difValue=abs((sum(k)-sum(m))/3)
if difValue<detectThreshold:
db_mesh_listA.append(obj_list[i])
db_mesh_listB.append(obj_list[j])
skipList.append(i)
skipList.append(j)
cmds.select(db_mesh_listA)
detectThreshold = 0.00001
noteText="设定检测精度,默认是0.000001(小数点后五个零),如果出现漏选的情况可将数值适当提高,如果多选较严重,请适当降低数值。\n因为模型在文件传输以及放大缩小过程中,点位置会发现细微变化,导致检测需要阈值控制,个人测试在标准人体比例下当前数值适用情况较多。"
#写个小界面
if cmds.window("重合面选择器",ex=1)==1:
cmds.deleteUI("重合面选择器", window=True)
cmds.window("重合面选择器", t="重合面选择器v0.2.1", w=400)
cmds.columnLayout( columnAttach=('both', 40), rowSpacing=15, columnWidth=150,adj=1)
cmds.button(l="单模型选择重合的面", h=30, w=150, bgc=(0.16,0.16,0.16), c="singleDBF_Selection()")
cmds.button(l="多模型选择重合的模型", h=30, w=150, bgc=(0.16,0.16,0.16), c="multiMeshDBF_selection()")
cmds.floatFieldGrp( 'inputThreshold',
numberOfFields=1,
label='Threshold',
value1=0.000001,
adj=0,
cc="detectThreshold = cmds.floatFieldGrp('inputThreshold', q=1, v1=1)",
cl2=["left", "left"],
cat=([1,"both",5], [2,"both",5]),
cw2=[80,150],
pre=10)
cmds.text(label=noteText, align='left', w=380, ww=True, fn="fixedWidthFont")
cmds.showWindow()