def ctrlBindSkinBtnCmd(self, *args): """Function to execute when Create button is pressed""" print('给控制器蒙皮(ikspline)') b_curve = cmds.ls('curve1') obj_ls = self.c_jnts + b_curve print(obj_ls) cmds.select(obj_ls) cmds.SmoothBindSkin(tsb=True)
def create_JNT_separate_CT(): sepaJNT_selPLY_CT = cmds.ls(sl=1) for b in sepaJNT_selPLY_CT: # Bounding Box : centerPivot sepaJNT_selPLY_bbInfo_CT = cmds.xform(b, worldSpace=1, query=1, boundingBox=1) sepaJNT_bbCT_X_CT = (sepaJNT_selPLY_bbInfo_CT[0] + sepaJNT_selPLY_bbInfo_CT[3]) / 2.0 sepaJNT_bbCT_Y_CT = (sepaJNT_selPLY_bbInfo_CT[1] + sepaJNT_selPLY_bbInfo_CT[4]) / 2.0 sepaJNT_bbCT_Z_CT = (sepaJNT_selPLY_bbInfo_CT[2] + sepaJNT_selPLY_bbInfo_CT[5]) / 2.0 cmds.select(deselect=1) # create joint sepaJNT_CT = cmds.joint(p=(sepaJNT_bbCT_X_CT, sepaJNT_bbCT_X_CT, sepaJNT_bbCT_X_CT), n=b.replace('PLY', 'JNT')) cmds.joint(sepaJNT_CT, edit=True, radius=0.5) sepaJNT_rename_CT = cmds.rename('C_Skin_%s' % sepaJNT_CT) # skinBind cmds.select(b, replace=1) cmds.select(sepaJNT_rename_CT, add=1) cmds.SmoothBindSkin(toSelectedBones=1) # Bounding Box : Size sepaJNT_bbsX_CT = cmds.getAttr("%s.boundingBoxSizeX" % b) / 1.5 sepaJNT_bbsY_CT = cmds.getAttr("%s.boundingBoxSizeY" % b) / 1.5 sepaJNT_bbsZ_CT = cmds.getAttr("%s.boundingBoxSizeZ" % b) / 1.5 cmds.select(deselect=1) # CON sepaJNT_CON_CT = cmds.curve(degree=1, p=[(-1, 1, -1), (1, 1, -1), (1, 1, 1), (-1, 1, 1), (-1, -1, 1), (-1, -1, -1), (-1, 1, -1), (-1, 1, 1), (-1, -1, 1), (1, -1, 1), (1, 1, 1), (1, 1, -1), (1, -1, -1), (1, -1, 1), (1, -1, -1), (-1, -1, -1)]) sepaJNT_CON_rename_CT = cmds.rename(b.replace('PLY', 'CON')) CL.con_overrideColor_SET() sepaJNT_NUL_CT = cmds.group(em=1, n=b.replace('PLY', 'NUL')) cmds.parent(sepaJNT_CON_rename_CT, sepaJNT_NUL_CT) cmds.scale(sepaJNT_bbsX_CT, sepaJNT_bbsY_CT, sepaJNT_bbsZ_CT, sepaJNT_NUL_CT) cmds.move(sepaJNT_bbCT_X_CT, sepaJNT_bbCT_Y_CT, sepaJNT_bbCT_Z_CT, sepaJNT_NUL_CT) cmds.move(0, 0, 0, "%s.scalePivot" % sepaJNT_NUL_CT, "%s.rotatePivot" % sepaJNT_NUL_CT) cmds.move(0, 0, 0, "%s.scalePivot" % sepaJNT_CON_rename_CT, "%s.rotatePivot" % sepaJNT_CON_rename_CT) cmds.makeIdentity(sepaJNT_NUL_CT, apply=1) cmds.parentConstraint(sepaJNT_CON_rename_CT, sepaJNT_rename_CT, mo=1) cmds.parent(sepaJNT_rename_CT, 'joint_GRP') cmds.setAttr('joint_GRP.visibility', 0) cmds.parent(sepaJNT_NUL_CT, 'control_GRP') con_ChannelBox() cmds.select(deselect=1)
def create_JNT_combine_CT(): combJNT_selPLY_CT = cmds.ls(sl=True) combJNT_selPLY_copy_CT = cmds.duplicate(combJNT_selPLY_CT) combJNT_tempPLY_CT = cmds.polyUnite(combJNT_selPLY_copy_CT, mergeUVSets=1, constructionHistory=True, n=combJNT_selPLY_CT[0].replace( 'PLY', 'RE')) cmds.delete( combJNT_tempPLY_CT, ch=1) # like a historyDelete and delete emptyGroup, Also Node Check cmds.select(combJNT_tempPLY_CT[0]) boundingBox_Info() cmds.select(deselect=True) # create joint combJNT_CT = cmds.joint(p=(propRig_bbX_CT[-1], propRig_bbY_CT[-1], propRig_bbZ_CT[-1]), n=combJNT_selPLY_CT[0].replace('PLY', 'JNT')) cmds.joint(combJNT_CT, edit=True, radius=0.5) combJNT_rename_CT = cmds.rename('C_Skin_%s' % combJNT_CT) # skinBind cmds.select(combJNT_selPLY_CT, replace=True) cmds.select(combJNT_rename_CT, add=True) cmds.SmoothBindSkin(toSelectedBones=True) # CON cmds.select(deselect=1) combJNT_CON_CT = cmds.curve(degree=1, p=[(-1, 1, -1), (1, 1, -1), (1, 1, 1), (-1, 1, 1), (-1, -1, 1), (-1, -1, -1), (-1, 1, -1), (-1, 1, 1), (-1, -1, 1), (1, -1, 1), (1, 1, 1), (1, 1, -1), (1, -1, -1), (1, -1, 1), (1, -1, -1), (-1, -1, -1)]) combJNT_CON_rename_CT = cmds.rename(combJNT_selPLY_CT[0].replace( 'PLY', 'CON')) combJNT_CONShape_CT = cmds.listRelatives(combJNT_CON_rename_CT, shapes=True) CL.con_overrideColor_SET() combJNT_NUL_CT = cmds.group(em=True, n=combJNT_selPLY_CT[0].replace('PLY', 'NUL')) cmds.parent(combJNT_CON_rename_CT, combJNT_NUL_CT) cmds.scale(propRig_bbsX[-1], propRig_bbsY[-1], propRig_bbsZ[-1], combJNT_NUL_CT) cmds.move(propRig_bbX_CT[-1], propRig_bbY_CT[-1], propRig_bbZ_CT[-1], combJNT_NUL_CT) cmds.move(0, 0, 0, "%s.scalePivot" % combJNT_NUL_CT, "%s.rotatePivot" % combJNT_NUL_CT) cmds.move(0, 0, 0, "%s.scalePivot" % combJNT_CON_rename_CT, "%s.rotatePivot" % combJNT_CON_rename_CT) cmds.makeIdentity(combJNT_NUL_CT, apply=1) con_ChannelBox() cmds.delete(combJNT_tempPLY_CT[0]) cmds.parentConstraint(combJNT_CON_rename_CT, combJNT_rename_CT, mo=1) cmds.parent(combJNT_rename_CT, 'joint_GRP') cmds.setAttr('joint_GRP.visibility', 0) cmds.parent(combJNT_NUL_CT, 'control_GRP') cmds.select(deselect=True)
def create_JNT_separate(): # sepaJNT_selPLY = cmds.ls(sl=True) for a in sepaJNT_selPLY: # Bounding Box : centerPivot sepaJNT_selPLY_bbInfo = cmds.xform(a, worldSpace=True, query=True, boundingBox=True) sepaJNT_bbCT_X = (sepaJNT_selPLY_bbInfo[0] + sepaJNT_selPLY_bbInfo[3]) / 2.0 sepaJNT_bbCT_Y = (sepaJNT_selPLY_bbInfo[1] + sepaJNT_selPLY_bbInfo[4]) / 2.0 sepaJNT_bbCT_Z = (sepaJNT_selPLY_bbInfo[2] + sepaJNT_selPLY_bbInfo[5]) / 2.0 # create joint cmds.select(deselect=True) sepaJNT_selPLY_nameList = a.split('_') sepaJNT = cmds.joint(p=(sepaJNT_bbCT_X, sepaJNT_bbCT_Y, sepaJNT_bbCT_Z), n=a.replace('PLY', 'JNT')) sepaJNT_rename = cmds.rename('C_Skin_%s' % sepaJNT) cmds.joint(sepaJNT_rename, edit=True, radius=0.5) # skinBind cmds.select(a, replace=True) cmds.select(sepaJNT_rename, add=True) cmds.SmoothBindSkin(toSelectedBones=True) # Bounding Box : Size sepaJNT_bbsX = cmds.getAttr("%s.boundingBoxSizeX" % a) / 1.5 sepaJNT_bbsY = cmds.getAttr("%s.boundingBoxSizeY" % a) / 1.5 sepaJNT_bbsZ = cmds.getAttr("%s.boundingBoxSizeZ" % a) / 1.5 # CON cmds.select(deselect=True) sepaJNT_CON = cmds.curve(degree=1, p=[(-1, 1, -1), (1, 1, -1), (1, 1, 1), (-1, 1, 1), (-1, -1, 1), (-1, -1, -1), (-1, 1, -1), (-1, 1, 1), (-1, -1, 1), (1, -1, 1), (1, 1, 1), (1, 1, -1), (1, -1, -1), (1, -1, 1), (1, -1, -1), (-1, -1, -1)]) sepaJNT_CON_rename = cmds.rename(a.replace('PLY', 'CON')) CL.con_overrideColor_SET() sepaJNT_NUL = cmds.group(em=True, n=a.replace('PLY', 'NUL')) cmds.parent(sepaJNT_CON_rename, sepaJNT_NUL) cmds.scale(sepaJNT_bbsX, sepaJNT_bbsY, sepaJNT_bbsZ, sepaJNT_NUL) cmds.move(sepaJNT_bbCT_X, sepaJNT_bbCT_Y, sepaJNT_bbCT_Z, sepaJNT_NUL) cmds.makeIdentity(sepaJNT_NUL, apply=1, s=1) cmds.parentConstraint(sepaJNT_CON_rename, sepaJNT_rename, mo=1) cmds.parent(sepaJNT_rename, 'joint_GRP') cmds.setAttr('joint_GRP.visibility', 0) cmds.parent(sepaJNT_NUL, 'control_GRP') con_ChannelBox() cmds.select(deselect=1)
def create_curve(): _curve_arm_1 = pm.curve(p=[(2.2, 5, -0.05), (1.45, 5, -0.05)], k=[0, 1], d=1) _curve_arm_2 = pm.curve(p=[(1.45, 5, -0.05), (0.5, 5, 0)], k=[0, 1], d=1) _curve_arm_4 = pm.curve(p=[(-2.2, 5, -0.05), (-1.45, 5, -0.05)], k=[0, 1], d=1) _curve_arm_5 = pm.curve(p=[(-1.45, 5, -0.05), (-0.5, 5, 0)], k=[0, 1], d=1) r_leg_thigh_curve = pm.curve(p=[(-0.4, 3.2, 0.05), (-0.4, 1.75, 0.185)], k=[0, 1], d=1) l_leg_thigh_curve = pm.curve(p=[(0.4, 3.2, 0.05), (0.4, 1.75, 0.185)], k=[0, 1], d=1) r_leg_knee_curve = pm.curve(p=[(-0.4, 1.75, 0.185), (-0.4, 0.35, 0)], k=[0, 1], d=1) l_leg_knee_curve = pm.curve(p=[(0.4, 1.75, 0.185), (0.4, 0.35, 0)], k=[0, 1], d=1) all_curves = [ _curve_arm_1, _curve_arm_2, _curve_arm_4, _curve_arm_5, r_leg_thigh_curve, l_leg_thigh_curve, r_leg_knee_curve, l_leg_knee_curve ] self.curves_grp = pm.group(em=True, n='x__curves__grp__', w=True) pm.select(self.all_joint, r=True) pm.select(all_curves, add=True) mc.SmoothBindSkin() pm.parent(_curve_arm_1, _curve_arm_2, _curve_arm_4, _curve_arm_5, r_leg_thigh_curve, l_leg_thigh_curve, r_leg_knee_curve, l_leg_knee_curve, self.spine_curve, cluster_grp, self.curves_grp) return self.curves_grp
def jointsSkinCopys(self): # self.Shape = cmds.listRelatives( self.originMesh[0], s=True ) # self.Cluster = cmds.listConnections( self.Shape[0] + '.inMesh' ) self.Cluster = mel.eval('findRelatedSkinCluster ' + self.originMesh[0]) self.joints = cmds.listConnections(self.Cluster + '.matrix') print self.joints cmds.select(cl=True) for x in self.joints: cmds.select(x, add=True) cmds.select(self.objects, add=True) cmds.SmoothBindSkin() for x in self.objects: cmds.select(self.originMesh) cmds.select(x, add=True) cmds.CopySkinWeights() cmds.select(cl=True)
import maya.cmds as cmds cube_ = cmds.polyCube() cube_shape = cmds.polyCube(n='shape_cube') cmds.select(cube_shape[0], cube_[0]) cmds.blendShape(n="Test_SHP") cmds.delete('shape_cube') cmds.select(cl=1) joint_ = cmds.joint() cmds.select(cube_, joint_) cmds.SmoothBindSkin() cmds.select(cube_[0]) shapes = cmds.listRelatives(cmds.ls(sl=1), s=1)[0] blendShape = cmds.listConnections(shapes, type="blendShape") print blendShape
def Rig_Generate(self): ############################################## ########## 检查物体是否存在 ############ ############################################## if self.Rig_Obj_Check(): return # 开启还原按钮 self.Rig_Back_Btn.setEnabled(True) ############################################## ############# 获取变量 ############### ############################################## # 获取数值 Main_JNT_Num = int( self.Main_JNT_Num.text()) if self.Main_JNT_Num.text() != "" else 20 IK_JNT_Num = int( self.IK_JNT_Num.text()) if self.IK_JNT_Num.text() != "" else 20 Curve_Span_Num = int(self.Curve_Span_Num.text() ) if self.Curve_Span_Num.text() != "" else 20 # 获取命名 Geo_Name_Text = self.Geo_Name_Text.text( ) if self.Geo_Name_Text.text() != "" else "TengMan" Main_JNT_Name_Text = self.Main_JNT_Name_Text.text( ) if self.Main_JNT_Name_Text.text() != "" else "gan_joint" IK_JNT_Name_Text = self.IK_JNT_Name_Text.text( ) if self.IK_JNT_Name_Text.text() != "" else "ganJoint" Curve_Name_Text = self.Curve_Name_Text.text( ) if self.Curve_Name_Text.text() != "" else "gan" IK_CTRL_Name_Text = self.IK_CTRL_Name_Text.text( ) if self.IK_CTRL_Name_Text.text() != "" else "gan_ctrl" Start_Ctrl_Text = self.Start_Ctrl_Text.text( ) if self.Start_Ctrl_Text.text() != "" else "main2" End_IK_Text = self.End_IK_Text.text( ) if self.End_IK_Text.text() != "" else "main" Character_Ctrl_Text = self.Character_Ctrl_Text.text( ) if self.Character_Ctrl_Text.text() != "" else "Character" # 获取按钮颜色 styleSheet = self.IK_CTRL_ColorBtn.styleSheet().split("(")[1].split( ",") r = float(styleSheet[0]) / 255 g = float(styleSheet[1]) / 255 b = float(styleSheet[2].split(")")[0]) / 255 IK_CTRL_ColorBtn = (r, g, b) styleSheet = self.Start_Ctrl_ColorBtn.styleSheet().split("(")[1].split( ",") r = float(styleSheet[0]) / 255 g = float(styleSheet[1]) / 255 b = float(styleSheet[2].split(")")[0]) / 255 Start_Ctrl_ColorBtn = (r, g, b) styleSheet = self.End_IK_ColorBtn.styleSheet().split("(")[1].split(",") r = float(styleSheet[0]) / 255 g = float(styleSheet[1]) / 255 b = float(styleSheet[2].split(")")[0]) / 255 End_IK_ColorBtn = (r, g, b) styleSheet = self.Character_Ctrl_ColorBtn.styleSheet().split( "(")[1].split(",") r = float(styleSheet[0]) / 255 g = float(styleSheet[1]) / 255 b = float(styleSheet[2].split(")")[0]) / 255 Character_Ctrl_ColorBtn = (r, g, b) ############################################## ############### 绑定 ############### ############################################## # 获取起始节点和结束节点坐标 cmds.select(self.Start_JNT) Start_JNT_Coordinate = cmds.xform(q=True, a=True, ws=True, piv=True) cmds.select(self.End_JNT) End_JNT_Coordinate = cmds.xform(q=True, a=True, ws=True, piv=True) cmds.select(cl=True) # 批量生成主关节 Xdistance = End_JNT_Coordinate[0] - Start_JNT_Coordinate[0] Ydistance = End_JNT_Coordinate[1] - Start_JNT_Coordinate[1] Zdistance = End_JNT_Coordinate[2] - Start_JNT_Coordinate[2] # 主控制器 cmds.circle(nr=(Xdistance, Ydistance, Zdistance), c=(End_JNT_Coordinate[0], End_JNT_Coordinate[1], End_JNT_Coordinate[2]), n=End_IK_Text, r=1) Main_Ctrl = cmds.ls(sl=True)[0] cmds.setAttr(Main_Ctrl + ".overrideEnabled", 1) if mel.eval("getApplicationVersionAsFloat;") >= 2017: cmds.setAttr(Main_Ctrl + ".overrideRGBColors", 1) cmds.setAttr(Main_Ctrl + ".overrideColorRGB", End_IK_ColorBtn[0], End_IK_ColorBtn[1], End_IK_ColorBtn[2]) else: cmds.setAttr(Main_Ctrl + ".overrideRGBColors", 0) cmds.setAttr(Main_Ctrl + ".overrideColor", self.End_IK_ColorSlider.value()) cmds.setAttr(Main_Ctrl + ".visibility", lock=True, keyable=False, channelBox=False) cmds.setAttr(Main_Ctrl + ".sx", lock=True, keyable=False, channelBox=False) cmds.setAttr(Main_Ctrl + ".sy", lock=True, keyable=False, channelBox=False) cmds.setAttr(Main_Ctrl + ".sz", lock=True, keyable=False, channelBox=False) cmds.addAttr(ln="show_mod", at="double", min=0, max=1, dv=1) cmds.setAttr(Main_Ctrl + ".show_mod", edit=True, keyable=True) cmds.addAttr(ln="grow", at="double", min=0, max=10, dv=10) for Main_JNT in range(Main_JNT_Num): x = Xdistance * Main_JNT / (Main_JNT_Num - 1) + Start_JNT_Coordinate[0] y = Ydistance * Main_JNT / (Main_JNT_Num - 1) + Start_JNT_Coordinate[1] z = Zdistance * Main_JNT / (Main_JNT_Num - 1) + Start_JNT_Coordinate[2] JNT = cmds.joint(p=(x, y, z), n=Main_JNT_Name_Text + str(Main_JNT + 1)) cmds.setAttr(JNT + ".tx", k=False, cb=True) cmds.setAttr(JNT + ".ty", k=False, cb=True) cmds.setAttr(JNT + ".tz", k=False, cb=True) cmds.setAttr(JNT + ".rx", k=False, cb=True) cmds.setAttr(JNT + ".ry", k=False, cb=True) cmds.setAttr(JNT + ".rz", k=False, cb=True) cmds.setAttr(JNT + ".sx", k=False, cb=True) cmds.setAttr(JNT + ".sy", k=False, cb=True) cmds.setAttr(JNT + ".sz", k=False, cb=True) cmds.setAttr(JNT + ".visibility", k=False, cb=True) cmds.expression(s=JNT + ".sx = " + Main_Ctrl + ".grow/10/" + str(Main_JNT + 1)) cmds.expression(s=JNT + ".sy = " + Main_Ctrl + ".grow/10/" + str(Main_JNT + 1)) cmds.expression(s=JNT + ".sz = " + Main_Ctrl + ".grow/10/" + str(Main_JNT + 1)) if Main_JNT == 0: Start_Main_JNT = cmds.ls(sl=True)[0] # 生成IK控制器 End_Main_JNT = cmds.ls(sl=True) cmds.select(Start_Main_JNT) cmds.select(End_Main_JNT, tgl=True) ikList = cmds.ikHandle(sol="ikSplineSolver") # 生成控制器 cmds.select(cl=True) CtrlList = [] for IK_JNT in range(IK_JNT_Num): x = Xdistance * IK_JNT / (IK_JNT_Num - 1) + Start_JNT_Coordinate[0] y = Ydistance * IK_JNT / (IK_JNT_Num - 1) + Start_JNT_Coordinate[1] z = Zdistance * IK_JNT / (IK_JNT_Num - 1) + Start_JNT_Coordinate[2] cmds.joint(p=(x, y, z), n=IK_JNT_Name_Text + str(IK_JNT + 1)) Curent_JNT = cmds.ls(sl=True)[0] IK_JNT_Coordinate = cmds.xform(q=True, ws=True, t=True) cmds.circle(nr=(Xdistance, Ydistance, Zdistance), c=(IK_JNT_Coordinate[0], IK_JNT_Coordinate[1], IK_JNT_Coordinate[2]), n=IK_CTRL_Name_Text + str(IK_JNT + 1), r=0.4) IK_Ctrl = cmds.ls(sl=True)[0] cmds.setAttr(IK_Ctrl + ".overrideEnabled", 1) if mel.eval("getApplicationVersionAsFloat;") >= 2017: cmds.setAttr(IK_Ctrl + ".overrideRGBColors", 1) cmds.setAttr(IK_Ctrl + ".overrideColorRGB", IK_CTRL_ColorBtn[0], IK_CTRL_ColorBtn[1], IK_CTRL_ColorBtn[2]) else: cmds.setAttr(IK_Ctrl + ".overrideRGBColors", 0) cmds.setAttr(IK_Ctrl + ".overrideColor", self.IK_CTRL_ColorSlider.value()) cmds.CenterPivot() # 冻结变换 cmds.makeIdentity(apply=True, t=1, r=1, s=1, n=2) CtrlList.append(cmds.ls(sl=True)[0]) cmds.parentConstraint(CtrlList[IK_JNT], Curent_JNT) cmds.select(Curent_JNT) cmds.setAttr(Curent_JNT + ".tx", k=False, cb=True) cmds.setAttr(Curent_JNT + ".ty", k=False, cb=True) cmds.setAttr(Curent_JNT + ".tz", k=False, cb=True) cmds.setAttr(Curent_JNT + ".rx", k=False, cb=True) cmds.setAttr(Curent_JNT + ".ry", k=False, cb=True) cmds.setAttr(Curent_JNT + ".rz", k=False, cb=True) cmds.setAttr(Curent_JNT + ".sx", k=False, cb=True) cmds.setAttr(Curent_JNT + ".sy", k=False, cb=True) cmds.setAttr(Curent_JNT + ".sz", k=False, cb=True) cmds.setAttr(Curent_JNT + ".visibility", k=False, cb=True) if IK_JNT == 0: Start_IK_JNT = cmds.ls(sl=True)[0] # 将IK关节蒙皮到曲线上 cmds.select(ikList[2]) cmds.rebuildCurve(rt=0, s=Curve_Span_Num) cmds.select(Start_IK_JNT, hi=True) cmds.select(ikList[2], tgl=True) # 绑定设置 cmds.optionVar(iv=('bindTo', 2)) cmds.optionVar(iv=('skinMethod', 1)) cmds.optionVar(iv=('multipleBindPosesOpt', 1)) cmds.optionVar(iv=('bindMethod', 1)) cmds.optionVar(iv=('removeUnusedInfluences', 0)) cmds.optionVar(iv=('colorizeSkeleton', 0)) cmds.optionVar(iv=('maxInfl', 3)) cmds.optionVar(iv=('normalizeWeights', 2)) cmds.optionVar(iv=('obeyMaxInfl', 2)) cmds.SmoothBindSkin() # 绑定主物体 cmds.select(Start_Main_JNT, hi=True) cmds.select(self.Rig_Obj, tgl=True) cmds.SmoothBindSkin() ############################################## ############# 管理层级 ############### ############################################## # 删除参考 if self.Delete_CheckBox.isChecked(): cmds.delete(self.Start_JNT) cmds.delete(self.End_JNT) # 模型打组 cmds.select(self.Rig_Obj) Geo_Grp = cmds.group(n=Geo_Name_Text + "_geo") # 控制器打组 CtrlList = list(reversed(CtrlList)) Grp = "" for Ctrl in CtrlList: cmds.select(Ctrl) cmds.group(n=Ctrl + "_C") IKFKC_Grp = cmds.group(n=Ctrl + "_IKFKC") if Grp != "": cmds.parent(Grp, IKFKC_Grp) cmds.select(IKFKC_Grp) Grp = cmds.group(n=Ctrl + "_G") # MotionSystem 打组 cmds.select(Start_IK_JNT) temp = cmds.group(n=Start_IK_JNT + "_G") cmds.setAttr(temp + ".visibility", 0) cmds.setAttr(temp + ".visibility", lock=True) cmds.setAttr(temp + ".tx", lock=True) cmds.setAttr(temp + ".ty", lock=True) cmds.setAttr(temp + ".tz", lock=True) cmds.setAttr(temp + ".rx", lock=True) cmds.setAttr(temp + ".ry", lock=True) cmds.setAttr(temp + ".rz", lock=True) cmds.setAttr(temp + ".sx", lock=True) cmds.setAttr(temp + ".sy", lock=True) cmds.setAttr(temp + ".sz", lock=True) cmds.select(Grp, tgl=True) MotionSystem_Grp = cmds.group(n="MotionSystem") # DeformationSystem 打组 cmds.select(Start_Main_JNT) Start_Main_JNT_Grp = cmds.group(n=Start_Main_JNT + "_G") cmds.setAttr(Start_Main_JNT_Grp + ".visibility", 0) cmds.setAttr(Start_Main_JNT_Grp + ".visibility", lock=True) cmds.setAttr(Start_Main_JNT_Grp + ".tx", lock=True) cmds.setAttr(Start_Main_JNT_Grp + ".ty", lock=True) cmds.setAttr(Start_Main_JNT_Grp + ".tz", lock=True) cmds.setAttr(Start_Main_JNT_Grp + ".rx", lock=True) cmds.setAttr(Start_Main_JNT_Grp + ".ry", lock=True) cmds.setAttr(Start_Main_JNT_Grp + ".rz", lock=True) cmds.setAttr(Start_Main_JNT_Grp + ".sx", lock=True) cmds.setAttr(Start_Main_JNT_Grp + ".sy", lock=True) cmds.setAttr(Start_Main_JNT_Grp + ".sz", lock=True) DeformationSystem_Grp = cmds.group(n="DeformationSystem") # 主控制器打组 cmds.circle(nr=(Xdistance, Ydistance, Zdistance), c=(Start_JNT_Coordinate[0], Start_JNT_Coordinate[1], Start_JNT_Coordinate[2]), n=Start_Ctrl_Text, r=1) Main2_Ctrl = cmds.ls(sl=True)[0] cmds.setAttr(Main2_Ctrl + ".overrideEnabled", 1) if mel.eval("getApplicationVersionAsFloat;") >= 2017: cmds.setAttr(Main2_Ctrl + ".overrideRGBColors", 1) cmds.setAttr(Main2_Ctrl + ".overrideColorRGB", Start_Ctrl_ColorBtn[0], Start_Ctrl_ColorBtn[1], Start_Ctrl_ColorBtn[2]) else: cmds.setAttr(Main2_Ctrl + ".overrideRGBColors", 0) cmds.setAttr(Main2_Ctrl + ".overrideColor", self.Start_Ctrl_ColorSlider.value()) cmds.setAttr(Main2_Ctrl + ".visibility", lock=True, keyable=False, channelBox=False) cmds.setAttr(Main2_Ctrl + ".sx", lock=True, keyable=False, channelBox=False) cmds.setAttr(Main2_Ctrl + ".sy", lock=True, keyable=False, channelBox=False) cmds.setAttr(Main2_Ctrl + ".sz", lock=True, keyable=False, channelBox=False) cmds.select(DeformationSystem_Grp) cmds.select(MotionSystem_Grp, tgl=True) cmds.select(Main2_Ctrl, tgl=True) cmds.parent() cmds.pickWalk(direction='up') Main2_Ctrl = cmds.ls(sl=True)[0] Main2_Ctrl_C = cmds.group(n=Main2_Ctrl + "_C") Main2_Ctrl_G = cmds.group(n=Main2_Ctrl + "_G") Main2_Ctrl = cmds.ls(sl=True)[0] cmds.setAttr(Main_Ctrl + ".grow", edit=True, keyable=True) cmds.connectAttr(Main_Ctrl + ".show_mod", Geo_Grp + ".visibility") cmds.parent(Main2_Ctrl, Main_Ctrl) cmds.pickWalk(direction='up') cmds.group(n=Main_Ctrl + "_C") cmds.group(n=Main_Ctrl + "_G") Main_Ctrl_G = cmds.ls(sl=True)[0] cmds.curve(d=1, p=[(-1, 0, -1), (-1, 0, 1), (1, 0, 1), (1, 0, -1), (-1, 0, -1)], k=[0, 1, 2, 3, 4], n=Character_Ctrl_Text) Character = cmds.ls(sl=True)[0] cmds.setAttr(Character + ".overrideEnabled", 1) if mel.eval("getApplicationVersionAsFloat;") >= 2017: cmds.setAttr(Character + ".overrideRGBColors", 1) cmds.setAttr(Character + ".overrideColorRGB", Character_Ctrl_ColorBtn[0], Character_Ctrl_ColorBtn[1], Character_Ctrl_ColorBtn[2]) else: cmds.setAttr(Character + ".overrideRGBColors", 0) cmds.setAttr(Character + ".overrideColor", self.Character_Ctrl_ColorSlider.value()) cmds.setAttr(Character + ".visibility", lock=True, keyable=False, channelBox=False) cmds.xform(a=True, ws=True, t=(End_JNT_Coordinate[0], End_JNT_Coordinate[1], End_JNT_Coordinate[2])) cmds.parent(Main_Ctrl_G, Character) cmds.pickWalk(direction='up') cmds.group(n=Character + "_C") cmds.group(n=Character + "_G") Grp = cmds.group(n=Geo_Name_Text + "_rig") # 设置 other_G 中的属性 cmds.setAttr(ikList[2] + ".visibility", 0) cmds.setAttr(ikList[2] + ".visibility", lock=True, keyable=False, channelBox=False) cmds.setAttr(ikList[0] + ".visibility", 0) cmds.setAttr(ikList[0] + ".visibility", lock=True) cmds.setAttr(ikList[0] + ".tx", lock=True) cmds.setAttr(ikList[0] + ".ty", lock=True) cmds.setAttr(ikList[0] + ".tz", lock=True) cmds.setAttr(ikList[0] + ".rx", lock=True) cmds.setAttr(ikList[0] + ".ry", lock=True) cmds.setAttr(ikList[0] + ".rz", lock=True) cmds.setAttr(ikList[0] + ".sx", lock=True) cmds.setAttr(ikList[0] + ".sy", lock=True) cmds.setAttr(ikList[0] + ".sz", lock=True) cmds.setAttr(ikList[0] + ".poleVectorX", lock=True) cmds.setAttr(ikList[0] + ".poleVectorY", lock=True) cmds.setAttr(ikList[0] + ".poleVectorZ", lock=True) cmds.setAttr(ikList[0] + ".offset", lock=True) cmds.setAttr(ikList[0] + ".roll", lock=True) cmds.setAttr(ikList[0] + ".twist", lock=True) cmds.setAttr(ikList[0] + ".ikBlend", lock=True) # 重命名曲线 cmds.rename(ikList[2], Curve_Name_Text) # other_G 打组 cmds.select(ikList[0]) cmds.select(Curve_Name_Text, tgl=True) cmds.group(n="IK_G") cmds.group(n="other_G") cmds.pickWalk(direction='up') cmds.select(Grp, tgl=True) cmds.parent() Other_Grp = cmds.pickWalk(direction='up') cmds.select(Geo_Grp) self.Main_Grp = cmds.group(n=Geo_Name_Text + "_all") cmds.select(Other_Grp) cmds.select(self.Main_Grp, tgl=True) cmds.parent()
def rig(*args): if (jointsMirrored): unParentJoints() #adds Ik Spline to spine joints cmds.select(ikHipJoint) cmds.select("spine_6", add=True) cmds.ikHandle(n="Spine_IkSolver", sol='ikSplineSolver') cmds.rename("curve1", "spine_Curve") cmds.rename("effector1", "spine_Effector") #binds ik curve to two duplicated joints #this part duplicates and cleans the joints cmds.select("spine_6") cmds.duplicate(n="shoulder_bind_joint") cmds.parent("shoulder_bind_joint", w=True) cmds.select("shoulder_bind_joint") cmds.rotate(0, -90, 0, r=True) cmds.select(ikHipJoint) cmds.duplicate(n="hip_bind_joint") cmds.select("hip_bind_joint") if (ikHipJoint != 'root'): cmds.parent("hip_bind_joint", w=True) cmds.pickWalk(d='down') cmds.delete() #this binds the curve to the control joints cmds.select("shoulder_bind_joint") cmds.select("hip_bind_joint", add=True) cmds.select("spine_Curve", add=True) cmds.SmoothBindSkin( ) # this should be binded to the selected joints with a ma influence of 2 but it still works like this #this creates the control curves and snaps them in placed #hip control curve maya.mel.eval( 'curve -d 1 -p -8.586044 2.072055 8.586044 -p -12.879065 -2.072055 9.948048 -p 12.879065 -2.072055 9.948048 -p 8.586044 2.072055 8.586044 -p -8.586044 2.072055 8.586044 -p -8.586044 2.072055 -8.586044 -p -12.879065 -2.072055 -9.948048 -p -12.879065 -2.072055 9.948048 -p -12.879065 -2.072055 -9.948048 -p 12.879065 -2.072055 -9.948048 -p 8.586044 2.072055 -8.586044 -p -8.586044 2.072055 -8.586044 -p 8.586044 2.072055 -8.586044 -p 8.586044 2.072055 8.586044 -p 12.879065 -2.072055 9.948048 -p 12.879065 -2.072055 -9.948048 -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15;' ) cmds.rename('curve1', 'hip_Cotrol') cmds.select(ikHipJoint) cmds.select('hip_Cotrol', add=True) cmds.pointConstraint(offset=[0, 0, 0], weight=1) cmds.select('hip_Cotrol_pointConstraint1') cmds.Delete() #shoulder control curve cmds.duplicate('hip_Cotrol', n='shoulder_Control') cmds.select('shoulder_bind_joint') cmds.select('shoulder_Control', add=True) cmds.pointConstraint(offset=[0, 0, 0], weight=1) cmds.select('shoulder_Control_pointConstraint1') cmds.Delete() cmds.select('shoulder_Control') cmds.scale(0.650436, -1, 0.650436, r=True) # this was not part of the tutorial # cmds.select('shoulder_Control') cmds.select('hip_Cotrol', add=True) cmds.FreezeTransformations() # # #changes rotate order to zxy on hip control cmds.setAttr("hip_Cotrol.rotateOrder", 2) cmds.setAttr("shoulder_Control.rotateOrder", 2) cmds.setAttr("hip_bind_joint.rotateOrder", 2) #cmds.setAttr("shoulder_bind_joint_parentConstraint1.rotateOrder" , 2)#not sure about this one either #cmds.setAttr("hip_bind_joint_parentConstraint1.rotateOrder", 2)# not sure about this one cmds.setAttr("shoulder_bind_joint.rotateOrder", 2) # parents the control joints to the control curves (hips and shoulders) cmds.select('shoulder_Control') cmds.select('shoulder_bind_joint', add=True) cmds.parentConstraint(mo=True, weight=1) cmds.select(cl=True) cmds.select('hip_Cotrol') cmds.select('hip_bind_joint', add=True) cmds.parentConstraint(mo=True, weight=1) #adding twist cmds.setAttr("Spine_IkSolver.dTwistControlEnable", 1) cmds.setAttr("Spine_IkSolver.dWorldUpType", 4) #adds the world up objects maya.mel.eval( 'connectAttr -f hip_bind_joint.worldMatrix[0] Spine_IkSolver.dWorldUpMatrix;' ) maya.mel.eval( 'connectAttr -f shoulder_bind_joint.worldMatrix[0] Spine_IkSolver.dWorldUpMatrixEnd;' ) maya.mel.eval('setAttr "Spine_IkSolver.dWorldUpAxis" 1;') maya.mel.eval('setAttr "Spine_IkSolver.dWorldUpVectorY" -1;') maya.mel.eval('setAttr "Spine_IkSolver.dWorldUpVectorEndY" 0;') maya.mel.eval('setAttr "Spine_IkSolver.dWorldUpVectorEndZ" -1;') # # # I added a rotation to the spine top joint to compensate, this fixed the issue but it's not on the steps (lines 196, 197) # part 3 in the tutorial at the end: # https://www.youtube.com/watch?v=ahgIOJysSHg # # BELOW IS FK PART 4 OF TUTORIAL # this arrays are used to create secondary joints for spine FK cmds.select(cl=True) spinesForFkSpine = ['root', 'spine_2', 'spine_4', 'spine_6'] spinesForFkSpine = ['root', 'spine_2', 'spine_4', 'spine_6'] namesForFkSpine = [ 'spineFKContro1', 'spineFKContro2', 'spineFKContro3', 'spineFKContro4' ] # creating secondary joints for spine FK for i in range(0, 4): cmds.joint(position=[0, 0, 0], n=namesForFkSpine[i]) for j in range(0, 4): cmds.select(spinesForFkSpine[j]) cmds.select(namesForFkSpine[j], add=True) cmds.pointConstraint(offset=[0, 0, 0], weight=1, n='temp') cmds.select('temp') cmds.Delete() ParentJoints() else: print("All joints must be placed before control rig is added.")