Example #1
0
def SK_IKHandPivot():
    Lock = LockHideAttr(True,True,False,False)
    newcons = CreateControler()
    handIK = rig.ls('*Arm_Wrist_IK')
    
    if handIK:
        for ikcon in handIK:
            #增加旋转属性
            rig.addAttr(ikcon,at = 'float',ln = 'pivotIKRX',k = True)
            rig.addAttr(ikcon,at = 'float',ln = 'pivotIKRY',k = True)
            rig.addAttr(ikcon,at = 'float',ln = 'pivotIKRZ',k = True)
            
            
            val = rig.getAttr(ikcon+'.scaleVal')#获得缩放值
            newcons.setObjScale((val,val,val))
            con = newcons.SK_b01(ikcon+'_Pivot')
            jointFinger = ikcon[0:2]+'_mid2_jnt'#手指骨骼
            pos = rig.xform(jointFinger,q = True,t = True,ws = True)#旋转轴心点位置
            rig.xform(con,t = pos,ws = True)
            
            ikConChild = rig.listRelatives(ikcon,c = True,type = 'transform')#获得IK控制器下的物体
            
            rig.parent(con,ikcon)
            rig.makeIdentity(con,apply = True,t = True,s = True,r = True)
            rig.parent(ikConChild,con)  
            
            Switch = ikcon[0:2]+'Arm_Switch'
            rig.addAttr(Switch,at = 'enum',ln = 'pivotIK',en = 'OFF:ON:',k = False)
            rig.connectAttr(Switch+'.pivotIK',con+'.visibility')
            Lock.hideAndLockObj(con) 
            
            #连接旋转属性
            rig.connectAttr(ikcon+'.pivotIKRX',con+'.rx')
            rig.connectAttr(ikcon+'.pivotIKRY',con+'.ry')
            rig.connectAttr(ikcon+'.pivotIKRZ',con+'.rz')
Example #2
0
    def setupTeeth(self):
        allCons = []
        conGrps = []
        ConObj = CreateControler(
            13, (0.1 * self.scale, 0.1 * self.scale, 0.1 * self.scale))
        ConObj.signValue = 54861
        for i, jnt in enumerate(self.jnts):
            jntMat = rig.getAttr(jnt + '.worldMatrix')
            con = ConObj.SK_b08(jnt.split('_')[0] + '_M')
            allCons.append(con)
            rig.xform(con, ro=(90, 0, 0), wd=True)
            rig.makeIdentity(apply=True, r=True)
            rig.xform(con, m=jntMat)

            conGrp = CA.addGrp().grp(con, 'Freeze')
            conGrps.append(conGrp)

            rig.parentConstraint(con, jnt, mo=True)
            rig.scaleConstraint(con, jnt, mo=True)

        self.Connect.connect(self.grp, allCons)  #连接控制器属性
        newGrp = rig.group(conGrps, n=self.grp + '_CTRLGrp')
        rig.parent(newGrp, self.grp)

        #连接visibility属性
        Connect = CA.connectAttribute()
        Connect.sourceAttr = 'conVis'
        Connect.targetAttr = 'visibility'
        Connect.connect(self.grp,
                        [rig.listRelatives(con, p=True)[0] for con in allCons])
Example #3
0
def SK_AddJawSetup():

    if rig.objExists('head_jawLow_jnt'):
        obj = 'head_jawLow_jnt'
        unLock = unLockAttr(False,False,False)
        Lock = LockHideAttr(False,False,False,False)
        unLock.unLockObj(obj)
        print obj
        
#        创建控制器
        scaleVal = rig.getAttr('LfArm_Wrist_IK.scaleVal')
        controller = CreateControler(13,(4*scaleVal,4*scaleVal,4*scaleVal))
        con = controller.SK_b15('jaw_ctrl')
        conGrpA = rig.group(con,n = con+'_GRPA')
        conGrpB = rig.group(conGrpA,n = con+'_GRPB')
        rig.setAttr(conGrpB+'.ry',90)
        rig.makeIdentity(conGrpB,apply = True,s = True,r = True,t = True)
        
        mJaw = rig.getAttr(obj+'.worldMatrix')
        rig.xform(conGrpB,matrix = mJaw)
        
        rig.parent(conGrpB,'head_jnt')
        rig.orientConstraint(con,obj)
        Lock.hideAndLockObj(obj)
        Lock.hideAndLockObj(conGrpA)
        Lock.hideAndLockObj(conGrpB)
        Lock.hideInvertAttr(con,[u'rotateX', u'rotateY', u'rotateZ'])
Example #4
0
    def slideSinge(self, Text, sign='DEL'):
        WD = CreateControler(self.Color, (1, 1, -1))
        AR = WD.SK_b09(Text + '_M')
        ARGRP = rig.group(AR, n=AR + '_CON_GRP', r=True)
        rig.setAttr(ARGRP + '.sx', 0.08)
        rig.setAttr(ARGRP + '.sy', 0.08)
        rig.setAttr(ARGRP + '.sz', 0.08)
        rig.move(0, 0, 0.165959, AR + '.scalePivot', AR + '.rotatePivot')
        rig.setAttr(ARGRP + '.tz', -0.166)

        SQ = WD.SK_b13(Text + '_RANGE_SQ')
        SQGRP = rig.group(SQ, n=SQ + '_RANGE_GRP', r=True)
        rig.setAttr(SQGRP + '.sx', 0.08)
        rig.setAttr(SQGRP + '.sy', 0.08)
        rig.setAttr(SQGRP + '.sz', 0.337)
        rig.setAttr(SQGRP + '.tz', 0.674)

        TX = self.text(Text)
        TXGRP = rig.group(TX, n=TX + '_TEXT_GRP', r=True)
        rig.setAttr(TXGRP + '.sx', 0.08)
        rig.setAttr(TXGRP + '.sy', 0.08)
        rig.setAttr(TXGRP + '.sz', 0.08)

        if 'up' == sign:
            rig.setAttr(TXGRP + '.tz', 1.519)
        if 'dn' == sign:
            rig.setAttr(TXGRP + '.ry', 90)
            MinZ = rig.xform(TXGRP, q=True, bb=True, ws=True)[2]
            MaxZ = rig.xform(TXGRP, q=True, bb=True, ws=True)[5]
            TZ = ((MaxZ - MinZ) / -2) - 0.2
            rig.setAttr(TXGRP + '.tz', TZ)
        if 'lf' == sign:
            rig.setAttr(TXGRP + '.ry', 90)
            rig.xform(TXGRP,
                      t=[0.34603909286553236, 0.0, 0.67400000000000027],
                      wd=True)
        if 'rt' == sign:
            rig.setAttr(TXGRP + '.ry', 90)
            rig.xform(TXGRP,
                      t=[-0.33073309305179166, 0.0, 0.67400000000000027],
                      wd=True)

        partConGRP = rig.group(TXGRP, SQGRP, ARGRP, n=Text + '_WIDGE_GRP')
        rig.makeIdentity(partConGRP, apply=True, s=True, t=True, r=True)

        rig.transformLimits(AR, tz=(0, 1), etz=(1, 1))
        rig.setAttr(TXGRP + '.overrideEnabled', 1)
        rig.setAttr(TXGRP + '.overrideDisplayType', 2)
        rig.setAttr(SQGRP + '.template', 1)

        if 'DEL' == sign:
            rig.delete(TXGRP)

        return partConGRP, AR
Example #5
0
    def square(self, Text, sign=False):
        WD = CreateControler(self.Color, (1, 1, -1))
        AR = WD.SK_b13(Text + '_M')
        ARGRP = rig.group(AR, n=AR + '_CON_GRP', r=True)
        rig.makeIdentity(ARGRP, apply=True, t=True, s=True, r=True)
        if sign:
            ARShape = rig.listRelatives(AR, s=True)[0]
            rig.setAttr(ARShape + '.overrideEnabled', 0)
            rig.setAttr(AR + '.overrideEnabled', 1)
            rig.setAttr(AR + '.overrideDisplayType', 2)

        return ARGRP, AR
Example #6
0
 def __init__(self,eyeSign,tongueSign,faceSign,eyebrowSign,toothSign,face,signRun = True):
     self.eyeSn = eyeSign
     self.tongueSign = tongueSign
     self.faceSn = faceSign
     self.eyebrowSn = eyebrowSign
     self.toothSn = toothSign
     self.faceUI = face
     self.controller = CreateControler(13,[0.02,0.02,0.02])
     self.controller.signValue = 78
     self.positionInfo = {u'Lf_upLip_1_P': [[0.4577522202940788, -0.88940796081633167, 1.417898534744211], 22], u'Rt_upLip_1_P': [[-0.45775222778320313, -0.8894079327583313, 1.4178985357284546], 22], u'Lf_eyebrow_1_P': [[1.4552631170435382, 1.0109427040846835, 0.71208507180728153], 6], u'Lf_ear_P': [[1.6969779911728109, 0.30225545212855426, -0.83550711061509519], 22], u'Lf_eyebrow_3_P': [[0.83952074318038761, 1.2762483953898438, 1.3866029424173725], 6], u'Rt_upLip_2_P': [[-0.24067594110965729, -0.82347398996353149, 1.5329214334487915], 22], u'Rt_nose_P': [[-0.28455081582069397, -0.29319655895233154, 1.5947476625442505], 13], u'Lf_mouth_P': [[0.59368043681559712, -0.94644514607242525, 1.1507955018474469], 13], u'Rt_dnLip_1_P': [[-0.40149763226509094, -1.0502012968063354, 1.3711462020874023], 12], u'Rt_eyebrow_1_P': [[-1.4552631378173828, 1.0109426975250244, 0.7120850682258606], 6], u'Lf_dnLip_2_P': [[0.21610563619760767, -1.0877709665250357, 1.5105537251473589], 12], u'Lf_eyebrow_4_P': [[0.36489604932817388, 1.1127071207027288, 1.5045110865908411], 6], u'Rt_dnEyelid_3_P': [[-0.97799999999999998, 0.60090496740722077, 1.0512626650116561], 10], u'Lf_dnEyelid_2_P': [[0.80561238526187084, 0.56115445658376806, 1.1145096040896882], 10], u'Lf_dnEyelid_3_P': [[0.97829695568744968, 0.60090496740722077, 1.0512626650116561], 10], u'Lf_pull_P': [[1.1940568236640083, -0.74121844106321233, 0.60184938648410746], 6], u'Lf_dnLip_1_P': [[0.40149764130798138, -1.0502013047415499, 1.3711461657738258], 12], u'Rt_eyebrow_4_P': [[-0.36489605903625488, 1.1127071380615234, 1.5045111179351807], 6], u'Rt_eyebrow_3_P': [[-0.83952075242996216, 1.2762483358383179, 1.3866029977798462], 6], u'Mid_dnLip_P': [[0.0, -1.0725690595054045, 1.5188097774357625], 12], u'Rt_canthusOut_P': [[-1.1433006525039673, 0.70208227634429932, 0.92102342844009399], 13], u'Mid_base_P': [[0.0, 0.0, 0.0], 16],u'Rt_upEyelid_3_P': [[-0.98499999999999999, 0.81146603544601237, 1.0737908090959429], 22], u'Lf_eyebrow_2_P': [[1.2554887462609086, 1.2242805206272087, 1.0934283695974849], 6], u'Lf_canthusIn_P': [[0.43909954407376683, 0.6311377754074402, 1.0586760528711641], 13], u'Rt_ear_P': [[-1.696977972984314, 0.30225545167922974, -0.8355070948600769], 22], u'Rt_upEyelid_2_P': [[-0.76296061277389526, 0.84621930122375488, 1.1415883302688599], 22], u'Lf_cheekbone_P': [[1.2649382178275159, -0.13004048109449998, 0.95846824899201755], 22], u'Rt_dnLip_2_P': [[-0.21610563993453979, -1.087770938873291, 1.5105537176132202], 12], u'Lf_canthusOut_P': [[1.1433007061180056, 0.70208226194515522, 0.92102340618126766], 13], u'Rt_cheekbone_P': [[-1.2649382352828979, -0.1300404816865921, 0.95846825838088989], 22], u'Rt_upEyelid_1_P': [[-0.58767658472061157, 0.79538941383361816, 1.1090470552444458], 22], u'Lf_nose_P': [[0.28455081409851524, -0.2931965624518485, 1.594747668867244], 13], u'Lf_upLip_2_P': [[0.24067594423116645, -0.82347398074313027, 1.5329214512325766], 22], u'Rt_eyebrow_2_P': [[-1.2554887533187866, 1.2242804765701294, 1.093428373336792], 6], u'Lf_dnEyelid_1_P': [[0.59532230907410022, 0.58211628344290467, 1.0920294918149343], 10], u'Lf_upEyelid_1_P': [[0.58767656543479574, 0.79538939863679392, 1.1090470759223556], 22], u'Rt_canthusIn_P': [[-0.43909955024719238, 0.63113778829574585, 1.05867600440979], 13], u'Rt_dnEyelid_2_P': [[-0.80561238527297974, 0.56115448474884033, 1.1145095825195312], 10], u'Rt_dnEyelid_1_P': [[-0.59532231092453003, 0.58211630582809448, 1.0920294523239136], 10], u'Mid_upLip_P': [[0.0, -0.79989685162339896, 1.5986444439336869], 22], u'Rt_pull_P': [[-1.1940568685531616, -0.7412184476852417, 0.60184937715530396], 6], u'Lf_upEyelid_3_P': [[0.98455660606281059, 0.81146603544601237, 1.0737908090959429], 22], u'Mid_nose_P': [[0.0, -0.1841173100719343, 1.8619454284092736], 22], u'Lf_upEyelid_2_P': [[0.76296061594693798, 0.84621928539927671, 1.1415883252920129], 22], u'Rt_mouth_P': [[-0.59368044137954712, -0.94644516706466675, 1.1507954597473145], 13]}
     self.eyebrowPosInfo = {u'Lf_ebw_2_P': [[1.2539269262641821, 1.446814944148378, 1.0537070623711431], 13], u'Lf_ebw_1_P': [[1.4084910234031645, 1.3076079841558128, 0.80211524813419777], 13], u'Rt_ebw_4_P': [[-0.64794783800161104, 1.4254101271982282, 1.4431839608606198], 13], u'Lf_ebw_3_P': [[1.0037106276394581, 1.4898388225433679, 1.2718257991365869], 13], u'Lf_ebw_4_P': [[0.64794783800161104, 1.4254101271982282, 1.4431839608606198], 13], u'Rt_ebw_2_P': [[-1.2539269262641821, 1.446814944148378, 1.0537070623711431], 13], u'Rt_ebw_1_P': [[-1.4084910234031645, 1.3076079841558128, 0.80211524813419777], 13], u'Rt_ebw_3_P': [[-1.0037106276394581, 1.4898388225433679, 1.2718257991365869], 13]}
     if signRun:
         self.combine()
Example #7
0
def SK_SKTOCON(objs):
    Con = CreateControler(13)
    N = len(objs)
    for i, obj in enumerate(objs):
        M = getAttr(obj + '.worldMatrix')

        conName = Con.SK_b08(obj.replace(obj.split('_')[-1], str(i) + '_M'))
        setAttr(conName + '.rz', 90)
        makeIdentity(conName, apply=True, s=True, r=True, t=True)
        conGrp = group(conName, n=conName + '_GRP')
        xform(conGrp, matrix=M)
        parentConstraint(conName, obj, mo=True)

        if 0 != i:
            parent(conGrp, obj.replace(obj.split('_')[-1], str(i - 1) + '_M'))
Example #8
0
 def createFaceCon(self):
     controller = CreateControler(13)
     controlName = controller.SK_b08('Face_Con')
     rig.addAttr('Face_ConShape',dt = 'string',ln = 'headFOL')
     rig.addAttr('Face_ConShape',dt = 'string',ln = 'headSKIN')
     rig.addAttr('Face_ConShape',dt = 'string',ln = 'eyeLeft')
     rig.addAttr('Face_ConShape',dt = 'string',ln = 'eyeRight')
     rig.addAttr('Face_ConShape',dt = 'string',ln = 'upTooth')
     rig.addAttr('Face_ConShape',dt = 'string',ln = 'dnTooth')
     rig.addAttr('Face_ConShape',dt = 'string',ln = 'eyebrowLeft')
     rig.addAttr('Face_ConShape',dt = 'string',ln = 'eyebrowRight')
     rig.addAttr('Face_ConShape',dt = 'string',ln = 'tongue')
     rig.addAttr( controlName, ln='scaleValue',at = 'double')
     rig.setAttr(controlName+'.rx',90)
     rig.makeIdentity(controlName,apply = True,t = True,r = True,s = True)
     return controlName
Example #9
0
def addUpDnEyelid():
    Lock = LockHideAttr(False,False,False,False)
    SV = rig.getAttr('Face_Scale_Grp.scaleVal')
    controller = CreateControler(13,[0.06*SV,0.06*SV,0.06*SV])
    
    def modiUpDnEyelid(prefix ,SV,controller,RtV = 1):
        UpDnSign = False
        controller.setColor(13)
        if('_dn' in prefix):
            UpDnSign = True
            controller.setColor(22)
        
        Lf_up_Cons = [prefix+'Eyelid_1_M', prefix+'Eyelid_3_M']
        NewCon = rig.group(controller.SK_b14(prefix+'Eyelid_M'),n = prefix+'Eyelid_M_GRP')
        rig.setAttr(NewCon+'.tz',0.05*SV)
        rig.setAttr(NewCon+'.rx',90)
        if UpDnSign:
           rig.setAttr(NewCon+'.sy',-1) 
        rig.makeIdentity(NewCon,apply = True,r = True,t = True) 
        rig.setAttr(prefix+'Eyelid_M.sign',73)
        rig.connectAttr('Jaw_M.vis_second',NewCon+'.visibility')
        M = rig.getAttr(prefix+'Eyelid_1_M.worldMatrix')
        rig.xform(NewCon,matrix = M)
        rig.parent(NewCon,'Face_Rigging_GRP')
        rig.pointConstraint(Lf_up_Cons[0].replace('_1_M','_2_P_FOL'),NewCon)
        rig.hide(Lf_up_Cons[0].replace('_1_M','_2_M'))
        
        
        Lf_up_MD = rig.createNode('multiplyDivide',n = Lf_up_Cons[0].replace('_1_M','MD'),ss = True)
        rig.setAttr(Lf_up_MD+'.input2X',0.5)
        rig.setAttr(Lf_up_MD+'.input2Y',0.5)
        rig.setAttr(Lf_up_MD+'.input2Z',0.5)
        rig.connectAttr(prefix+'Eyelid_M.translate',Lf_up_MD+'.input1')
        for i,con in enumerate(Lf_up_Cons):
            sign = -1*RtV
            if (1 == i):
                sign = 1*RtV
                
            PMA = rig.createNode('plusMinusAverage',n = con+'_PMA',ss = True)
            rig.connectAttr(Lf_up_MD+'.output',PMA+'.input3D[0]')        
            rig.connectAttr(PMA+'.output3D',con+'_GRP.translate')
            
            RV = rig.createNode('remapValue',n = con+'_RV',ss = True)
            rig.setAttr(RV+'.inputMin',-30)
            rig.setAttr(RV+'.inputMax',30)
            rig.setAttr(RV+'.outputMin',-0.08*sign*SV)
            rig.setAttr(RV+'.outputMax',0.08*sign*SV)
            rig.connectAttr(prefix+'Eyelid_M.rz',RV+'.inputValue')
            rig.connectAttr(RV+'.outValue',PMA+'.input3D[1].input3Dy')
        Lock.hideInvertAttr(prefix+'Eyelid_M',('translateY','translateX','translateZ','rotateZ'))
        rig.transformLimits(prefix+'Eyelid_M',rz = (-30,30),erz = (1,1))    
        return NewCon
    
    AllControlGrp = []    
    AllControlGrp.append(modiUpDnEyelid('Lf_up',SV,controller))
    AllControlGrp.append(modiUpDnEyelid('Rt_up',SV,controller,-1))
    AllControlGrp.append(modiUpDnEyelid('Lf_dn',SV,controller))
    AllControlGrp.append(modiUpDnEyelid('Rt_dn',SV,controller,-1))
    GRP = rig.group(AllControlGrp,n = 'AddUpDnLid_GRP')
Example #10
0
 def __init__(self):
     self.controller = CreateControler()
     self.grp = 'Eye_Control_GRP'
     self.ctrlName = 'Eye_M'
     self.num = 3
     self.conPos = [
         (0.0, 16.623626770105922, 4.1056612661848035),
         (0.47205042927365248, 16.623626770105922, 4.1056612661848035),
         (-0.47205042927365248, 16.623626770105922, 4.1056612661848035)
     ]
     self.jointPos = [
         ([0, 16.600944519043441, 1.3624849915501727]),
         (0.47289100288351393, 16.600944519043441, 1.3624849915501727),
         (-0.47289100288351393, 16.600944519043441, 1.3624849915501727)
     ]
     self.Lf_LidPos = [[
         0.51449495125093525, 16.614712948647536, 1.6282982423800447
     ], [0.51446175243023684, 16.524417626257684, 1.6211440872455507]]
     self.Rt_LidPos = [[
         -0.51449495125093525, 16.614712948647536, 1.6282982423800447
     ], [-0.51446175243023684, 16.524417626257684, 1.6211440872455507]]
Example #11
0
def ModifyControllerColorAndShape():
    exSphere = [u'Lf_canthusOut_M', u'Lf_canthusIn_M', u'Rt_canthusIn_M', u'Rt_canthusOut_M', u'Lf_mouth_M', u'Rt_mouth_M']#球形控制器
    SV = rig.getAttr('Face_Scale_Grp.scaleVal')
    controller = CreateControler(13,[0.05*SV,0.05*SV,0.05*SV])
    cons = rig.listConnections('Face_Scale_Grp.signA',s = False,d = True)
    for con in cons:
        conColor = 13 #控制器默认颜色
        if ('_dnEyelid_' in con) or ('_dnLip_' in con):
            conColor = 22
        
        controller.setColor(conColor)
        if con in exSphere:
            NewCon = controller.SK_b03('TemName_Controllers')
        else:
            NewCon = controller.SK_b08('TemName_Controllers') #新控制器默认形状
        

                   
        conShape = rig.listRelatives(con,s = True)
        rig.delete(conShape)
        NewConShape = rig.listRelatives(NewCon,s = True)[0]
        rig.rename(NewConShape,conShape)
        rig.setAttr(NewCon+'.tz',0.05*SV)
        rig.setAttr(NewCon+'.rx',90)
        rig.makeIdentity(NewCon,apply = True,r = True,t = True) 
        rig.parent(conShape,con,add = True,s = True)
        rig.delete(NewCon)
Example #12
0
    def createController(self):
        if not rig.attributeQuery('sign', node=self.ployName, ex=True):
            rig.addAttr(self.ployName, ln='sign', at='long', dv=7648)
#----------------------------------------------------------------------- 得到控制器颜色
        conColor = 13
        if 1 == self.color:
            conColor = 13
        if 2 == self.color:
            conColor = 17
        if 3 == self.color:
            conColor = 15

        SMCON = CreateControler(conColor, (self.size, self.size, self.size))
        for i in range(self.start, self.start + self.col * self.row):
            if 1 == self.shape:
                con = SMCON.SK_b03(self.conPre + '_' + str(i) + '_P')
            if 2 == self.shape:
                con = SMCON.SK_b01(self.conPre + '_' + str(i) + '_P')
            if 3 == self.shape:
                con = SMCON.SK_b05(self.conPre + '_' + str(i) + '_P')

            rig.connectAttr(self.ployName + '.sign', con + '.sign')
Example #13
0
 def setupTongue(self):
     #对骨骼校正轴向
     oj = 'zyx'
     secondaryAxisOrient = 'yup'
     orientJoints = [jnt for jnt in self.jnts]#排除不需要校正轴向的骨骼
     for jnt in orientJoints:
         rig.joint(jnt,e = True, oj = oj, secondaryAxisOrient = secondaryAxisOrient, ch = False, zso = True)
     rig.joint(self.jnts[-1],e = True, oj = 'none', ch = False, zso = True)
     
     
     #生成控制器并增加父子约束
     allCons = []
     preCon  = ''
     ConObj = CreateControler(13, (0.1*self.scale, 0.1*self.scale, 0.1*self.scale))
     ConObj.signValue = 32547
     for i,jnt in enumerate(self.jnts):
         jntMat = rig.getAttr(jnt+'.worldMatrix')
         con = ConObj.SK_b08(jnt.split('_')[0]+'_'+str(i)+'M')
         allCons.append(con)
         rig.xform(con, ro = (90, 0, 0), wd = True)
         rig.makeIdentity(apply = True, r = True)
         rig.xform(con, m = jntMat)
         
         conGrp = CA.addGrp().grp(con, 'Freeze')
         if i != 0:
             rig.parent(conGrp, preCon)
         preCon = con
         
         rig.parentConstraint(con, jnt, mo = True)
     
     self.Connect.connect(self.grp, allCons)#连接控制器属性
     
     #连接visibility属性
     self.Connect.sourceAttr = 'conVis'
     self.Connect.targetAttr = 'visibility'
     self.Connect.connect(self.grp, [rig.listRelatives(con, p = True)[0] for con in allCons])
Example #14
0
class FC_ControlPosition(object):
    def __init__(self,eyeSign,tongueSign,faceSign,eyebrowSign,toothSign,face,signRun = True):
        self.eyeSn = eyeSign
        self.tongueSign = tongueSign
        self.faceSn = faceSign
        self.eyebrowSn = eyebrowSign
        self.toothSn = toothSign
        self.faceUI = face
        self.controller = CreateControler(13,[0.02,0.02,0.02])
        self.controller.signValue = 78
        self.positionInfo = {u'Lf_upLip_1_P': [[0.4577522202940788, -0.88940796081633167, 1.417898534744211], 22], u'Rt_upLip_1_P': [[-0.45775222778320313, -0.8894079327583313, 1.4178985357284546], 22], u'Lf_eyebrow_1_P': [[1.4552631170435382, 1.0109427040846835, 0.71208507180728153], 6], u'Lf_ear_P': [[1.6969779911728109, 0.30225545212855426, -0.83550711061509519], 22], u'Lf_eyebrow_3_P': [[0.83952074318038761, 1.2762483953898438, 1.3866029424173725], 6], u'Rt_upLip_2_P': [[-0.24067594110965729, -0.82347398996353149, 1.5329214334487915], 22], u'Rt_nose_P': [[-0.28455081582069397, -0.29319655895233154, 1.5947476625442505], 13], u'Lf_mouth_P': [[0.59368043681559712, -0.94644514607242525, 1.1507955018474469], 13], u'Rt_dnLip_1_P': [[-0.40149763226509094, -1.0502012968063354, 1.3711462020874023], 12], u'Rt_eyebrow_1_P': [[-1.4552631378173828, 1.0109426975250244, 0.7120850682258606], 6], u'Lf_dnLip_2_P': [[0.21610563619760767, -1.0877709665250357, 1.5105537251473589], 12], u'Lf_eyebrow_4_P': [[0.36489604932817388, 1.1127071207027288, 1.5045110865908411], 6], u'Rt_dnEyelid_3_P': [[-0.97799999999999998, 0.60090496740722077, 1.0512626650116561], 10], u'Lf_dnEyelid_2_P': [[0.80561238526187084, 0.56115445658376806, 1.1145096040896882], 10], u'Lf_dnEyelid_3_P': [[0.97829695568744968, 0.60090496740722077, 1.0512626650116561], 10], u'Lf_pull_P': [[1.1940568236640083, -0.74121844106321233, 0.60184938648410746], 6], u'Lf_dnLip_1_P': [[0.40149764130798138, -1.0502013047415499, 1.3711461657738258], 12], u'Rt_eyebrow_4_P': [[-0.36489605903625488, 1.1127071380615234, 1.5045111179351807], 6], u'Rt_eyebrow_3_P': [[-0.83952075242996216, 1.2762483358383179, 1.3866029977798462], 6], u'Mid_dnLip_P': [[0.0, -1.0725690595054045, 1.5188097774357625], 12], u'Rt_canthusOut_P': [[-1.1433006525039673, 0.70208227634429932, 0.92102342844009399], 13], u'Mid_base_P': [[0.0, 0.0, 0.0], 16],u'Rt_upEyelid_3_P': [[-0.98499999999999999, 0.81146603544601237, 1.0737908090959429], 22], u'Lf_eyebrow_2_P': [[1.2554887462609086, 1.2242805206272087, 1.0934283695974849], 6], u'Lf_canthusIn_P': [[0.43909954407376683, 0.6311377754074402, 1.0586760528711641], 13], u'Rt_ear_P': [[-1.696977972984314, 0.30225545167922974, -0.8355070948600769], 22], u'Rt_upEyelid_2_P': [[-0.76296061277389526, 0.84621930122375488, 1.1415883302688599], 22], u'Lf_cheekbone_P': [[1.2649382178275159, -0.13004048109449998, 0.95846824899201755], 22], u'Rt_dnLip_2_P': [[-0.21610563993453979, -1.087770938873291, 1.5105537176132202], 12], u'Lf_canthusOut_P': [[1.1433007061180056, 0.70208226194515522, 0.92102340618126766], 13], u'Rt_cheekbone_P': [[-1.2649382352828979, -0.1300404816865921, 0.95846825838088989], 22], u'Rt_upEyelid_1_P': [[-0.58767658472061157, 0.79538941383361816, 1.1090470552444458], 22], u'Lf_nose_P': [[0.28455081409851524, -0.2931965624518485, 1.594747668867244], 13], u'Lf_upLip_2_P': [[0.24067594423116645, -0.82347398074313027, 1.5329214512325766], 22], u'Rt_eyebrow_2_P': [[-1.2554887533187866, 1.2242804765701294, 1.093428373336792], 6], u'Lf_dnEyelid_1_P': [[0.59532230907410022, 0.58211628344290467, 1.0920294918149343], 10], u'Lf_upEyelid_1_P': [[0.58767656543479574, 0.79538939863679392, 1.1090470759223556], 22], u'Rt_canthusIn_P': [[-0.43909955024719238, 0.63113778829574585, 1.05867600440979], 13], u'Rt_dnEyelid_2_P': [[-0.80561238527297974, 0.56115448474884033, 1.1145095825195312], 10], u'Rt_dnEyelid_1_P': [[-0.59532231092453003, 0.58211630582809448, 1.0920294523239136], 10], u'Mid_upLip_P': [[0.0, -0.79989685162339896, 1.5986444439336869], 22], u'Rt_pull_P': [[-1.1940568685531616, -0.7412184476852417, 0.60184937715530396], 6], u'Lf_upEyelid_3_P': [[0.98455660606281059, 0.81146603544601237, 1.0737908090959429], 22], u'Mid_nose_P': [[0.0, -0.1841173100719343, 1.8619454284092736], 22], u'Lf_upEyelid_2_P': [[0.76296061594693798, 0.84621928539927671, 1.1415883252920129], 22], u'Rt_mouth_P': [[-0.59368044137954712, -0.94644516706466675, 1.1507954597473145], 13]}
        self.eyebrowPosInfo = {u'Lf_ebw_2_P': [[1.2539269262641821, 1.446814944148378, 1.0537070623711431], 13], u'Lf_ebw_1_P': [[1.4084910234031645, 1.3076079841558128, 0.80211524813419777], 13], u'Rt_ebw_4_P': [[-0.64794783800161104, 1.4254101271982282, 1.4431839608606198], 13], u'Lf_ebw_3_P': [[1.0037106276394581, 1.4898388225433679, 1.2718257991365869], 13], u'Lf_ebw_4_P': [[0.64794783800161104, 1.4254101271982282, 1.4431839608606198], 13], u'Rt_ebw_2_P': [[-1.2539269262641821, 1.446814944148378, 1.0537070623711431], 13], u'Rt_ebw_1_P': [[-1.4084910234031645, 1.3076079841558128, 0.80211524813419777], 13], u'Rt_ebw_3_P': [[-1.0037106276394581, 1.4898388225433679, 1.2718257991365869], 13]}
        if signRun:
            self.combine()
        
    def getPosition(self,controllers = []):
        positionDictData = dict([(obj,[rig.xform(obj,q = True,t = True,ws = True),rig.getAttr((rig.listRelatives(obj,s = True)[0])+'.overrideColor')])for obj in controllers ])
        return positionDictData
    
    def creatController(self,dictData):
        for eachControl in dictData:
            controlValue = dictData[eachControl]
            self.controller.setColor(int(controlValue[1]))
            controlName = self.controller.SK_b03(eachControl)
            rig.xform(controlName,t = controlValue[0],ws = True)
            
    def lockHideConnectCon(self,dictData):
        locks = LockHideAttr(1,0,0,0)
        for eachControl in dictData:
#  连接位移值
            if('Lf' == eachControl.split('_')[0]):
                RtConName = eachControl.replace('Lf','Rt')
                if(rig.objExists(RtConName)):
                    conNode = rig.createNode('multiplyDivide',n = eachControl+'_MD',ss = True)
                    rig.setAttr(conNode+'.input2X',-1)
                    rig.connectAttr(eachControl+'.translate',conNode+'.input1')
                    rig.connectAttr(conNode+'.output',RtConName+'.translate')
#   锁定translatex                             
            if ('Mid' == eachControl.split('_')[0]):
                rig.setAttr(eachControl+'.tx',cb = False,k = False,l = True)
#   锁定隐藏属性            
            locks.hideAndLockObj(eachControl)
            
    def createFaceCon(self):
        controller = CreateControler(13)
        controlName = controller.SK_b08('Face_Con')
        rig.addAttr('Face_ConShape',dt = 'string',ln = 'headFOL')
        rig.addAttr('Face_ConShape',dt = 'string',ln = 'headSKIN')
        rig.addAttr('Face_ConShape',dt = 'string',ln = 'eyeLeft')
        rig.addAttr('Face_ConShape',dt = 'string',ln = 'eyeRight')
        rig.addAttr('Face_ConShape',dt = 'string',ln = 'upTooth')
        rig.addAttr('Face_ConShape',dt = 'string',ln = 'dnTooth')
        rig.addAttr('Face_ConShape',dt = 'string',ln = 'eyebrowLeft')
        rig.addAttr('Face_ConShape',dt = 'string',ln = 'eyebrowRight')
        rig.addAttr('Face_ConShape',dt = 'string',ln = 'tongue')
        rig.addAttr( controlName, ln='scaleValue',at = 'double')
        rig.setAttr(controlName+'.rx',90)
        rig.makeIdentity(controlName,apply = True,t = True,r = True,s = True)
        return controlName
    
    
    def creatJawjoint(self):
        jntNames = [u'JawTip_JNT_P', u'Jaw_JNT_P', u'HeadRoot_JNT_P']
        jntPos = [[-1.9721522630525295e-031, -1.6991611811361911, 1.2772460195315276], [-1.9721522630525295e-031, -0.24193316678545695, -0.71455524677275717], [0.0, -3.877232277010112, -1.9775230127662995]] 
        for i,jnt in enumerate(jntNames):
            rig.select(cl = True)
            curJNT = rig.joint(n = jnt)
            rig.xform(curJNT,t = jntPos[i],ws = True)
        rig.parent('JawTip_JNT_P','Jaw_JNT_P')
        rig.parent('Jaw_JNT_P','HeadRoot_JNT_P')
        rig.parent('HeadRoot_JNT_P',self.FaceCon)
        
        self.controller.setColor(17)
        self.controller.signValue = 73
        jawCon = self.controller.SK_b03('Jaw_M') 
        rig.xform(jawCon,matrix = [11.093766471162281, 0.0, 0.0, 0.0, 0.0, 11.093766471162281, 0.0, 0.0, 0.0, 0.0, 11.093766471162281, 0.0, 0.0, -1.9479364224911047, 1.5001411259496222, 1.0])           
        rig.parent(jawCon,self.FaceCon)    
        rig.makeIdentity(jawCon,apply = True,s = True,r = True,t = True)
        
    def addEyebrow(self,sign):
        if sign:
            self.controller.signValue = 71
            self.creatController(self.eyebrowPosInfo)
            self.lockHideConnectCon(self.eyebrowPosInfo)        
            rig.parent(self.eyebrowPosInfo.keys(),self.grpName)

        
    def addMainController(self):
        self.creatController(self.positionInfo)
        self.lockHideConnectCon(self.positionInfo)
        rig.parent(self.positionInfo.keys(),self.grpName)
        
    def addEye(self,sign):
        if sign:
            LfJnt = rig.joint(n = 'Lf_EYE_JNT_P')
            rig.xform(LfJnt,t = [0.76887053415707951, 0.76097599414167427, 0.62705611174469811],ws = True)
            RtJnt = rig.joint(n = 'Rt_EYE_JNT_P')
            rig.xform(RtJnt,t = [-0.76887053415707951, 0.76097599414167427, 0.62705611174469811],ws = True)
            rig.parent(LfJnt,RtJnt,self.FaceCon)
            
            
            self.controller.setObjScale((1,1,1))
            self.controller.setColor(6)
            self.controller.signValue = 73
            eyeAllCon = self.controller.SK_b08('eye_M')
            rig.xform(eyeAllCon,matrix = [0.98195796671303204, 0.0, 0.0, 0.0, 0.0, 2.1803846877178224e-016, 0.98195796671303204, 0.0, 0.0, -0.4017168114352116, 8.9199050686874858e-017, 0.0, 0.0, 0.74691933784829889, 5.0041701361715383, 1.0])
            LfEyeCon = self.controller.SK_b08('Lf_eye_M')
            rig.xform(LfEyeCon,matrix = [0.27600951299477411, 0.0, 0.0, 0.0, 0.0, 6.1286423268474912e-017, 0.27600951299477416, 0.0, 0.0, -0.27600951299477416, 6.1286423268474912e-017, 0.0, 0.76756054849076027, 0.74691933784829911, 5.0041701361715401, 1.0])
            RtEyeCon = self.controller.SK_b08('Rt_eye_M')
            rig.xform(RtEyeCon,matrix = [-0.27600951299477411, 0.0, 0.0, 0.0, 0.0, 6.1286423268474912e-017, 0.27600951299477416, 0.0, 0.0, -0.27600951299477416, 6.1286423268474912e-017, 0.0, -0.76756054849076027, 0.74691933784829911, 5.0041701361715401, 1.0])
            rig.parent(LfEyeCon,RtEyeCon,eyeAllCon)
            rig.parent(eyeAllCon,self.grpName)
            rig.makeIdentity(eyeAllCon,apply = True,s = True,r = True,t = True)
            
    def addTongue(self,sign):
        if sign:
            jnts = [u'Tongue_1_JNT_P', u'Tongue_2_JNT_P', u'Tongue_3_JNT_P', u'Tongue_4_JNT_P', u'Tongue_5_JNT_P'] 
            jntPos = [[-2.4074124304840448e-034, -1.1828907427397966, 0.39945317842483419], [-1.9352787993130288e-019, -1.0414296961573679, 0.547367817822622], [-1.9352787993136451e-019, -0.98892292574879703, 0.74994385199198321], [-1.9352787993136451e-019, -1.0101921438931105, 0.98285235913741198], [-1.9352787993130904e-019, -1.1000491650967648, 1.1555898993095108]]
            rig.select(cl = True)
            for i,jnt in enumerate(jnts):
                curJnt = rig.joint(n = jnt)
                rig.xform(curJnt,t = jntPos[i],ws = True)
            rig.select(cl = True)
            rig.parent('Tongue_1_JNT_P',self.FaceCon)
            
            self.controller.setColor(13)
            self.controller.signValue = 73
            tongueCon = self.controller.SK_b03('Tongue_M') 
            rig.xform(tongueCon,matrix = [0.06444328794870588, 0.0, 0.0, 0.0, 0.0, 0.06444328794870588, 0.0, 0.0, 0.0, 0.0, 0.06444328794870588, 0.0, 0.0, -1.3071946345318575, 1.650696183174968, 1.0] )           
            rig.parent(tongueCon,self.FaceCon)    
            rig.makeIdentity(tongueCon,apply = True,s = True,r = True,t = True)
    def addTooth(self,sign):
        if sign:
            rig.select(cl = True)
            UpTooth = rig.joint(n = 'UpTooth_JNT_P')
            rig.xform(UpTooth,t = [0.0, -0.67428806973770494, 0.83475947289697605],ws = True)
            rig.select(cl = True)
            DnTooth = rig.joint(n = 'DnTooth_JNT_P')
            rig.xform(DnTooth,t = [0.0, -1.1574310052199537, 0.74481897781780426],ws = True)
            rig.parent(UpTooth,DnTooth,self.FaceCon)
                            
    def addFaceUI(self,sign):
        if sign:
            faceCon = faceCoustom()
            signStr = rig.textField(self.faceUI.bsFaceTF,q = True,tx = True)
            if signStr:
                strShape = signStr.split(' ')
                faceCon.extraE = strShape
            faceGrp = faceCon.merging()
            con = rig.group(faceGrp,n = 'Face_ALL_M_CON_GRP')
            rig.xform(con,ro = (-90,-180,0),wd = True)
            rig.xform(con,t = (-1.538,0,-4.267),wd = True)            
            
            
            
    def combine(self):
        self.FaceCon = self.createFaceCon()
        self.grpName = rig.group(n = 'face_Postion',empty = True)
        
        self.addMainController()
        self.addEyebrow(self.eyebrowSn)
        rig.parent(self.grpName,self.FaceCon)
        self.creatJawjoint()
        self.addEye(self.eyeSn)
        self.addTongue(self.tongueSign)
        self.addTooth(self.toothSn)
        self.addFaceUI(self.faceSn)
Example #15
0
def SK_FollicleControl(cons,multiple = 3,SV = 1,conPrefix = 'Lf_eyeBrow',nurbsMesh = 'Lf_eyeBrow_Loft',FaceFolScale = 'Face_Sclale_Grp'):
#    nurbsMesh  nurbs名字
#    conPrefix   控制器名字
#    FaceFolScale  毛囊缩放组
#    multiple    次级毛囊缩放组
#     SV          缩放值
    TR = 0.1*SV
    conSize = 1*SV
    tempCurves = []
    FOLs = []
    NewCons = [] #生成的新的控制器
    MainJnts = [] #主控蒙皮骨骼
    SeJnts = []   #次控蒙皮骨骼
    MainController = CreateControler(13,(conSize*0.1,conSize*0.1,conSize*0.1))
    
    #创建曲线上传Nurbs片
    for con in cons:
        emptyGrp = rig.group(n = con+'_EM_GRP',empty = True)
        rig.parent(emptyGrp,con)
        rig.xform(emptyGrp,ro = (0,0,0.0),wd = True)
        rig.xform(emptyGrp,t = (0,0,0.0),wd = True)
        Mpos = rig.xform(emptyGrp,q = True,t = True,ws = True) 
        rig.xform(emptyGrp,t = (0,0,TR),wd = True)
        Fpos = rig.xform(emptyGrp,q = True,t = True,ws = True)  
        rig.xform(emptyGrp,t = (0,0,-TR),wd = True)
        Bpos = rig.xform(emptyGrp,q = True,t = True,ws = True)       
        
        curs = rig.curve(d = 2,p = [Fpos,Mpos,Bpos])
        tempCurves.append(curs)
        rig.delete(emptyGrp)
    
    loftNurbs = rig.loft(tempCurves)[0]
    rig.rebuildSurface(loftNurbs,rpo  = 1,rt = 0,end = 1,kr = 0,su = len(cons)*2,du = 3,sv = 0,dv = 3,tol = 0.001,fr = 0,dir = 2,ch = True)
#    rig.rebuildSurface(loftNurbs,rt = 1,kr = 0,ch = True)
    mainMesh = rig.duplicate(loftNurbs,n = nurbsMesh)[0]
    SCMesh = rig.duplicate(mainMesh,n = mainMesh+'_SC')[0]
    rig.hide(mainMesh,SCMesh)
    rig.delete(loftNurbs,tempCurves)
    
    
    #在主nurbs片上生成毛囊
    MainMeshShape = rig.listRelatives(mainMesh,s = True)[0]
    CPO = rig.createNode('closestPointOnSurface',n = mainMesh+'_CPO',ss = True)
    rig.connectAttr(MainMeshShape+'.worldSpace[0]',CPO+'.inputSurface')
    for i,con in enumerate(cons):
        pos = rig.xform(con,q = True,t = True,ws = True)
        rig.setAttr(CPO+'.inPositionX',pos[0])
        rig.setAttr(CPO+'.inPositionY',pos[1])
        rig.setAttr(CPO+'.inPositionZ',pos[2])
        U = rig.getAttr(CPO+'.parameterU')
        V = rig.getAttr(CPO+'.parameterV')
    
        FOLShape = rig.createNode('follicle',n = con+'_EB_FOLShape',ss = True)
        rig.connectAttr(MainMeshShape+'.worldSpace[0]',FOLShape+'.inputSurface')
        FOL = rig.listRelatives(FOLShape,p = True)[0]
        rig.connectAttr(FaceFolScale+'.scale',FOL+'.scale')
        newFol = rig.rename(FOL,con+'_EB_FOL')
        rig.connectAttr(FOLShape+'.outTranslate',newFol+'.translate')
        rig.connectAttr(FOLShape+'.outRotate',newFol+'.rotate')
        rig.setAttr(FOLShape+'.parameterU',U)
        rig.setAttr(FOLShape+'.parameterV',V)
        rig.setAttr(FOLShape+'.simulationMethod',0)
        
    #    生成控制器,完成主要控设置。
        Mcon = MainController.SK_b05(conPrefix+'_'+str(i+1)+'_M') 
        rig.parent(Mcon,con)
        rig.xform(Mcon,ro = (-90,0,0),wd = True)   
        rig.xform(Mcon,t = (0,0,0),wd = True)
        rig.setAttr(Mcon+'.sy',-0.5)
        rig.makeIdentity(Mcon,apply = True,s = True,r = True)
        MconGrp = rig.group(Mcon,n = Mcon+'Grp',r = True)
        rig.parent(MconGrp,FOL)
        JNT = rig.joint(n = Mcon+'_JNT')
        rig.xform(JNT,t = pos,ws = True)
        rig.parent(JNT,Mcon)
        
        rig.hide(FOLShape,JNT)
        NewCons.append(Mcon)
        FOLs.append(FOL)
        MainJnts.append(JNT)
    rig.skinCluster(MainJnts,SCMesh)    
        
    #在次nurbs片上生成毛囊
    
    SCMeshShape = rig.listRelatives(SCMesh,s = True)[0]
    CPO = rig.createNode('closestPointOnSurface',n = SCMesh+'_CPO',ss = True)
    rig.connectAttr(SCMeshShape+'.worldSpace[0]',CPO+'.inputSurface')
    
    IterFol = len(cons)*multiple
    addPos = 1.0/IterFol
    dvUV = 0.0
    for con in range(IterFol+1):
        V = 0.5
        FOLShape = rig.createNode('follicle',n = SCMesh+'_'+str(con)+'_SC_FOLShape',ss = True)
        rig.connectAttr(SCMeshShape+'.worldSpace[0]',FOLShape+'.inputSurface')
        FOL = rig.listRelatives(FOLShape,p = True)[0]
        rig.connectAttr(FaceFolScale+'.scale',FOL+'.scale')
        newFol = rig.rename(FOL,SCMesh+'_'+str(con)+'_SC_FOL')
        rig.connectAttr(FOLShape+'.outTranslate',newFol+'.translate')
        rig.connectAttr(FOLShape+'.outRotate',newFol+'.rotate')
        rig.setAttr(FOLShape+'.parameterU',dvUV)
        rig.setAttr(FOLShape+'.parameterV',V)
        rig.setAttr(FOLShape+'.simulationMethod',0)  
        
        dvUV += addPos
        
        JNT = rig.joint(n = conPrefix+'_'+str(con+1)+'_SC_JNT')
        pos = rig.xform(FOL,q = True,t = True,ws = True)
        rig.xform(JNT,t = pos,ws = True)
        rig.parent(JNT,FOL)
        
        rig.hide(FOLShape,JNT)
        FOLs.append(FOL)
        SeJnts.append(JNT)
    AllGrp = rig.group(mainMesh,SCMesh,FOLs,n = nurbsMesh+'_DEF_GRP') 
    
    
    return mainMesh,SeJnts,AllGrp,NewCons
Example #16
0
    def createController(self):

        vtxNum = 0
        for i, cur in enumerate(self.allLoftCurve):
            color = self.colors[i]
            controllers = CreateControler(color, (0.02, 0.02, 0.02))
            controllers.signValue = 18424

            #区分控制器的左右和控制器的编号
            vtxs = rig.ls(rig.listRelatives(cur, s=True)[0] + '.cv[*]',
                          fl=True)  #控制器点数
            LenVtx = len(vtxs)
            vtxNums = []
            LfRtVtxs = []
            if len(vtxs) % 2:
                average = (LenVtx - 1) / 2
                for num in range(average):  #左边控制器编号
                    LfRtVtxs.append('Lf')
                    vtxNums.append(num)
                vtxNums.append(0)
                LfRtVtxs.append('Md')
                for num in range(average):  #左边控制器编号
                    vtxNums.append(average - num - 1)
                    LfRtVtxs.append('Rt')

            else:
                average = (LenVtx) / 2
                for num in range(average):  #左边控制器编号
                    LfRtVtxs.append('Lf')
                    vtxNums.append(num)
                for num in range(average):  #右边控制器编号
                    vtxNums.append(average - num - 1)
                    LfRtVtxs.append('Rt')

            #控制器是否左右对称
            if re.compile(r'(out_Lf[A-Z]+|out_Rt[A-Z]+)').match(
                    cur) or re.compile(r'(in_Lf[A-Z]+|in_Rt[A-Z]+)').match(
                        cur):
                LfRt = True
            else:
                LfRt = False

            for j, vtx in enumerate(vtxs):

                if LfRt:
                    conName = self.names[i] + '_' + str(j) + 'M'  #控制器名字
                else:
                    conName = LfRtVtxs[j] + self.names[i] + '_' + str(
                        vtxNums[j]) + 'M'  #控制器名字
                con = controllers.SK_b03(conName)
                rig.addAttr(con, at='long', ln='vtxNum', dv=vtxNum)  #增加属性
                rig.setAttr(con + '.vtxNum', l=True)  #锁定属性
                self.connectAddAttr(con, 'CTRLCurve')  #连接属性
                pos = rig.xform(vtx, q=True, t=True, ws=True)
                rig.xform(con, t=pos, ws=True)

                rig.connectAttr(con + '.translate',
                                vtx.replace(
                                    '.cv[',
                                    '.controlPoints['))  #将控制器的位移属性连接到曲线的控制点上
                vtxNum += 1
Example #17
0
class BuildEyeController():
    def __init__(self):
        self.controller = CreateControler()
        self.grp = 'Eye_Control_GRP'
        self.ctrlName = 'Eye_M'
        self.num = 3
        self.conPos = [
            (0.0, 16.623626770105922, 4.1056612661848035),
            (0.47205042927365248, 16.623626770105922, 4.1056612661848035),
            (-0.47205042927365248, 16.623626770105922, 4.1056612661848035)
        ]
        self.jointPos = [
            ([0, 16.600944519043441, 1.3624849915501727]),
            (0.47289100288351393, 16.600944519043441, 1.3624849915501727),
            (-0.47289100288351393, 16.600944519043441, 1.3624849915501727)
        ]
        self.Lf_LidPos = [[
            0.51449495125093525, 16.614712948647536, 1.6282982423800447
        ], [0.51446175243023684, 16.524417626257684, 1.6211440872455507]]
        self.Rt_LidPos = [[
            -0.51449495125093525, 16.614712948647536, 1.6282982423800447
        ], [-0.51446175243023684, 16.524417626257684, 1.6211440872455507]]

    def getController(self):  #得到控制器名
        if self.num == 1:
            self.NewCons = [self.ctrlName]
        if self.num > 1:
            self.NewCons = []
            LfNum = 0  #左边编号
            RtNum = 0  #右边编号
            for i in range(self.num):
                if 0 == i:
                    self.NewCons.append(self.ctrlName)
                else:
                    mainPre = self.ctrlName.split('_')[0]
                    if i % 2:
                        self.NewCons.append('Lf_' + mainPre + '_' +
                                            str(LfNum) + 'M')
                        LfNum += 1
                    else:
                        self.NewCons.append('Rt_' + mainPre + '_' +
                                            str(RtNum) + 'M')
                        RtNum += 1

    def createCons(self):  #生成所有控制器
        for con in self.NewCons:
            if 'Lf_' == con[0:3]:
                self.controller.setColor(6)
                ts = self.conPos[1]
                jntPos = self.jointPos[1]
                sc = [1, 1, 1]
                self.eyelip(con, True)
            elif 'Rt_' == con[0:3]:
                self.controller.setColor(6)
                ts = self.conPos[2]
                jntPos = self.jointPos[2]
                sc = [1, 1, 1]
                self.eyelip(con, False)
            else:
                self.controller.setColor(13)  #对控制器设置颜色
                ts = self.conPos[0]
                jntPos = self.jointPos[0]
                sc = [4.373, 1, 1.828]

            rt = [90, 1, 1]
            self.singeCon(con, rt, ts, sc)

            #生成眼睛骨骼
            rig.select(cl=True)
            jntName = rig.joint(p=jntPos,
                                n=re.compile('M\Z').sub('Joint', con))
            self.connectAddAttr(jntName, 'CTRLJoint')  #连接属性

    def eyelip(self, name, UpDn):  #增加眼皮控制器
        if UpDn:
            UpPos = self.Lf_LidPos[0]
            DnPos = self.Lf_LidPos[1]
        else:
            UpPos = self.Rt_LidPos[0]
            DnPos = self.Rt_LidPos[1]

        self.controller.setObjScale([
            0.05,
            0.05,
            0.05,
        ])  #对控制器进行缩放
        self.controller.signValue = 1258
        Con = self.controller.SK_b03(name.replace('_Eye', '_UpLid'))
        self.connectAddAttr(Con, 'CTRLCurve')  #连接属性
        rig.xform(Con, t=UpPos, ws=True)
        Con = self.controller.SK_b03(name.replace('_Eye', '_DnLid'))
        self.connectAddAttr(Con, 'CTRLCurve')  #连接属性
        rig.xform(Con, t=DnPos, ws=True)

    def singeCon(self, name, rt, ts, sc):  #生成控制器

        self.controller.setObjScale([i * 0.135 for i in sc])  #对控制器进行缩放
        self.controller.signValue = 1548
        Con = self.controller.SK_b08(name)
        self.connectAddAttr(Con, 'CTRLCurve')  #连接属性
        rig.xform(Con, t=ts, ws=True)
        rig.xform(Con, ro=rt, ws=True)

    def createEmptyGrp(self):  #生成空组
        if rig.objExists(self.grp):
            self.grpName = self.grp
        else:
            self.grpName = rig.group(empty=True, n=self.grp)

    def connectAddAttr(self, AddObj, Attr):  #增加并连接属性
        rig.addAttr(AddObj, at='long', ln=Attr)
        if not rig.attributeQuery(Attr, node=self.grpName, ex=True):
            rig.addAttr(self.grpName, at='long', ln=Attr)
        rig.connectAttr(self.grpName + '.' + Attr, AddObj + '.' + Attr)

    def extraAddControl(self):
        posInfo = [
            [0.73614344582613733, 16.604239304623771, 1.4948541970870548],
            [0.65308174148532172, 16.645676611373496, 1.5729513008857312],
            [0.54766851673494632, 16.64837652763509, 1.6214938988508214],
            [0.44244251319713446, 16.643562775959364, 1.619578378724102],
            [0.32071235980511059, 16.597797824873869, 1.596789667911807],
            [0.4362284617401162, 16.559762331346164, 1.6209728592220456],
            [0.54223046060668201, 16.550345353518203, 1.6173481804777063],
            [0.64635945406333351, 16.546858303215856, 1.5722915627040193]
        ]
        LfName = [
            'Lf_CornerInLidMin_0', 'Lf_UpLidMin_1', 'Lf_UpLidMin_2',
            'Lf_UpLidMin_3', 'Lf_CornerOutLidMin_0', 'Lf_DnLidMin_3',
            'Lf_DnLidMin_2', 'Lf_DnLidMin_1'
        ]
        RtName = [
            'Rt_CornerInLidMin_0', 'Rt_UpLidMin_1', 'Rt_UpLidMin_2',
            'Rt_UpLidMin_3', 'Rt_CornerOutLidMin_0', 'Rt_DnLidMin_3',
            'Rt_DnLidMin_2', 'Rt_DnLidMin_1'
        ]

        for i, pos in enumerate(posInfo):
            self.controller.setColor(13)
            self.controller.setObjScale([
                0.02,
                0.02,
                0.02,
            ])  #对控制器进行缩放
            self.controller.signValue = 11548
            LfCon = self.controller.SK_b03(LfName[i] + 'M')
            RtCon = self.controller.SK_b03(RtName[i] + 'M')
            self.connectAddAttr(LfCon, 'CTRLCurve')  #连接属性
            self.connectAddAttr(RtCon, 'CTRLCurve')  #连接属性
            rig.xform(LfCon, t=pos, ws=True)
            pos[0] = pos[0] * -1
            rig.xform(RtCon, t=pos, ws=True)

    def Groups(self):  #整理层级
        CTRLCurves = rig.listConnections(self.grpName + '.CTRLCurve',
                                         s=False,
                                         d=True)
        CA.freezeObj().freeze(CTRLCurves)
        CTRLJoints = rig.listConnections(self.grpName + '.CTRLJoint',
                                         s=False,
                                         d=True)

        CTRLCurveGRP = rig.group(CTRLCurves, n=self.grpName + '_CTRLCurve')
        CTRLJointGRP = rig.group(CTRLJoints, n=self.grpName + '_CTRLJoint')

        mainCons = [con for con in CTRLCurves if re.match('Eye_M', con)]
        secCons = [
            con for con in CTRLCurves
            if re.match('\ALf_Eye_\d+M|\ARt_Eye_\d+M', con)
        ]
        if secCons:
            rig.parent(secCons, mainCons[0])

        rig.parent(CTRLCurveGRP, CTRLJointGRP, self.grpName)

    def done(self):
        self.createEmptyGrp()  #生成空组
        self.getController()
        self.createCons()
        self.extraAddControl()  #增加眼睛周围的控制器
        self.Groups()  #整理层级
Example #18
0
    def buildController(self):
        size = [(0.1, 0.1, 0.1), (0.1, 0.1, 0.1), (0.1, 0.1, 0.1),
                (0.1, 0.1, 0.1), (0.1, 0.1, 0.1), (0.1, 0.1, 0.1),
                (0.1, 0.1, 0.1), (0.1, 0.1, 0.1), (0.1, 0.1, 0.1),
                (0.1, 0.1, 0.1), (0.1, 0.1, 0.1)]
        colors = [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12]
        conJoint = [
            u'Lf_Brow_Joint', u'Rt_Brow_Joint', u'Lf_Cheek_Joint',
            u'Rt_Cheek_Joint', u'Lf_CornerLip_Joint', u'Rt_CornerLip_Joint',
            u'Up_Lip_Joint', u'Mouth_Tip_Joint', u'Dn_Lip_Joint',
            u'Nose_Joint', 'JawMain_Joint'
        ]
        #生成Macro控制器
        for i, jnt in enumerate(conJoint):
            pos = rig.xform(jnt, q=True, t=True, ws=True)
            controllers = CreateControler(
                15, [j * self.scale * 0.6 for j in size[i]])
            controllers.signValue = 18290

            controllers.color = colors[i]
            con = controllers.SK_b03(jnt.replace('_Joint', 'Macro_M'))
            rig.xform(con, t=pos, ws=True)

            self.connectAddAttr(con, 'CTRLMacroCurve')  #连接属性

        #生成blendShape控制器
        crossColor = [17 for i in range(11)]  #cross控制器颜色
        colors = [13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 17]  #blendShape控制器颜色
        for i, jnt in enumerate(conJoint):
            pos = rig.xform(jnt, q=True, t=True, ws=True)  #获得位置信息
            controllers = CreateControler(15,
                                          [j * self.scale for j in size[i]])
            controllers.signValue = 44390

            controllers.color = colors[i]
            if 'JawMain_Joint' == jnt:
                con = controllers.SK_b01(jnt.replace('_Joint', '_M'))
            else:
                con = controllers.SK_b03(jnt.replace('_Joint',
                                                     '_M'))  #blendShape控制器
            self.connectAddAttr(con, 'CTRLBsCurve')  #连接属性

            controllers.color = crossColor[i]
            controllers.setObjScale([i * 1.6 for i in controllers.curveSale])
            conCross = controllers.SK_b16(jnt.replace('_Joint',
                                                      'Cross_M'))  #cross控制器

            rig.xform(con, t=pos, ws=True)
            rig.xform(conCross, t=pos, ws=True)

            rig.parent(rig.listRelatives(conCross, s=True)[0],
                       con,
                       s=True,
                       add=True)  #parent形节点
            rig.delete(conCross)  #删除cross控制器

        #生成jawSwivel控制器
        controllers.setRelativesScale([0.3, 0.3, 0.3])
        jawSwivel = controllers.SK_b01('jawSwivel_M')
        rig.xform(jawSwivel, t=(0, 15.97, 2.485), ws=True)
        self.connectAddAttr(jawSwivel, 'CTRLBsCurve')  #连接属性

        rig.hide('Mouth_TipMacro_MShape')
        #增加旋转blendShape属性
        rig.addAttr('JawMain_M', at='float', ln='limitMinrz', dv=-30, k=True)
        rig.addAttr('JawMain_M', at='float', ln='limitMaxrz', dv=30, k=True)

        rig.addAttr('jawSwivel_M', at='float', ln='limitMinrz', dv=-30, k=True)
        rig.addAttr('jawSwivel_M', at='float', ln='limitMaxrz', dv=30, k=True)

        rig.addAttr('Mouth_Tip_M', at='float', ln='limitMinrz', dv=-30, k=True)
        rig.addAttr('Mouth_Tip_M', at='float', ln='limitMaxrz', dv=30, k=True)

        rig.addAttr('Lf_Brow_M', at='float', ln='limitMinrz', dv=-30, k=True)
        rig.addAttr('Lf_Brow_M', at='float', ln='limitMaxrz', dv=30, k=True)

        rig.addAttr('Rt_Brow_M', at='float', ln='limitMinrz', dv=-30, k=True)
        rig.addAttr('Rt_Brow_M', at='float', ln='limitMaxrz', dv=30, k=True)
Example #19
0
    def slideMouth(self, ConName):
        slidsArray = ['M_' + str(conArrow) for conArrow in range(20)]
        Z = 9.38
        textGrp = []
        sqGrp = []
        for i in range(len(slidsArray)):
            numChar = str(i)
            Text = self.widge.text(numChar, True)
            rig.xform(Text, t=(0, 0, 9.14), wd=True)
            rig.setAttr(Text + '.sx', 0.1)
            rig.setAttr(Text + '.sy', 0.1)
            rig.setAttr(Text + '.sz', 0.1)
            SqGrp, Sq = self.widge.square('SQ_' + numChar, True)
            rig.setAttr(SqGrp + '.sx', 0.1)
            rig.setAttr(SqGrp + '.sy', 0.1)
            rig.setAttr(SqGrp + '.sz', 0.1)

            rig.xform(Text, t=(5.45, 0, Z), wd=True)
            rig.xform(SqGrp, t=(4.9, 0, Z), wd=True)
            Z -= 0.5

            textGrp.append(Text)
            sqGrp.append(SqGrp)

        ConGrp, Con = self.widge.slideSinge(ConName)
        squareCon = Con.replace('_Switch_M', '_Switch_RANGE_SQ')
        rig.transformLimits(Con, tz=(0, len(slidsArray) - 1), etz=(1, 1))
        rig.xform(squareCon, t=(0, 0, 3.997), wd=True)
        rig.setAttr(squareCon + '.sz', 6.945)

        rig.xform(ConGrp, t=(4.905, 0, 8.55), wd=True)
        rig.setAttr(ConGrp + '.sx', 1.375)
        rig.setAttr(ConGrp + '.sy', 1)
        rig.setAttr(ConGrp + '.sz', 0.509)
        rig.setAttr(ConGrp + '.ry', 180)

        rig.hide(squareCon)
        TConGrp = self.addExtraExpress(slidsArray)
        SCNode = SK_createCompoundAttrs(TConGrp, len(slidsArray))
        SCJawNode = rig.createNode('choice', n=Con + '_SC', ss=True)
        rig.connectAttr(Con + '.tz', SCNode + '.selector')
        rig.connectAttr(Con + '.tz', SCJawNode + '.selector')
        rig.addAttr(ConGrp, at='float', ln='outJaw', k=True)
        for i, ArCon in enumerate(slidsArray):
            rig.addAttr(ConGrp, at='float', ln=ArCon, k=True)
            #            rig.connectAttr(ConGrp+'.'+ArCon,SCNode+'.inData.bess'+str(i))
            rig.connectAttr(TConGrp + '.outbess' + str(i), ArCon + '_M.tz')
            rig.connectAttr(ConGrp + '.' + ArCon,
                            SCJawNode + '.input[' + str(i) + ']')
        rig.connectAttr(SCJawNode + '.output', ConGrp + '.outJaw')

        midGrp = rig.group(textGrp, sqGrp, n=ConGrp + '_Text_slide_GRP')
        rig.hide(TConGrp)
        grp = rig.group(ConGrp, TConGrp, midGrp, n=ConGrp + '_Slide_GRP')

        self.Lock.hideInvertAttr(Con, ('translateZ'))

        mouthShape = CreateControler()
        MSgrp = mouthShape.mouthControl('MouthShape')
        rig.parent(MSgrp, grp)

        return grp
Example #20
0
class FC_FaceSetup(object):
    def __init__(self,
                 eyeSign,
                 tongueSign,
                 faceSign,
                 eyebrowSign,
                 toothSign,
                 face,
                 signRun=True):
        self.Lock = LockHideAttr(False, False, False, False)
        self.eyeSn = eyeSign
        self.tongueSign = tongueSign
        self.faceSn = faceSign
        self.eyebrowSn = eyebrowSign
        self.toothSn = toothSign
        self.face = face
        if signRun:
            self.combine()

    def distanceBetween(self, parA, parB):
        Apos = rig.xform(parA, q=True, t=True, ws=True)
        Bpos = rig.xform(parB, q=True, t=True, ws=True)
        dis = math.sqrt((Apos[0] - Bpos[0])**2 + (Apos[1] - Bpos[1])**2 +
                        (Apos[2] - Bpos[2])**2)
        return dis

    def getTFstr(self, inputData):
        data = rig.textField(inputData, q=True, tx=True)
        return data

    def genBaseFace(self, mesh):
        skinMesh = rig.duplicate(mesh, n=mesh + '_Skin_Mesh')[0]
        self.skinMesh = skinMesh
        self.Mesh = mesh
        rig.transferAttributes(self.Mesh,
                               self.skinMesh,
                               transferUVs=1,
                               sampleSpace=5)
        rig.select(self.skinMesh)
        mel.eval('DeleteHistory')
        skinMeshShape = rig.listRelatives(skinMesh, s=True, ni=True)[0]
        meshShape = rig.listRelatives(mesh, s=True, ni=True)[0]

        self.scaleVal = self.distanceBetween('Lf_ear_P',
                                             'Rt_ear_P') / 3.39395596416
        FaceFolScale = rig.group(empty=True, n='Face_Scale_Grp')
        FaceDeformersGrp = rig.group(empty=True, n='Face_Deformers_Grp')
        self.faceRig = rig.group(empty=True, n='Face_Rigging_GRP')
        rig.addAttr(FaceFolScale, at='float', ln='scaleVal', dv=self.scaleVal)
        rig.addAttr(FaceFolScale, at='float', ln='signA', dv=11)
        rig.addAttr(FaceFolScale, at='float', ln='signB', dv=22)
        self.controller = CreateControler(
            13,
            [0.05 * self.scaleVal, 0.05 * self.scaleVal, 0.05 * self.scaleVal])

        cons = [
            objCon for objCon in [
                obj for obj in rig.ls(type='transform')
                if rig.attributeQuery('sign', n=obj, ex=True)
            ] if (78 == rig.getAttr(objCon +
                                    '.sign') or 71 == rig.getAttr(objCon +
                                                                  '.sign'))
        ]

        CLM = rig.createNode('closestPointOnMesh', n='Face_CLM', ss=True)
        rig.connectAttr(meshShape + '.outMesh', CLM + '.inMesh')

        JNTS = []
        FOLS = []
        EXFOLS = []
        self.allCons = []
        for con in cons:
            pos = rig.xform(con, q=True, t=True, ws=True)
            rig.setAttr(CLM + '.inPositionX', pos[0])
            rig.setAttr(CLM + '.inPositionY', pos[1])
            rig.setAttr(CLM + '.inPositionZ', pos[2])
            U = rig.getAttr(CLM + '.result.parameterU')
            V = rig.getAttr(CLM + '.result.parameterV')

            FOLShape = rig.createNode('follicle', n=con + '_FOLShape', ss=True)
            rig.connectAttr(meshShape + '.worldMesh[0]',
                            FOLShape + '.inputMesh')
            FOL = rig.listRelatives(FOLShape, p=True)[0]
            rig.connectAttr(FaceFolScale + '.scale', FOL + '.scale')
            rig.connectAttr(meshShape + '.worldMatrix[0]',
                            FOL + '.inputWorldMatrix')
            newFol = rig.rename(FOL, con + '_FOL')
            rig.connectAttr(FOLShape + '.outTranslate', newFol + '.translate')
            rig.connectAttr(FOLShape + '.outRotate', newFol + '.rotate')
            rig.setAttr(FOLShape + '.parameterU', U)
            rig.setAttr(FOLShape + '.parameterV', V)
            rig.setAttr(FOLShape + '.simulationMethod', 0)

            #        创建控制器
            CurConName = con.replace('_P', '_M')
            ConName = self.controller.SK_b03(CurConName)
            if 78 == rig.getAttr(con + '.sign'):
                rig.connectAttr(FaceFolScale + '.signA', ConName + '.sign')
            else:
                rig.connectAttr(FaceFolScale + '.signB', ConName + '.sign')
            ConNameShape = rig.listRelatives(ConName, s=True)[0]
            ConColor = rig.getAttr(
                rig.listRelatives(con, s=True)[0] + '.overrideColor')
            rig.setAttr(ConNameShape + '.overrideColor', ConColor)
            ConGRP = rig.group(ConName, n=ConName + '_GRP')
            MirrorGRP = rig.group(ConGRP, n=ConName + '_Mirror_GRP')

            #        生�骨骼
            rig.select(cl=True)
            FOLMatrix = rig.getAttr(FOLShape + '.worldMatrix[0]')
            jntName = rig.joint(n=CurConName + '_JNT')
            JNTGrp = rig.group(jntName, n=jntName + '_GRP')

            rig.parent(JNTGrp, ConName)
            rig.xform(MirrorGRP, matrix=FOLMatrix)
            rig.parent(MirrorGRP, FOL)

            rig.setAttr(jntName + '.visibility', 0)
            rig.setAttr(FOLShape + '.visibility', 0)
            if 11 == rig.getAttr(ConName + '.sign'):
                JNTS.append(jntName)
            else:
                EXFOLS.append(FOLShape)
            FOLS.append(FOL)
            self.allCons.append(ConName)

        SkinClus = rig.skinCluster(JNTS, skinMesh, n='Face_BlendShape_SKIN')[0]
        infs = rig.skinCluster(SkinClus, q=True, inf=True)
        for i, inf in enumerate(infs):
            MirrorGRP = inf.replace('_M_JNT', '_M_Mirror_GRP')
            rig.connectAttr(MirrorGRP + '.worldInverseMatrix[0]',
                            SkinClus + '.bindPreMatrix[' + str(i) + ']')

            #            if 'Rt' == MirrorGRP.split('_')[0]:
            #                rig.setAttr(MirrorGRP+'.sx',-1)
            #                rig.setAttr(MirrorGRP+'.sy',-1)
            #            if 'Lf' == MirrorGRP.split('_')[0]:
            #                rig.setAttr(MirrorGRP+'.rx',180)
            #                rig.setAttr(MirrorGRP+'.sz',-1)

            #            校正控制器轴向到世界
            #            rig.rotate(0,0,0,MirrorGRP,ws = True)
            #            校正控制器轴向到法线向上方向指向世界的Y方向。
            #            MirrorMatrix = rig.getAttr(MirrorGRP+'.worldMatrix[0]')
            #            aimEmptyGrp = rig.group(n = MirrorGRP+'_Aim',empty = True)
            #            rig.xform(aimEmptyGrp,matrix = MirrorMatrix)
            #            rig.parent(aimEmptyGrp,MirrorGRP)
            #            rig.setAttr(aimEmptyGrp+'.tz',1)
            #            rig.parent(aimEmptyGrp,w = True)
            #            rig.aimConstraint(aimEmptyGrp,MirrorGRP,aimVector = (0,0,1),upVector = (0,1,0),worldUpType = 'scene')
            #            rig.delete(aimEmptyGrp)

            #            根据规定的轴向校正
            SK_ConOrientation(MirrorGRP.replace('_Mirror_GRP', ''))

        if EXFOLS:
            for fol in EXFOLS:
                rig.connectAttr(skinMeshShape + '.worldMesh[0]',
                                fol + '.inputMesh',
                                f=True)
                MirrorGRP = fol.replace('_P_FOLShape', '_M_Mirror_GRP')
                #                rig.setAttr(childGrp+'.sz',-1)

                #               校正控制器轴向到世界
                #               rig.rotate(0,0,0,MirrorGRP,ws = True)
                #               校正控制器轴向到法线向上方向指向世界的Y方向。
                #                MirrorMatrix = rig.getAttr(MirrorGRP+'.worldMatrix[0]')
                #                aimEmptyGrp = rig.group(n = MirrorGRP+'_Aim',empty = True)
                #                rig.xform(aimEmptyGrp,matrix = MirrorMatrix)
                #                rig.parent(aimEmptyGrp,MirrorGRP)
                #                rig.setAttr(aimEmptyGrp+'.tz',1)
                #                rig.parent(aimEmptyGrp,w = True)
                #                rig.aimConstraint(aimEmptyGrp,MirrorGRP,aimVector = (0,0,1),upVector = (0,1,0),worldUpType = 'scene')
                #                rig.delete(aimEmptyGrp)

                #                根据规定的轴向校正
                SK_ConOrientation(MirrorGRP.replace('_Mirror_GRP', ''))

        FOLALLGRP = rig.group(FOLS, n='All_FOLS_GRP')
        rig.parent(FaceFolScale, self.Mesh, self.skinMesh, FOLALLGRP,
                   FaceDeformersGrp)

    def findSkinCluster(self, Mesh):
        skinName = ''
        hisNode = rig.listHistory(Mesh, pdo=True)
        if hisNode:
            sign = [
                skinCL for skinCL in rig.listHistory(Mesh, pdo=True)
                if ('skinCluster' == rig.nodeType(skinCL))
            ]
            if sign:
                skinName = sign[0]
        return skinName

    def connectFaceModel(self, skinModel):
        rig.select(cl=True)
        rig.hide('Mid_base_M')
        jawHeads = [u'HeadRoot_JNT_P', u'Jaw_JNT_P', u'JawTip_JNT_P']
        for jnt in jawHeads:
            pos = rig.xform(jnt, q=True, t=True, ws=True)
            NJnt = rig.joint(n=jnt.replace('_JNT_P', '_JNT'))
            rig.xform(NJnt, t=pos, ws=True)
            if 'Jaw_JNT_P' == jnt:
                jawUP = rig.joint(n=jnt.replace('_JNT_P', '_UP_JNT'))
                rig.xform(jawUP, t=pos, ws=True)
                jawUPA = rig.joint(n=jnt.replace('_JNT_P', '_UPA_JNT'))
                rig.xform(jawUPA, t=pos, ws=True)
                jawUPB = rig.joint(n=jnt.replace('_JNT_P', '_UPB_JNT'))
                rig.xform(jawUPB, t=pos, ws=True)

        jaw = 'Jaw_M'
        rig.addAttr(jaw, at='enum', ln='vis_second', en='OFF:ON', k=False)
        rig.setAttr(jaw + '.vis_second', cb=True)
        jawPos = rig.xform(jaw, q=True, piv=True, ws=True)[0:3]
        rig.xform('JawTip_JNT', t=jawPos, ws=True)
        rig.parent(jaw, w=True)
        rig.makeIdentity(jaw, apply=True, t=True, s=True, r=True)

        IK = rig.ikHandle(sj='Jaw_UPB_JNT', ee='JawTip_JNT', n='Jaw_IK')[0]
        rig.parent(IK, jaw)
        rig.connectAttr(jaw + '.rz', IK + '.twist')
        rig.connectAttr(jaw + '.tz', 'Jaw_UPA_JNT' + '.tz')

        sign = self.findSkinCluster(skinModel)
        if sign:
            rig.skinCluster(sign, e=True, ai='Jaw_UPB_JNT', lw=True, wt=0)
        else:
            rig.skinCluster('Jaw_UPB_JNT',
                            'HeadRoot_JNT',
                            skinModel,
                            tsb=True,
                            n='Jaw_Skin')
        rig.blendShape(skinModel,
                       self.skinMesh,
                       w=(0, 1),
                       n='SKIN_BS',
                       foc=True)
        rig.blendShape(skinModel, self.Mesh, w=(0, 1), n='Mesh_BS')

        grpA = rig.group(jaw, n=jaw + '_GRPA', r=True)
        grpB = rig.group(grpA, n=jaw + '_GRPB', r=True)
        jntGrp = rig.group('HeadRoot_JNT', n='Head_JNT_GRP', r=True)
        rig.hide(jntGrp)
        rig.hide(IK)
        rig.parent(grpB, jntGrp, self.faceRig)

        allCons = self.allCons
        for con in allCons:
            rig.connectAttr(jaw + '.vis_second',
                            rig.listRelatives(con, p=True)[0] + '.visibility')

        self.Lock.hideInvertAttr(jaw, ('translateZ', 'translateY',
                                       'translateX', 'rotateZ', 'vis_Second'))

        rig.parent(skinModel, 'Face_Deformers_Grp')

    def eyeSetup(self, LfEye, RtEye):
        LfPos = rig.xform('Lf_EYE_JNT_P', q=True, t=True, ws=True)
        rig.select(cl=True)
        LfJnt = rig.joint(n='Lf_EYE_JNT')
        rig.xform(LfJnt, t=LfPos, ws=True)
        RtPos = rig.xform('Rt_EYE_JNT_P', q=True, t=True, ws=True)
        rig.select(cl=True)
        RtJnt = rig.joint(n='Rt_EYE_JNT')
        rig.xform(RtJnt, t=RtPos, ws=True)

        LfLoc = rig.spaceLocator(n=LfJnt + '_Loc')[0]
        RtLoc = rig.spaceLocator(n=RtJnt + '_Loc')[0]
        LfLocPos = (LfPos[0], LfPos[1] + self.scaleVal, LfPos[2])
        rig.xform(LfLoc, t=LfLocPos, ws=True)
        RtLocPos = (RtPos[0], RtPos[1] + self.scaleVal, RtPos[2])
        rig.xform(RtLoc, t=RtLocPos, ws=True)
        locEyeGrp = rig.group(LfLoc, RtLoc, n='Eye_LOC_GRP')
        rig.hide(locEyeGrp)

        eyeCon = 'eye_M'
        rig.addAttr(eyeCon,
                    at='enum',
                    ln='follow',
                    en='OFF:ON',
                    k=False,
                    dv=True)
        rig.setAttr(eyeCon + '.follow', cb=True)
        LfCon = 'Lf_eye_M'
        RtCon = 'Rt_eye_M'
        rig.parent(eyeCon, w=True)
        rig.setAttr(eyeCon + '.rx', 0)
        eyegroupA = rig.group(eyeCon, n='eye_GoupA', r=True)
        eyegroupB = rig.group(eyegroupA, n='eye_GoupB', r=True)
        Lf_conGrp = rig.group(LfCon, n=LfCon + '_GRP', r=True)
        Rt_conGrp = rig.group(RtCon, n=RtCon + '_GRP', r=True)

        grpL = rig.group('Lf_EYE_JNT', n='Eye_JNT_GRPL', r=True)
        grpR = rig.group('Rt_EYE_JNT', n='Eye_JNT_GRPR', r=True)
        rig.parent(grpL, grpR, locEyeGrp, eyegroupB, self.faceRig)

        rig.makeIdentity(eyegroupA, apply=True, s=True, t=True, r=True)
        #        aimConstraint
        rig.aimConstraint(LfCon,
                          LfJnt,
                          aimVector=(1, 0, 0),
                          upVector=(0, 1, 0),
                          worldUpType='object',
                          worldUpObject=LfLoc)
        rig.aimConstraint(RtCon,
                          RtJnt,
                          aimVector=(1, 0, 0),
                          upVector=(0, 1, 0),
                          worldUpType='object',
                          worldUpObject=RtLoc)

        #       skin
        if (LfEye and RtEye):
            rig.skinCluster(LfJnt, LfEye, tsb=True)
            rig.skinCluster(RtJnt, RtEye, tsb=True)

        RV = rig.createNode('reverse', n='EYE_C_RV', ss=True)
        rig.scaleConstraint(self.faceRig, 'Face_Scale_Grp', mo=True)
        parentNode = rig.parentConstraint(self.faceRig,
                                          'Face_Scale_Grp',
                                          eyegroupA,
                                          mo=True)[0]
        rig.connectAttr(eyeCon + '.follow',
                        parentNode + '.' + self.faceRig + 'W0')
        rig.connectAttr(RV + '.output.outputX',
                        parentNode + '.' + 'Face_Scale_Grp' + 'W1')
        rig.connectAttr(eyeCon + '.follow', RV + '.input.inputX')

    def toothSetup(self, upTooth, dnTooth):
        UpTooth = 'UpTooth_JNT_P'
        DnTooth = 'DnTooth_JNT_P'
        upPos = rig.xform(UpTooth, q=True, t=True, ws=True)
        dnPos = rig.xform(DnTooth, q=True, t=True, ws=True)
        rig.select(cl=True)
        upJnt = rig.joint(n=UpTooth.replace('_P', ''))
        rig.xform(upJnt, t=upPos, ws=True)
        rig.select(cl=True)
        dnJnt = rig.joint(n=DnTooth.replace('_P', ''))
        rig.xform(dnJnt, t=dnPos, ws=True)

        #        nurbsControl
        self.controller.setColor(6)
        self.controller.setObjScale(
            [0.2 * self.scaleVal, 0.2 * self.scaleVal, -0.2 * self.scaleVal])
        upCon = self.controller.SK_b09('UpTooth_M')
        dnCon = self.controller.SK_b09('DnTooth_M')
        rig.xform(upCon, t=upPos, ws=True)
        rig.xform(dnCon, t=dnPos, ws=True)
        upGrp = rig.group(upCon, n=upCon + 'GRP', r=True)
        dnGrp = rig.group(dnCon, n=dnCon + 'GRP', r=True)
        rig.makeIdentity(upCon,
                         apply=True,
                         s=True,
                         r=True,
                         t=True,
                         jointOrient=True)
        rig.makeIdentity(dnCon,
                         apply=True,
                         s=True,
                         r=True,
                         t=True,
                         jointOrient=True)

        rig.parent(upJnt, upCon)
        rig.parent(dnJnt, dnCon)
        rig.connectAttr('Jaw_M.vis_second', upGrp + '.visibility')
        rig.connectAttr('Jaw_M.vis_second', dnGrp + '.visibility')
        rig.skinCluster(upJnt, upTooth, tsb=True, n='UpTooth_Skin')
        rig.skinCluster(dnJnt, dnTooth, tsb=True, n='DnTooth_Skin')

        #        rig.parent(dnGrp,'Jaw_UPB_JNT')
        rig.parent(upGrp, dnGrp, self.faceRig)
        rig.parentConstraint('Jaw_UPB_JNT', dnGrp, mo=True)

    def tongueSetup(self, tongue):
        JNT = 'Tongue_1_JNT_P'
        cons = rig.listRelatives(JNT, c=True, ad=True)
        cons.append('Tongue_1_JNT_P')
        rig.select(cl=True)
        sign = ''
        conGrp = []
        NewJNTS = []
        for con in cons:
            pos = rig.xform(con, q=True, t=True, ws=True)
            jnt = rig.joint(n=con.replace('_P', ''))
            self.controller.setColor(15)
            jntCon = self.controller.SK_b08(jnt + '_M')
            rig.setAttr(jntCon + '.rx', 90)
            rig.xform(jntCon, t=pos, ws=True)
            rig.xform(jnt, t=pos, ws=True)
            rig.parent(jnt, jntCon)
            conUpGrp1 = rig.group(jntCon, n=jntCon + '_GRP1', r=True)
            conUpGrp2 = rig.group(conUpGrp1, n=jntCon + '_GRP2', r=True)

            if sign:
                rig.parent(sign, jnt)
            sign = conUpGrp2

            conGrp.append(conUpGrp1)
            NewJNTS.append(jnt)

        con = 'Tongue_M'
        rig.addAttr(con, at='enum', ln='vis_second', en='OFF:ON:', k=False)
        rig.setAttr(con + '.vis_second', cb=True)
        rig.makeIdentity('Tongue_1_JNT_M_GRP2',
                         apply=True,
                         t=True,
                         r=True,
                         s=True,
                         jointOrient=True)
        rig.connectAttr(con + '.vis_second', 'Tongue_1_JNT_M_GRP2.visibility')
        rig.select(cl=True)

        sc = self.scaleVal
        rig.parent(con, w=True)
        rig.makeIdentity(con, apply=True, s=True, r=True, t=True)

        #        newConGrp:组为排除根部第一个组
        removeGrp = conGrp[-1]
        newConGrp = conGrp.remove(removeGrp)

        conSR = rig.createNode('setRange', n='TongueRG', ss=True)
        rig.connectAttr(con + '.tx', conSR + '.valueX')
        rig.connectAttr(con + '.ty', conSR + '.valueY')
        rig.connectAttr(con + '.tz', conSR + '.valueZ')
        rig.setAttr(conSR + '.oldMaxX', 0.5 * sc)
        rig.setAttr(conSR + '.oldMaxY', 0.5 * sc)
        rig.setAttr(conSR + '.oldMaxZ', 2 * sc)
        rig.setAttr(conSR + '.oldMinX', -0.5 * sc)
        rig.setAttr(conSR + '.oldMinY', -0.5 * sc)
        rig.setAttr(conSR + '.oldMinZ', -2 * sc)
        rig.setAttr(conSR + '.maxX', 20)
        rig.setAttr(conSR + '.maxY', -20)
        rig.setAttr(conSR + '.maxZ', 0.5 * sc)
        rig.setAttr(conSR + '.minX', -20)
        rig.setAttr(conSR + '.minY', 20)
        rig.setAttr(conSR + '.minZ', -0.5 * sc)

        #        连接舌头的旋转
        for grp in conGrp:
            addName = grp.split('_JNT_')[0]
            rig.addAttr(con, at='float', ln=addName, dv=1)
            rig.addAttr(grp, at='float', ln='SV', dv=1)
            rig.connectAttr(con + '.' + addName, grp + '.SV')

            rig.connectAttr(con + '.rz', grp + '.rz')
            MD = rig.createNode('multiplyDivide', n=grp + '_MD', ss=True)
            rig.connectAttr(grp + '.SV', MD + '.input1X')
            rig.connectAttr(con + '.rx', MD + '.input2X')
            rig.connectAttr(MD + '.outputX', grp + '.rx')

            rig.connectAttr(grp + '.SV', MD + '.input1Y')
            rig.connectAttr(con + '.ry', MD + '.input2Y')
            rig.connectAttr(MD + '.outputY', grp + '.ry')

            rig.connectAttr(conSR + '.outValue.outValueZ', grp + '.tz')

#        连接舌头的位移和缩放
        rig.connectAttr(con + '.tx', 'Tongue_1_JNT_M_GRP1.tx')
        rig.connectAttr(con + '.ty', 'Tongue_1_JNT_M_GRP1.ty')
        rig.connectAttr(con + '.sx', 'Tongue_1_JNT_M_GRP1.sx')
        rig.connectAttr(con + '.sy', 'Tongue_1_JNT_M_GRP1.sy')
        rig.connectAttr(con + '.sz', 'Tongue_1_JNT_M_GRP1.sz')

        rig.transformLimits(con, tx=(-1 * 0.5 * sc, 0.5 * sc), erx=(1, 1))
        rig.transformLimits(con, tx=(-1 * 0.5 * sc, 0.5 * sc), etx=(1, 1))
        rig.transformLimits(con, ty=(-1 * 0.5 * sc, 0.5 * sc), erx=(1, 1))
        rig.transformLimits(con, ty=(-1 * 0.5 * sc, 0.5 * sc), ety=(1, 1))
        rig.transformLimits(con, tz=(-1 * 0.5 * sc, 0.5 * sc), erx=(1, 1))
        rig.transformLimits(con, tz=(-1 * 2.0 * sc, 2.0 * sc), etz=(1, 1))

        rig.skinCluster(NewJNTS, tongue, tsb=True, n='Tongue_Skin')

        grpA = rig.group(con, n=con + '_GRPA', r=True)
        grpB = rig.group(grpA, n=con + '_GRPB', r=True)
        rig.parent(grpB, 'Tongue_1_JNT_M_GRP2', self.faceRig)
        rig.parentConstraint('Jaw_UPB_JNT', 'Tongue_1_JNT_M_GRP2', mo=True)
        self.Lock.hideInvertAttr(
            con,
            ('translateZ', 'translateY', 'translateX', 'vis_Second', 'rotateX',
             'rotateY', 'rotateZ', 'scaleX', 'scaleY', 'scaleZ'))

    def eyebrowSetup(self, lfEyebrow, rtEyebrow):
        SV = rig.getAttr('Face_Scale_Grp.scaleVal')
        LfJnts = rig.ls('Lf_ebw_*_M_JNT')
        LfCons = rig.ls('Lf_ebw_*_M')
        LfAkinMesh, LfAkinJnt, LfAllGrp, LfNewCons = SK_FollicleControl(
            LfCons, 2, SV, 'Lf_eyeBrow', 'Lf_eyeBrow_Loft', 'Face_Scale_Grp')
        RtJnts = rig.ls('Rt_ebw_*_M_JNT')
        RtCons = rig.ls('Rt_ebw_*_M')
        RtAkinMesh, RtAkinJnt, RtAllGrp, RtNewCons = SK_FollicleControl(
            RtCons, 2, SV, 'Rt_eyeBrow', 'Rt_eyeBrow_Loft', 'Face_Scale_Grp')

        #生成blendShape
        LfUP = rig.duplicate(LfAkinMesh, n=LfAkinMesh + '_UP')
        LfDN = rig.duplicate(LfAkinMesh, n=LfAkinMesh + '_DN')
        LfLF = rig.duplicate(LfAkinMesh, n=LfAkinMesh + '_LF')
        LfRT = rig.duplicate(LfAkinMesh, n=LfAkinMesh + '_RT')
        RtUP = rig.duplicate(RtAkinMesh, n=RtAkinMesh + '_UP')
        RtDN = rig.duplicate(RtAkinMesh, n=RtAkinMesh + '_DN')
        RtLF = rig.duplicate(RtAkinMesh, n=RtAkinMesh + '_LF')
        RtRT = rig.duplicate(RtAkinMesh, n=RtAkinMesh + '_RT')
        rig.blendShape(LfUP,
                       LfDN,
                       LfLF,
                       LfRT,
                       LfAkinMesh,
                       n=LfAkinMesh + '_BS')
        rig.blendShape(RtUP,
                       RtDN,
                       RtLF,
                       RtRT,
                       RtAkinMesh,
                       n=RtAkinMesh + '_BS')

        rig.skinCluster(LfJnts, LfAkinMesh, tsb=True, n='Lf_eyeBrow_M_Skin')
        rig.skinCluster(LfAkinJnt, lfEyebrow, tsb=True, n='Lf_eyeBrow_Skin')
        rig.skinCluster(RtJnts, RtAkinMesh, tsb=True, n='Rt_eyeBrow_M_Skin')
        rig.skinCluster(RtAkinJnt, rtEyebrow, tsb=True, n='Rt_eyeBrow_Skin')
        #        隐藏以前眉毛控制器
        LfCons.extend(RtCons)
        LfNewCons.extend(RtNewCons)
        rig.addAttr('All_FOLS_GRP',
                    at='enum',
                    ln='eyeBrow_Vis',
                    en='OFF:ON:',
                    k=True,
                    dv=0)
        for i, con in enumerate(LfCons):
            conShape = rig.listRelatives(con, s=True)[0]
            rig.setAttr(conShape + '.overrideColor', 6)
            rig.connectAttr('All_FOLS_GRP.eyeBrow_Vis', con + '.visibility')
            UpCon = rig.listRelatives(LfNewCons[i], p=True)[0]
            rig.connectAttr('Jaw_M.vis_second', UpCon + '.visibility')

        rig.parent(LfAllGrp, RtAllGrp, 'All_FOLS_GRP')

    def faceBsSetup(self, faceInfo):

        pass

    def extraControl(self):
        rig.setAttr('Face_Con.visibility', 0)

    def combine(self):
        head = self.getTFstr(self.face.headTF)
        skinHead = self.getTFstr(self.face.skinHeadTF)
        lfEye = self.getTFstr(self.face.loadLfEyeTF)
        rtEye = self.getTFstr(self.face.loadRtEyeTF)
        upTooth = self.getTFstr(self.face.loadUpToothTF)
        dnTooth = self.getTFstr(self.face.loadDnToothTF)
        lfEyebrow = self.getTFstr(self.face.loadLfEyebrowTF)
        rtEyebrow = self.getTFstr(self.face.loadRtEyebrowTF)
        tongue = self.getTFstr(self.face.loadTongueTF)
        faceInfo = self.getTFstr(self.face.bsFaceTF)

        self.genBaseFace(head)
        self.connectFaceModel(skinHead)
        if self.eyeSn:
            self.eyeSetup(lfEye, rtEye)
        if self.toothSn:
            self.toothSetup(upTooth, dnTooth)
        if self.toothSn:
            self.tongueSetup(tongue)
        if self.eyebrowSn:
            self.eyebrowSetup(lfEyebrow, rtEyebrow)
        if self.faceSn:
            self.faceBsSetup(faceInfo)
        self.extraControl()
Example #21
0
    def fourSlide(self, Text, sign='DEL'):
        WD = CreateControler(self.Color, (1, 1, -1))
        AR = WD.SK_b06(Text + '_M')
        ARGRP = rig.group(AR, n=AR + '_CON_GRP', r=True)
        rig.setAttr(ARGRP + '.sx', 0.1)
        rig.setAttr(ARGRP + '.sy', 0.1)
        rig.setAttr(ARGRP + '.sz', 0.1)

        SQ = WD.SK_b13(Text + '_RANGE_SQ')
        SQGRP = rig.group(SQ, n=SQ + '_RANGE_GRP', r=True)
        rig.setAttr(SQGRP + '.sx', 0.6)
        rig.setAttr(SQGRP + '.sy', 0.6)
        rig.setAttr(SQGRP + '.sz', 0.6)

        TX = self.text(Text)
        TXGRP = rig.group(TX, n=TX + '_TEXT_GRP', r=True)
        rig.setAttr(TXGRP + '.sx', 0.14)
        rig.setAttr(TXGRP + '.sy', 0.14)
        rig.setAttr(TXGRP + '.sz', 0.14)

        if 'up' == sign:
            rig.setAttr(TXGRP + '.tz', 1.6)
        if 'dn' == sign:
            rig.setAttr(TXGRP + '.tz', -1.6)
        if 'lf' == sign:
            rig.setAttr(TXGRP + '.tx', 1.6)
        if 'rt' == sign:
            rig.setAttr(TXGRP + '.tx', -1.6)

        partConGRP = rig.group(TXGRP, SQGRP, ARGRP, n=Text + '_WIDGE_GRP')
        rig.makeIdentity(partConGRP, apply=True, s=True, t=True, r=True)

        rig.transformLimits(AR, tz=(-1, 1), etz=(1, 1))
        rig.transformLimits(AR, tx=(-1, 1), etx=(1, 1))
        rig.setAttr(TXGRP + '.overrideEnabled', 1)
        rig.setAttr(TXGRP + '.overrideDisplayType', 2)
        rig.setAttr(SQGRP + '.template', 1)

        if 'DEL' == sign:
            rig.delete(TXGRP)


#        setRangeNode
        rig.addAttr(AR, at='float', ln=AR + '_up', k=True)
        rig.addAttr(AR, at='float', ln=AR + '_dn', k=True)
        rig.addAttr(AR, at='float', ln=AR + '_lf', k=True)
        rig.addAttr(AR, at='float', ln=AR + '_rt', k=True)
        RNDX = rig.createNode('setRange', n=AR + '_SR', ss=True)
        rig.connectAttr(AR + '.tx', RNDX + '.valueX')
        rig.connectAttr(AR + '.tx', RNDX + '.valueY')
        rig.setAttr(RNDX + '.minX', 0)
        rig.setAttr(RNDX + '.minY', 1)
        rig.setAttr(RNDX + '.maxX', 1)
        rig.setAttr(RNDX + '.maxY', 0)
        rig.setAttr(RNDX + '.oldMinX', 0)
        rig.setAttr(RNDX + '.oldMinY', -1)
        rig.setAttr(RNDX + '.oldMaxX', 1)
        rig.setAttr(RNDX + '.oldMaxY', 0)
        rig.connectAttr(RNDX + '.outValueX', AR + '.' + AR + '_lf')
        rig.connectAttr(RNDX + '.outValueY', AR + '.' + AR + '_rt')

        RNDY = rig.createNode('setRange', n=AR + '_SR', ss=True)
        rig.connectAttr(AR + '.tz', RNDY + '.valueX')
        rig.connectAttr(AR + '.tz', RNDY + '.valueY')
        rig.setAttr(RNDY + '.minX', 0)
        rig.setAttr(RNDY + '.minY', 1)
        rig.setAttr(RNDY + '.maxX', 1)
        rig.setAttr(RNDY + '.maxY', 0)
        rig.setAttr(RNDY + '.oldMinX', 0)
        rig.setAttr(RNDY + '.oldMinY', -1)
        rig.setAttr(RNDY + '.oldMaxX', 1)
        rig.setAttr(RNDY + '.oldMaxY', 0)
        rig.connectAttr(RNDY + '.outValueX', AR + '.' + AR + '_up')
        rig.connectAttr(RNDY + '.outValueY', AR + '.' + AR + '_dn')
        # end

        return partConGRP, AR
Example #22
0
    def genBaseFace(self, mesh):
        skinMesh = rig.duplicate(mesh, n=mesh + '_Skin_Mesh')[0]
        self.skinMesh = skinMesh
        self.Mesh = mesh
        rig.transferAttributes(self.Mesh,
                               self.skinMesh,
                               transferUVs=1,
                               sampleSpace=5)
        rig.select(self.skinMesh)
        mel.eval('DeleteHistory')
        skinMeshShape = rig.listRelatives(skinMesh, s=True, ni=True)[0]
        meshShape = rig.listRelatives(mesh, s=True, ni=True)[0]

        self.scaleVal = self.distanceBetween('Lf_ear_P',
                                             'Rt_ear_P') / 3.39395596416
        FaceFolScale = rig.group(empty=True, n='Face_Scale_Grp')
        FaceDeformersGrp = rig.group(empty=True, n='Face_Deformers_Grp')
        self.faceRig = rig.group(empty=True, n='Face_Rigging_GRP')
        rig.addAttr(FaceFolScale, at='float', ln='scaleVal', dv=self.scaleVal)
        rig.addAttr(FaceFolScale, at='float', ln='signA', dv=11)
        rig.addAttr(FaceFolScale, at='float', ln='signB', dv=22)
        self.controller = CreateControler(
            13,
            [0.05 * self.scaleVal, 0.05 * self.scaleVal, 0.05 * self.scaleVal])

        cons = [
            objCon for objCon in [
                obj for obj in rig.ls(type='transform')
                if rig.attributeQuery('sign', n=obj, ex=True)
            ] if (78 == rig.getAttr(objCon +
                                    '.sign') or 71 == rig.getAttr(objCon +
                                                                  '.sign'))
        ]

        CLM = rig.createNode('closestPointOnMesh', n='Face_CLM', ss=True)
        rig.connectAttr(meshShape + '.outMesh', CLM + '.inMesh')

        JNTS = []
        FOLS = []
        EXFOLS = []
        self.allCons = []
        for con in cons:
            pos = rig.xform(con, q=True, t=True, ws=True)
            rig.setAttr(CLM + '.inPositionX', pos[0])
            rig.setAttr(CLM + '.inPositionY', pos[1])
            rig.setAttr(CLM + '.inPositionZ', pos[2])
            U = rig.getAttr(CLM + '.result.parameterU')
            V = rig.getAttr(CLM + '.result.parameterV')

            FOLShape = rig.createNode('follicle', n=con + '_FOLShape', ss=True)
            rig.connectAttr(meshShape + '.worldMesh[0]',
                            FOLShape + '.inputMesh')
            FOL = rig.listRelatives(FOLShape, p=True)[0]
            rig.connectAttr(FaceFolScale + '.scale', FOL + '.scale')
            rig.connectAttr(meshShape + '.worldMatrix[0]',
                            FOL + '.inputWorldMatrix')
            newFol = rig.rename(FOL, con + '_FOL')
            rig.connectAttr(FOLShape + '.outTranslate', newFol + '.translate')
            rig.connectAttr(FOLShape + '.outRotate', newFol + '.rotate')
            rig.setAttr(FOLShape + '.parameterU', U)
            rig.setAttr(FOLShape + '.parameterV', V)
            rig.setAttr(FOLShape + '.simulationMethod', 0)

            #        创建控制器
            CurConName = con.replace('_P', '_M')
            ConName = self.controller.SK_b03(CurConName)
            if 78 == rig.getAttr(con + '.sign'):
                rig.connectAttr(FaceFolScale + '.signA', ConName + '.sign')
            else:
                rig.connectAttr(FaceFolScale + '.signB', ConName + '.sign')
            ConNameShape = rig.listRelatives(ConName, s=True)[0]
            ConColor = rig.getAttr(
                rig.listRelatives(con, s=True)[0] + '.overrideColor')
            rig.setAttr(ConNameShape + '.overrideColor', ConColor)
            ConGRP = rig.group(ConName, n=ConName + '_GRP')
            MirrorGRP = rig.group(ConGRP, n=ConName + '_Mirror_GRP')

            #        生�骨骼
            rig.select(cl=True)
            FOLMatrix = rig.getAttr(FOLShape + '.worldMatrix[0]')
            jntName = rig.joint(n=CurConName + '_JNT')
            JNTGrp = rig.group(jntName, n=jntName + '_GRP')

            rig.parent(JNTGrp, ConName)
            rig.xform(MirrorGRP, matrix=FOLMatrix)
            rig.parent(MirrorGRP, FOL)

            rig.setAttr(jntName + '.visibility', 0)
            rig.setAttr(FOLShape + '.visibility', 0)
            if 11 == rig.getAttr(ConName + '.sign'):
                JNTS.append(jntName)
            else:
                EXFOLS.append(FOLShape)
            FOLS.append(FOL)
            self.allCons.append(ConName)

        SkinClus = rig.skinCluster(JNTS, skinMesh, n='Face_BlendShape_SKIN')[0]
        infs = rig.skinCluster(SkinClus, q=True, inf=True)
        for i, inf in enumerate(infs):
            MirrorGRP = inf.replace('_M_JNT', '_M_Mirror_GRP')
            rig.connectAttr(MirrorGRP + '.worldInverseMatrix[0]',
                            SkinClus + '.bindPreMatrix[' + str(i) + ']')

            #            if 'Rt' == MirrorGRP.split('_')[0]:
            #                rig.setAttr(MirrorGRP+'.sx',-1)
            #                rig.setAttr(MirrorGRP+'.sy',-1)
            #            if 'Lf' == MirrorGRP.split('_')[0]:
            #                rig.setAttr(MirrorGRP+'.rx',180)
            #                rig.setAttr(MirrorGRP+'.sz',-1)

            #            校正控制器轴向到世界
            #            rig.rotate(0,0,0,MirrorGRP,ws = True)
            #            校正控制器轴向到法线向上方向指向世界的Y方向。
            #            MirrorMatrix = rig.getAttr(MirrorGRP+'.worldMatrix[0]')
            #            aimEmptyGrp = rig.group(n = MirrorGRP+'_Aim',empty = True)
            #            rig.xform(aimEmptyGrp,matrix = MirrorMatrix)
            #            rig.parent(aimEmptyGrp,MirrorGRP)
            #            rig.setAttr(aimEmptyGrp+'.tz',1)
            #            rig.parent(aimEmptyGrp,w = True)
            #            rig.aimConstraint(aimEmptyGrp,MirrorGRP,aimVector = (0,0,1),upVector = (0,1,0),worldUpType = 'scene')
            #            rig.delete(aimEmptyGrp)

            #            根据规定的轴向校正
            SK_ConOrientation(MirrorGRP.replace('_Mirror_GRP', ''))

        if EXFOLS:
            for fol in EXFOLS:
                rig.connectAttr(skinMeshShape + '.worldMesh[0]',
                                fol + '.inputMesh',
                                f=True)
                MirrorGRP = fol.replace('_P_FOLShape', '_M_Mirror_GRP')
                #                rig.setAttr(childGrp+'.sz',-1)

                #               校正控制器轴向到世界
                #               rig.rotate(0,0,0,MirrorGRP,ws = True)
                #               校正控制器轴向到法线向上方向指向世界的Y方向。
                #                MirrorMatrix = rig.getAttr(MirrorGRP+'.worldMatrix[0]')
                #                aimEmptyGrp = rig.group(n = MirrorGRP+'_Aim',empty = True)
                #                rig.xform(aimEmptyGrp,matrix = MirrorMatrix)
                #                rig.parent(aimEmptyGrp,MirrorGRP)
                #                rig.setAttr(aimEmptyGrp+'.tz',1)
                #                rig.parent(aimEmptyGrp,w = True)
                #                rig.aimConstraint(aimEmptyGrp,MirrorGRP,aimVector = (0,0,1),upVector = (0,1,0),worldUpType = 'scene')
                #                rig.delete(aimEmptyGrp)

                #                根据规定的轴向校正
                SK_ConOrientation(MirrorGRP.replace('_Mirror_GRP', ''))

        FOLALLGRP = rig.group(FOLS, n='All_FOLS_GRP')
        rig.parent(FaceFolScale, self.Mesh, self.skinMesh, FOLALLGRP,
                   FaceDeformersGrp)