maya插件分享:重面检测器v0.2.1

 

 代码在最后,输入到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()

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值