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') #连接属性
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曲线权重