Пример #1
0
    def createJoint(self):
        tempCurveName = rig.curve(d=3, p=self.curve)  #生成曲线
        curCurveName = rig.rename(tempCurveName, self.tempCruveName)  #重命名曲线
        curCurveNameShape = rig.listRelatives(curCurveName, s=True)[0]  #获得形节点
        CurveInfo = CA.curveAverage()
        posInfo = CurveInfo.getInfo(curCurveNameShape, self.num)[1]  #获得位置信息
        rig.delete(curCurveName)  #删除曲线

        #生成骨骼
        rig.select(cl=True)
        for i, pos in enumerate(posInfo):
            jnt = rig.joint(p=pos, n=self.name + '_' + str(i) + 'Joint')
            self.connectAddAttr(jnt, 'CTRLJoint')  #连接属性
Пример #2
0
    def skinCurve(self):
        jointCurve = {
            'out_LfNasolabialCurve':
            [u'Lf_Cheek_Joint', u'JawMain_Joint', u'Head_Joint'],
            'out_eyebrowCurve':
            [u'Lf_Brow_Joint', u'Rt_Brow_Joint', u'Head_Joint'],
            'out_RtNasolabialCurve':
            [u'Rt_Cheek_Joint', u'JawMain_Joint', u'Head_Joint'],
            'out_UpMouthCurve':
            [u'Rt_CornerLip_Joint', u'Up_Lip_Joint', u'Lf_CornerLip_Joint'],
            'out_DnMouthCurve':
            [u'Dn_Lip_Joint', u'Rt_CornerLip_Joint', u'Lf_CornerLip_Joint']
        }

        #----------------------------------------------- 创建新的的曲线和骨骼并蒙皮,用于生成临时的权重
        for cur in jointCurve:
            tempCurveOrigen = rig.duplicate(cur, n=cur +
                                            '_Skin')[0]  #复制InputCurve曲线
            self.tempCurve.append(tempCurveOrigen)  #增加到临时组

            SkinOrigen = rig.skinCluster(tempCurveOrigen,
                                         jointCurve[cur],
                                         tsb=True)[0]  #蒙皮

            if cur == 'out_LfNasolabialCurve':
                joints = []
                tempCurve = rig.duplicate(cur, n=cur +
                                          '_Skin_CA')[0]  #复制InputCurve曲线
                self.tempCurve.append(tempCurve)  #增加到临时组
                tempCurveShape = rig.listRelatives(tempCurve, s=True)[0]  #形节点
                TempCA = CA.curveAverage()
                curvePos = TempCA.getInfo(tempCurveShape, 3)[1]
                for i, pos in enumerate(curvePos):  #生成临时骨骼
                    rig.select(cl=True)
                    jnt = rig.joint(p=pos, n=cur + '_' + str(i) + 'Joint')
                    joints.append(jnt)
                    self.tempJoint.append(jnt)  #增加到临时组
                Skin = rig.skinCluster(tempCurve, joints, tsb=True)[0]  #蒙皮
                listInfs = {
                    'Lf_Cheek_Joint': 'out_LfNasolabialCurve_1Joint',
                    'JawMain_Joint': 'out_LfNasolabialCurve_2Joint',
                    'Head_Joint': 'out_LfNasolabialCurve_0Joint'
                }
                self.computeWeights(Skin, SkinOrigen, listInfs)

            if cur == 'out_eyebrowCurve':
                joints = []
                tempCurve = rig.duplicate(cur, n=cur +
                                          '_Skin_CA')[0]  #复制InputCurve曲线
                self.tempCurve.append(tempCurveOrigen)  #增加到临时组
                tempCurveShape = rig.listRelatives(tempCurve, s=True)[0]  #形节点
                TempCA = CA.curveAverage()
                curvePos = TempCA.getInfo(tempCurveShape, 9)[1]
                for i, pos in enumerate(curvePos):  #生成临时骨骼
                    rig.select(cl=True)
                    jnt = rig.joint(p=pos, n=cur + '_' + str(i) + 'Joint')
                    joints.append(jnt)
                    self.tempJoint.append(jnt)  #增加到临时组
                Skin = rig.skinCluster(tempCurve, joints, tsb=True)[0]  #蒙皮
                listInfs = {
                    'Lf_Brow_Joint':
                    'out_eyebrowCurve_3Joint',
                    'Rt_Brow_Joint':
                    'out_eyebrowCurve_5Joint',
                    'Head_Joint': [
                        u'out_eyebrowCurve_2Joint', u'out_eyebrowCurve_1Joint',
                        u'out_eyebrowCurve_0Joint', u'out_eyebrowCurve_8Joint',
                        u'out_eyebrowCurve_7Joint', u'out_eyebrowCurve_6Joint',
                        u'out_eyebrowCurve_4Joint'
                    ]
                }
                self.computeWeights(Skin, SkinOrigen, listInfs)

            if cur == 'out_RtNasolabialCurve':
                joints = []
                tempCurve = rig.duplicate(cur, n=cur +
                                          '_Skin_CA')[0]  #复制InputCurve曲线
                self.tempCurve.append(tempCurveOrigen)  #增加到临时组
                tempCurveShape = rig.listRelatives(tempCurve, s=True)[0]  #形节点
                TempCA = CA.curveAverage()
                curvePos = TempCA.getInfo(tempCurveShape, 3)[1]
                for i, pos in enumerate(curvePos):  #生成临时骨骼
                    rig.select(cl=True)
                    jnt = rig.joint(p=pos, n=cur + '_' + str(i) + 'Joint')
                    joints.append(jnt)
                    self.tempJoint.append(jnt)  #增加到临时组
                Skin = rig.skinCluster(tempCurve, joints, tsb=True)[0]  #蒙皮
                listInfs = {
                    'Rt_Cheek_Joint': 'out_RtNasolabialCurve_1Joint',
                    'JawMain_Joint': 'out_RtNasolabialCurve_2Joint',
                    'Head_Joint': 'out_RtNasolabialCurve_0Joint'
                }
                self.computeWeights(Skin, SkinOrigen, listInfs)

            if cur == 'out_UpMouthCurve':
                pass
            if cur == 'out_DnMouthCurve':
                pass

        #------------------------------------------------------------- 对base曲线蒙皮
        allInfsJoint = []
        for cur in jointCurve:
            curShape = rig.listRelatives(cur + '_Skin', s=True)[0]  #获得形节点
            SkinClus = CA.getDeformerNode()
            skin = SkinClus.getInfo(curShape)  #获得skincluster
            infs = rig.skinCluster(skin, q=True, inf=True)
            allInfsJoint.extend(infs)
        infsSet = set(allInfsJoint)
        baseSkin = rig.skinCluster([inf for inf in infsSet],
                                   self.baseCurve,
                                   tsb=True)[0]

        #--------------------------------------------------------- 将权重拷贝到base曲线上
        for cur in jointCurve:
            curShape = rig.listRelatives(cur + '_Skin', s=True)[0]  #获得形节点
            SkinClus = CA.getDeformerNode()
            skin = SkinClus.getInfo(curShape)  #获得skincluster

            vtxs = rig.ls(curShape + '.cv[*]', fl=True)
            infs = rig.skinCluster(skin, q=True, inf=True)
            for vtx in vtxs:
                Weights = rig.skinPercent(skin, vtx, q=True, v=True)
                tvInfo = zip(infs, Weights)  #权重数据
                cv = vtx.replace('_Skin.cv', 'Shape.controlPoints')  #切分成CV点
                con = self.numToController[cv]  #找到对应控制器
                baseVtx = self.curveToController[con]  #找到点的
                rig.skinPercent(baseSkin,
                                self.baseCurve + '.cv[' + str(baseVtx) + ']',
                                tv=tvInfo)  #设置base曲线权重