def RMCircularControl(self, Obj, radius=1, axis="X", name=""): Obj = RMRigTools.validate_pymel_nodes(Obj) if name == '': defaultName = "circularControl" else: defaultName = name if axis in "yY": Ctrl, Shape = pm.circle(normal=[0, 1, 0], radius=radius, name=defaultName) elif axis in "zZ": Ctrl, Shape = pm.circle(normal=[0, 0, 1], radius=radius, name=defaultName) elif axis in "xX": Ctrl, Shape = pm.circle(normal=[1, 0, 0], radius=radius, name=defaultName) if name == 'circularControl': if self.NameConv.is_name_in_format(Obj): self.NameConv.rename_based_on_base_name(Obj, Ctrl) else: self.NameConv.rename_name_in_format(Ctrl, name=name, objectType='control') else: self.NameConv.rename_name_in_format(Ctrl, name=name, objectType='control') RMRigTools.RMAlign(Obj, Ctrl, 3) ResetGroup = self.rigTools.RMCreateGroupOnObj(Ctrl) return ResetGroup, Ctrl
def test_clusterPlane(self): fr = FollowRibbon.FollowRibbon(name="blah") plane = pm.nurbsPlane(axis=[0, 1, 0], patchesU=8, patchesV=1, lengthRatio=0.1, ch=0)[0] ctrls = [] ctrls.append(pm.circle(n="blah_ctrl_01")[0].name()) ctrls.append(pm.circle(n="blah_ctrl_02")[0].name()) mainGrp = pm.group(em=1, name="main") result = fr._clusterPlane(plane=plane, controls=ctrls, mainGrp="main") self.testLib.assertListEqual(result, ["blah_cluster_01Handle", "blah_cluster_02Handle"]) self.assertTrue(pm.objExists("blah_cluster_01")) self.assertTrue(pm.objExists("blah_cluster_02")) self.assertTrue(pm.listRelatives(result[0], parent=True), "main") self.assertTrue(pm.listRelatives(result[1], parent=True), "main") self.assertTrue(pm.listRelatives(result[0], parent=1)[0], "blah_ctrlsGrp") self.assertTrue(pm.listRelatives(result[1], parent=1)[0], "blah_ctrlsGrp") hist = pm.listHistory(plane) hitA = 0 hitB = 0 for each in hist: if each.name() == "blah_cluster_01": hitA = 1 if each.name() == "blah_cluster_02": hitB = 1 self.assertTrue(hitA) self.assertTrue(hitB) self.assertTrue(pm.isConnected("blah_ctrl_01.translate", "blah_cluster_01Handle.translate")) self.assertTrue(pm.isConnected("blah_ctrl_02.translate", "blah_cluster_02Handle.translate"))
def create_curveSphere(name, radius): circGrp = pm.group(n=name, em=True) circ1 = pm.circle(nr=[1, 0, 0], ch=True)[0] circ2 = pm.circle(nr=[1, 0, 0], ch=True)[0] circ3 = pm.circle(nr=[1, 0, 0], ch=True)[0] circs = [circ1, circ2, circ3] circGrp.overrideEnabled.set(1) circGrp.overrideColorRGB.set(1, 1, 0) circGrp.overrideRGBColors.set(1) pm.xform(circGrp, s=[radius, radius, radius]) pm.xform(circ2, ro=[0, 90, 0]) pm.xform(circ3, ro=[0, 0, 90]) pm.makeIdentity([circ1, circ2, circ3], a=True, t=True, r=True, s=True, n=False) circ1_shape = pm.listRelatives(circ1, s=True)[0] circ2_shape = pm.listRelatives(circ2, s=True)[0] circ3_shape = pm.listRelatives(circ3, s=True)[0] pm.parent([circ1_shape, circ2_shape, circ3_shape], circGrp, r=True, s=True) pm.delete([circ1, circ2, circ3]) return circGrp
def CreateBallCTRL(CTRL_name, CTRL_list, rad): # create nurb circles & rotate nurbCTRL = pm.circle(n=str(CTRL_name), nr=(1, 0, 0), c=(0, 0, 0), r=rad) nurbCTRL1 = pm.circle(n=str('circle1'), nr=(0, 0, 1), c=(0, 0, 0), r=rad) nurbCTRL2 = pm.circle(n=str('circle2'), nr=(0, 1, 0), c=(0, 0, 0), r=rad) nurbCTRL3 = pm.circle(n=str('circle3'), nr=(1, 0, 0), c=(0, 0, 0), r=rad) pm.rotate(nurbCTRL3, [0, 0, 45]) nurbCTRL4 = pm.circle(n=str('circle4'), nr=(1, 0, 0), c=(0, 0, 0), r=rad) pm.rotate(nurbCTRL4, [0, 0, -45]) # clean all history CleanHist(nurbCTRL[0]) CleanHist(nurbCTRL1[0]) CleanHist(nurbCTRL2[0]) CleanHist(nurbCTRL3[0]) CleanHist(nurbCTRL4[0]) # reparent shapes ReparentShape(nurbCTRL4, nurbCTRL) ReparentShape(nurbCTRL3, nurbCTRL) ReparentShape(nurbCTRL2, nurbCTRL) ReparentShape(nurbCTRL1, nurbCTRL) CleanHist(nurbCTRL[0]) # create offset GRP, parent CTRL to it and add CTRL to list offset_GRP = pm.group(em=True, name=str(CTRL_name) + '_offset_GRP') RecolourObj(CTRL_name, 'nurbsCurve') CTRL_list.append(offset_GRP)
def createNurbsSphere(rad = 2, oneName = "sphere_ctrl"): circ1 = pm.circle(ch = False, o = True, nr = [1,0,0], r = rad, name = oneName)[0] circ2 = pm.circle(ch = False, o = True, nr = [0,1,0], r = rad, name = oneName)[0] circ3 = pm.circle(ch = False, o = True, nr = [0,0,1], r = rad, name = oneName)[0] pm.parent(circ3.getShape(), circ2.getShape(), circ1, s = True, r = True) pm.delete(circ3, circ2) return circ1
def bdBuildSphereController(self): circleA = pm.circle(n=self.ctrlName + 'A', nr=(0, 1, 0), c=(0, 0, 0), radius=self.ctrlScale) circleB = pm.circle(n=self.ctrlName + 'B', nr=(1, 0, 0), c=(0, 0, 0), radius=self.ctrlScale) circleC = pm.circle(n=self.ctrlName + 'C', nr=(0, 0, 1), c=(0, 0, 0), radius=self.ctrlScale) circleBShape = pm.listRelatives(circleB[0], c=True) circleCShape = pm.listRelatives(circleC[0], c=True) pm.parent(circleBShape[0], circleA[0], r=True, s=True) pm.parent(circleCShape[0], circleA[0], r=True, s=True) pm.delete(circleB, circleC) ctrl = pm.rename(circleA[0], self.ctrlName) ctrlGrp = pm.group(ctrl, n=self.ctrlName + '_grp') pm.move(ctrlGrp, self.ctrlPos[0], self.ctrlPos[1], self.ctrlPos[2]) pm.rotate(ctrlGrp, self.ctrlRot[0], self.ctrlRot[1], self.ctrlRot[2]) self.ctrlGrp = ctrlGrp
def create_circular_control(self, Obj, **kwargs): radius = kwargs.pop('radius', 1) axis = kwargs.pop('axis', config.axis_order.upper()[0]) name = kwargs.pop('name', 'circle') Obj = dataValidators.as_pymel_nodes(Obj) if name == '': default_name = "circularControl" else: default_name = name if axis in "yY": control, shape = pm.circle(normal=[0, 1, 0], radius=radius, name=default_name) elif axis in "zZ": control, shape = pm.circle(normal=[0, 0, 1], radius=radius, name=default_name) elif axis in "xX": control, shape = pm.circle(normal=[1, 0, 0], radius=radius, name=default_name) if name == 'circularControl': if self.name_convention.is_name_in_format(Obj): self.name_convention.rename_based_on_base_name(Obj, control) else: self.name_convention.rename_name_in_format(control, name=name, objectType='control') else: self.name_convention.rename_name_in_format(control, name=name, objectType='control') transform.align(Obj, control) reset_group = self.rigTools.RMCreateGroupOnObj(control) self.scale_controls(reset_group) return reset_group, control
def createJointOffset(Offset): if Offset == "": Offset = "Offset" selectJoints = pm.selected() for joint in selectJoints: offsetObjName = "" if prefix.getSelect() == 1: #置き換え offsetObjName = re.sub(r"^[a-zA-Z]*?_",Offset+"_",str(joint)) elif prefix.getSelect() == 2: #追加 offsetObjName = str(Offset) + "_" + str(joint) offsetObj = pm.group(em = True,name = offsetObjName) jointName = re.sub(r"^[a-zA-Z]*?_","Rig_",offsetObjName) pm.circle( name=jointName ) pm.select(jointName,r=30) # 回転の軸がなんでこれで(Z)いいのかわからないので確認する。 pm.rotate(0,0,90,r = True) pm.scale(2,2,2) pm.makeIdentity(apply=True,t=1,r=1,s=1,n=0,pn=1) pm.parent(jointName,offsetObj) #AにBをコンストレイント! pm.parentConstraint(joint,offsetObj, weight=1) #必要のないコンストレイントノードの削除 delNode = offsetObj.listRelatives(c=True,ad=True,type='constraint') pm.delete(delNode)
def RMCircularControl(Obj, radius=1, NameConv=None, axis="X", name=""): Obj = RMRigTools.validate_pymel_nodes(Obj) if not NameConv: NameConv = nameConvention.NameConvention() if name == '': defaultName = "circularControl" else: defaultName = name if axis in "yY": Ctrl, Shape = pm.circle(normal=[0, 1, 0], radius=radius, name=defaultName) elif axis in "zZ": Ctrl, Shape = pm.circle(normal=[0, 0, 1], radius=radius, name=defaultName) elif axis in "xX": Ctrl, Shape = pm.circle(normal=[1, 0, 0], radius=radius, name=defaultName) if name == '' and NameConv.is_name_in_format(Obj): NameConv.rename_based_on_base_name(Obj, Ctrl) else: NameConv.rename_based_on_base_name(Obj, Ctrl, name=Ctrl) NameConv.rename_set_from_name(Ctrl, "control", "objectType") RMRigTools.RMAlign(Obj, Ctrl, 3) ResetGroup = RMRigTools.RMCreateGroupOnObj(Ctrl) return ResetGroup, Ctrl
def sphereCtrlShape(name, scale=1): ctrlObject = pm.circle(n=name, ch=False, normal=[1, 0, 0], radius=scale)[0] addShape = pm.circle(n=name, ch=False, normal=[0, 0, 1], radius=scale)[0] pm.parent(pm.listRelatives(addShape, s=1), ctrlObject, r=1, s=1) pm.delete(addShape) common.deleteHistory(ctrlObject) common.freezeTranform(ctrlObject) return ctrlObject
def control_sphere(*arg): circle_1 = pm.circle(nr=[0, 1, 0], r=1, d=3, ch=0) circle_2 = pm.circle(nr=[1, 0, 0], r=1, d=3, ch=0) circle_3 = pm.circle(nr=[0, 0, 1], r=1, d=3, ch=0) pm.parent(pm.listRelatives(circle_2, circle_3, shapes=True), circle_1, s=True, r=True) pm.delete(circle_2, circle_3) return circle_1
def create_ctrls(self, i, cv_loc): pmc.select(cl=1) ctrl_shape = pmc.circle(c=(0, 0, 0), nr=(0, 0, 1), sw=360, r=3, d=3, s=8, n="{0}_{1}_fk_CTRL_shape".format( self.model.module_name, (i + 1)), ch=0)[0] ctrl = rig_lib.create_jnttype_ctrl(name="{0}_{1}_fk_CTRL".format( self.model.module_name, (i + 1)), shape=ctrl_shape, drawstyle=2, rotateorder=2) inv_ctrl_shape = pmc.circle(c=(0, 0, 0), nr=(0, 0, 1), sw=360, r=2.5, d=3, s=8, n="{0}_{1}_inv_fk_CTRL_shape".format( self.model.module_name, (i + 1)), ch=0)[0] inv_ctrl = rig_lib.create_jnttype_ctrl( name="{0}_{1}_inv_fk_CTRL".format(self.model.module_name, (i + 1)), shape=inv_ctrl_shape, drawstyle=2, rotateorder=2) nearest_point_on_curve = pmc.createNode("nearestPointOnCurve", n="temp_NPOC") self.guides[1].worldSpace >> nearest_point_on_curve.inputCurve cv_loc.getShape().worldPosition >> nearest_point_on_curve.inPosition ctrl.setAttr("translate", nearest_point_on_curve.getAttr("position")) inv_ctrl.setAttr("translate", nearest_point_on_curve.getAttr("position")) pmc.delete(nearest_point_on_curve) pmc.parent(inv_ctrl, self.ctrl_input_grp, r=0) if i == 0: pmc.parent(ctrl, self.ctrl_input_grp, r=0) else: pmc.parent(ctrl, "{0}_{1}_fk_CTRL".format(self.model.module_name, i), r=0) pmc.reorder(ctrl, front=1) pmc.parent(self.created_inv_fk_ctrls[i - 1], inv_ctrl) pmc.reorder(self.created_inv_fk_ctrls[i - 1], front=1) self.created_fk_ctrls.append(ctrl) self.created_inv_fk_ctrls.append(inv_ctrl)
def rigMake(mayaFalse): #check if not pm.ls( 'Locator_Pivot' ): #first, perform a check to see if locatorMake() has been performed. pm.confirmDialog(title=u'SER 武器リグ', message=u'先ず、ピボット設定をしてください。') return #rest of rig start constrLoc = pm.spaceLocator( name="Locator_Constraint") #creating locator to constraint the bone to weapJoint = pm.ls('*Joint_Weapon', type='joint')[0] pm.xform( constrLoc, ws=True, t=pm.xform(weapJoint, q=True, t=True, ws=True) ) #moving the newly created constraint locator to the translation position of the joint pm.parentConstraint(constrLoc, weapJoint, mo=False) contr1 = pm.circle(name='Controller_Weapon_Global', r=9, nr=[0, 1, 0]) contr2 = pm.circle(name='Controller_Weapon_Local', r=7, nr=[0, 1, 0]) pm.parent(contr2[0], contr1[0]) pm.xform(contr1, ws=True, t=pm.xform('Locator_Pivot', q=True, t=True, ws=True), ro=pm.xform('Locator_Pivot', q=True, ro=True, ws=True)) pm.delete( 'Locator_Pivot' ) #deleting locator pivot after rig controllers have been created. pm.parent(constrLoc, contr2[0]) R_Constr = pm.parentConstraint( pm.ls('*Helper_Weapon1')[0], contr1[0], name='Constraint_Weapon_Global') #parent constraint to right hand L_Constr = pm.parentConstraint(pm.ls('*Helper_Weapon2')[0], contr1[0]) #parent constraint to left hand pm.setAttr( 'Constraint_Weapon_Global.%s' % pm.listAttr('Constraint_Weapon_Global', k=True)[-1], 0) pm.setKeyframe('Controller_Weapon_Global') pm.setKeyframe('Controller_Weapon_Global', v=1, at='blendWeaponGlobal', itt='auto', ott='step') pm.setKeyframe('Constraint_Weapon_Global', v=1, at=pm.listAttr('Constraint_Weapon_Global', k=True)[-2]) #sets RH constraint to 1 pm.setKeyframe('Constraint_Weapon_Global', v=0, at=pm.listAttr('Constraint_Weapon_Global', k=True)[-1]) #sets LH constraint to 0
def ballCtrl(radius=20.0, name=''): ctrl = pmc.circle(name=name, r=radius, ch=0, o=1, s=8, nr=(0, 1, 0))[0] dup1 = pmc.circle(name=name, r=radius, ch=0, o=1, s=8, nr=(1, 0, 0))[0] dup2 = pmc.circle(name=name, r=radius, ch=0, o=1, s=8, nr=(0, 0, 1))[0] shape = pmc.listRelatives(dup1, shapes=True)[0] pmc.parent(shape, ctrl, s=1, r=1) shape = pmc.listRelatives(dup2, shapes=True)[0] pmc.parent(shape, ctrl, s=1, r=1) pmc.delete([dup1, dup2]) return ctrl
def test_match_object(self): a = pm.circle()[0] b = pm.circle()[0] b.rx.set(75) b.ry.set(75) b.rz.set(75) self.assertFalse(transforms.assertOrientationMatches(a, b)) control.match_object(a, b) self.assertTrue(transforms.assertOrientationMatches(a, b))
def create_wire_sphere(name="", color=0): wire_sphere = pm.circle(name=name, nr=(0, 0, 1)) temp1 = pm.circle(name=name + '#', nr=(1, 0, 0)) temp2 = pm.circle(name=name + '#', nr=(0, 1, 0)) pm.parent(temp1[0] + "Shape", wire_sphere[0], s=True, r=True) pm.parent(temp2[0] + "Shape", wire_sphere[0], s=True, r=True) pm.delete(temp1) pm.delete(temp2) if color > 0: color_controller(wire_sphere[0], color) return wire_sphere[0]
def LipsBuild(): pm.select(cl=True) lipLocs = pm.listRelatives("lipGrp",c=True) lipJntGrp = pm.group(n = "LipJnt_Grp") for i in range(len(lipLocs)): pm.select(cl=True) jntName = lipLocs[i].split("_") lipJnt = pm.joint(n=jntName[0]+"Jnt_"+jntName[1]) pm.delete(pm.parentConstraint(lipLocs[i],lipJnt)) pm.parent(lipJnt,lipJntGrp) ### Lips Ctrl Created on Locators ### lipJntHier = pm.listRelatives(lipJntGrp,c=True) pm.select(cl=True) lipCtrlGrp = pm.group(n="LipCtrl_Grp") for i in range(len(lipJntHier)): pm.select(cl=True) jntCtrlName = lipJntHier[i].split("Jnt") offsetJnt = pm.joint(n="FKOffset"+jntCtrlName[0]+jntCtrlName[1]) pm.setAttr(offsetJnt+".drawStyle",2) pm.select(cl=True) extraGrp = pm.group(n="FKExtra"+jntCtrlName[0]+jntCtrlName[1]) pm.parent(extraGrp,offsetJnt) pm.select(cl=True) ctrl = pm.circle(n="FK"+jntCtrlName[0]+jntCtrlName[1]+"_CTRL",r=.2,ch=False) fkxJnt = pm.joint(n="FKX"+jntCtrlName[0]+jntCtrlName[1]) pm.setAttr(fkxJnt+".drawStyle",2) pm.parent(ctrl[0],extraGrp) pm.parent(offsetJnt,lipCtrlGrp) pm.delete(pm.parentConstraint(lipJntHier[i],offsetJnt)) pm.parentConstraint(fkxJnt,lipJntHier[i]) pm.select(cl=True) lipGrp = pm.group(n = "LipGrp") pm.parent([lipCtrlGrp,lipJntGrp],lipGrp) pm.select(cl=True) if not pm.objExists("FacialGroup"): facialgrp = pm.group(n = "FacialGroup") pm.parent(lipGrp,"FacialGroup") pm.delete("lipGrp") pm.select(cl=True) ### Lip Mover...... lipmoverGrp = pm.group(n="LipMoverGrp") lipmoverCtrl = pm.circle(n="LipMover_CTRL",ch=False) pm.parent(lipmoverCtrl,lipmoverGrp) pm.delete(pm.parentConstraint("LipGrp",lipmoverGrp)) pm.xform("LipMoverGrp",t=[0,0,1]) pm.parentConstraint(lipmoverCtrl,"LipGrp",mo=True) pm.parent(lipmoverGrp,"FacialGroup") print ("Lips Build......."),
def build_tweek_ctrls(self, follicles): """ Args: None Returns (None) """ base_name = '%s_flexiPlane' % self.flexiPlaneNameField.getText() follicle_prefix = '%s_flexiPlane_' % self.flexiPlaneNameField.getText() mainCTRLGRP = self.flexiPlaneNameField.getText() + '_flexiPlane_main_CTRLCon_GRP' main_crv_name = '%s_main_CTRL' % base_name tweekCTRLGRP = pm.group( em = True, name = self.flexiPlaneNameField.getText() + '_flexiPlane_tweakCTRL_GRP' ) tweekCTRLGRP.setAttr( 'inheritsTransform', 0 ) pm.parent( tweekCTRLGRP, mainCTRLGRP ) for index,follicle in enumerate(follicles): tweek_crv_name = self.format_string.format(PREFIX = self.flexiPlaneNameField.getText(), INDEX = 'flexiPlane_tweak%03d' % (index+1), SUFFIX = 'CTRL') pm.circle( c = (0, 0, 0 ), nr = ( 0, 1, 0 ), sw = 360, r = 1, d = 3, ut = 0, tol = 0.000129167, s = 8, n = tweek_crv_name, ch = 0 ) pm.setAttr( tweek_crv_name + '.scaleX', .5 ) pm.setAttr( tweek_crv_name + '.scaleY', .5 ) pm.setAttr( tweek_crv_name + '.scaleZ', .5 ) pm.setAttr( tweek_crv_name + '.overrideEnabled', 1 ) pm.setAttr( tweek_crv_name + '.overrideColor', 17 ) pm.makeIdentity( tweek_crv_name, apply=True, translate=True, rotate=True, scale=True ) pm.setAttr( tweek_crv_name + '.overrideEnabled', 1 ) pm.setAttr( tweek_crv_name + '.overrideColor', 17 ) pm.duplicate( tweek_crv_name, n= tweek_crv_name + 'A' ) pm.setAttr( tweek_crv_name + 'A.rotateZ', -90 ) pm.makeIdentity( tweek_crv_name + 'A', apply=True, translate=True, rotate=True, scale=True ) pm.duplicate( tweek_crv_name, n= tweek_crv_name + 'B' ) pm.setAttr( tweek_crv_name + 'B.rotateZ', -90 ) pm.setAttr( tweek_crv_name + 'B.rotateX', -90 ) pm.makeIdentity( tweek_crv_name + 'B', apply=True, translate=True, rotate=True, scale=True ) pm.parent( tweek_crv_name + 'AShape', tweek_crv_name + 'BShape', tweek_crv_name, add = True, shape = True ) pm.delete( tweek_crv_name + 'A', tweek_crv_name + 'B') pm.select(tweek_crv_name, r=True) offSetGRP.add_offset_grps() conGRP.add_con_grps() pm.select(clear = True) pm.connectAttr( follicle + '.translate', tweek_crv_name + 'Offset_GRP.translate' ) pm.connectAttr( follicle + '.rotate', tweek_crv_name + 'Offset_GRP.rotate' ) pm.parent( tweek_crv_name + 'Offset_GRP', tweekCTRLGRP ) pm.scaleConstraint( main_crv_name, tweek_crv_name + 'Offset_GRP' ) pm.select( clear = True)
def makeCtrl(self, name): c1 = pm.circle(r=1, s=8, n="{}_CTR".format(name))[0] c2 = pm.circle(r=1, s=8, n="{}A_CTR".format(name))[0] c3 = pm.circle(r=1, s=8, n="{}B_CTR".format(name))[0] pm.parent(c2.getShape(), c1, s=1, r=1) pm.parent(c3.getShape(), c1, s=1, r=1) pm.delete(c2) pm.delete(c3) s = c1.getShape().split("_") pm.select("{}A_{}.cv[0:7]".format(s[0], s[1]), r=1) pm.rotate(0, 0, 90) pm.select("{}B_{}.cv[0:7]".format(s[0], s[1]), r=1) pm.rotate(0, 90, 0) pm.select(cl=1) return c1
def CtrlForThis(createZeroGroup=False, dist=1): ctrls = [] # ctrls names for return objsToPutCtrlOn = pm.ls(sl=True) # for every selected object create ctrl curves for i in range(len(objsToPutCtrlOn)): objToPutCtrlOn = objsToPutCtrlOn[i] # create circle, find the proper name for the contorl curve and name the circle if str(objToPutCtrlOn)[-3:] == "jnt": ctrl = pm.circle(nr=(1, 0, 0), r=dist, ch=False, name=str(objToPutCtrlOn).replace("jnt", "ctrl")) else: ctrl = pm.circle(nr=(1, 0, 0), r=dist, ch=False, name=(str(objToPutCtrlOn) + "_ctrl")) # parent curve to corisponding joint pm.parent(ctrl[0], objToPutCtrlOn) #reset tranform values on circles pm.xform(ctrl[0], t=(0, 0, 0), ro=(0, 0, 0)) firstParent = pm.listRelatives(objToPutCtrlOn, fullPath=True, parent=True) # parent ctrls to their firstgrandparent if firstParent: pm.parent(ctrl[0], firstParent[0]) else: pm.parent(ctrl[0], world=True) pm.parent(objToPutCtrlOn, ctrl[0]) ctrls.append(ctrl[0]) # create zero groups if needed - add zero groups as well to return value if createZeroGroup == True: pm.select(ctrls) ctrls.extend(ZeroGrp()) return ctrls
def bdCreateCircleZCon(self): print 'Circle Z Controller' animConName = self.bdGetConName() if animConName != '': conSize = self.inputConSize.text() overrideColor = self.conColors[str( self.inputConSide.currentText())] if not conSize: conSize = 1 selection = pm.ls(sl=True) selPos = [0, 0, 0] selRot = [0, 0, 0] if selection: selPos = selection[0].getTranslation(space='world') selRot = selection[0].getRotation(space='world') circleCon = pm.circle(n=animConName, nr=(0, 1, 0), c=(0, 0, 0), radius=int(conSize))[0] circleCon.getShape().overrideEnabled.set(1) circleCon.getShape().overrideColor.set(overrideColor) circleConGrp = pm.group(circleCon, name=circleCon.name() + '_GRP') conCvs = circleCon.cv zDirectionPos = conCvs[5].getPosition(space='world') zDirectionPos[2] = zDirectionPos[2] * 1.25 print zDirectionPos conCvs[5].setPosition(zDirectionPos) circleConGrp.setTranslation(selPos, space='world') circleConGrp.setRotation(selRot, space='world') else: pm.warning('Need a name, aborting')
def build_upper_halfbox(type, label=[], connections=True): if not pm.objExists(type + "_Prnt"): mainDict = {} squareShape = [[-1.0, 1.0, 0.0], [-1.0, 0.0043876273513161479, 0.0], [1.0, 0.0043876273513161479, 0.0], [1.0, 1.0, 0.0], [-1.0, 1.0, 0.0]] box = pm.curve(d=1, p=squareShape, n=type + "_Prnt") boxShape = box.getShape() boxShape.overrideEnabled.set(1) boxShape.overrideDisplayType.set(1) ctrl = pm.circle(nr=[0, 0, 0], r=0.2, ch=0, n=type + "_Ctrl")[0] pm.parent(ctrl, box) pm.transformLimits(ctrl, tx=[-1, 1], etx=[1, 1], ety=[1, 1], ty=[0, 1]) libUtilities.lockAttr(str(ctrl), ["tz", "rx", "ry", "rz", "sx", "sy", "sz", "v"]) mainDict["border"] = box mainDict["ctrl"] = ctrl if connections: connect_dict = {} connect_dict["TopLeftCorner"] = build_left_top_corner(type, ctrl) connect_dict["TopRightCorner"] = build_right_top_corner(type, ctrl) mainDict["connections"] = connect_dict if label: mainDict["label"] = build_label(label, box) return mainDict else: raise Exception(type + " setup already exists")
def test_create_heirarchy(self): # Test on object with parent jnts = [] jnts.append(pm.joint(p=(1, 1, 1))) jnts.append(pm.joint(p=(2, 2, 2))) crv = pm.circle()[0] pm.delete(pm.parentConstraint(jnts[-1], crv, mo=0)) pm.parent(crv, jnts[-1]) grps = control.create_heirarchy('temp', crv, 5) count = 0 for g in grps: self.assertTrue( transforms.assertLocationsMatch(g, crv)) self.assertTrue( transforms.assertDefaultScale(g)) if count > 0: self.assertTrue( transforms.assertAllZero(g)) self.assertTrue( transforms.assertParentIs(g, grps[count-1])) count += 1 self.assertEqual(grps[0].name(), 'temp_top_node') self.assertEqual(grps[-1].name(), 'temp_btm_node') self.assertTrue(transforms.assertParentIs(crv, grps[-1])) self.assertTrue(transforms.assertParentIs(grps[0], jnts[-1])) self.assertTrue(transforms.assertAllZero(crv)) self.assertTrue(transforms.assertDefaultScale(crv))
def addJacketCollarRig(): # jacket collar rig collarjnts = pm.ls(sl=True) # add hm, grp and auto nulls for jnt in collarjnts: ctl = pm.circle(r=0.5, sweep=359, normal=(1,0,0), n=jnt.replace('_jnt', '_ctl')) auto = pm.group(ctl, n=jnt.replace('_jnt', '_auto')) grp = pm.group(auto, n=jnt.replace('_jnt', '_grp')) hm = pm.group(grp, n=jnt.replace('_jnt', '_hm')) wMat = jnt.getMatrix(worldSpace=True) hm.setMatrix(wMat, worldSpace=True) collarparent = jnt.getParent() collarparent | hm auto | jnt # auto import rigger.modules.poseReader as poseReader reload(poseReader) xfo = nt.Joint(u'Mathilda_neck_jnt') poseReader.radial_pose_reader(xfo, (1,0,0), (1,0,0)) # connect auto to sdks import utils.rigging as rt import rigger.utils.modulate as modulate angleMult = pm.PyNode('Mathilda_neck_jnt.vectorAngle') # Left collar A rt.connectSDK('Mathilda_neck_jnt.param', 'LT_collarA_auto.rz', {3.25:0, 4.6:50, 5.5:0}) mod = modulate.multiplyInput(pm.PyNode('LT_collarA_auto.rz'), 0, '_angle') angleMult >> mod # Letf collar B rt.connectSDK('Mathilda_neck_jnt.param', 'LT_collarB_auto.rz', {4:0, 5:180, 6:180, 7:0}) mod = modulate.multiplyInput(pm.PyNode('LT_collarB_auto.rz'), 0, '_angle') angleMult >> mod # Letf collar C rt.connectSDK('Mathilda_neck_jnt.param', 'LT_collarC_auto.rz', {0:200, 1.4:0, 4:0, 5.5:200, 6.6:280, 8:0}) mod = modulate.multiplyInput(pm.PyNode('LT_collarC_auto.rz'), 0, '_angle') angleMult >> mod # center collar rt.connectSDK('Mathilda_neck_jnt.param', 'CT_collar_auto.rz', {0:320, 2.5:0, 5.5:0, 8:320}) mod = modulate.multiplyInput(pm.PyNode('CT_collar_auto.rz'), 0, '_angle') angleMult >> mod # right collar A rt.connectSDK('Mathilda_neck_jnt.param', 'RT_collarA_auto.rz', {4.75:0, 3.4:50, 2.5:0}) mod = modulate.multiplyInput(pm.PyNode('RT_collarA_auto.rz'), 0, '_angle') angleMult >> mod # right collar B rt.connectSDK('Mathilda_neck_jnt.param', 'RT_collarB_auto.rz', {4:0, 3:180, 2:180, 1:0}) mod = modulate.multiplyInput(pm.PyNode('RT_collarB_auto.rz'), 0, '_angle') angleMult >> mod # right collar C rt.connectSDK('Mathilda_neck_jnt.param', 'RT_collarC_auto.rz', {0:200, 6.6:0, 4:0, 2.5:200, 1.4:280, 8:0}) mod = modulate.multiplyInput(pm.PyNode('RT_collarC_auto.rz'), 0, '_angle') angleMult >> mod pm.select(pm.PyNode(u'Mathilda_neck_jnt.param').outputs())
def build_y_halfbox(type, label=[]): if not pm.objExists(type + "_Prnt"): mainDict = {} squareShape = [[-0.112423266524, 1.0, 0.0], [-0.112423266524, -1.0, 0.0], [0.112423266524, -1.0, 0.0], [0.112, 1.0, 0.0], [-0.112423266524, 1.0, 0.0]] box = pm.curve(d=1, p=squareShape, n=type + "_Prnt") boxShape = box.getShape() boxShape.overrideEnabled.set(1) boxShape.overrideDisplayType.set(1) ctrl = pm.circle(nr=[0, 0, 0], r=0.2, ch=0, n=type + "_Ctrl")[0] pm.parent(ctrl, box) pm.transformLimits(ctrl, tx=[0, 0], etx=[1, 1], ety=[1, 1], ty=[-1, 1]) libUtilities.lockAttr(str(ctrl), ["tz", "tx", "rx", "ry", "rz", "sx", "sy", "sz", "v"]) mainDict["border"] = box mainDict["ctrl"] = ctrl if label: mainDict["label"] = build_label(label, box) return mainDict else: raise Exception(type + " setup already exists")
def strokePath(node, radius=.1): """ Create a nurbs surface from a curve control """ curveNodes = separateShapes(node) for curveNode in curveNodes: shape = curveNode.listRelatives(type='nurbsCurve')[0] t = pm.pointOnCurve(shape, p=0, nt=1) pos = pm.pointOnCurve(shape, p=0) cir = pm.circle(r=radius)[0] pm.xform(cir, t=pos, ws=1) #align the circule along the curve l = pm.spaceLocator() pm.xform(l, t=[pos[0]+t[0], pos[1]+t[1], pos[2]+t[2]], ws=1) pm.delete(pm.aimConstraint(l, cir, aimVector=[0,0,1])) pm.delete(l) newxf = pm.extrude(cir, curveNode, rn=False, po=0, et=2, ucp=1, fpt=1, upn=1, scale=1, rsp=1, ch=1)[0] pm.delete(cir) pm.delete(curveNode.listRelatives(type='nurbsCurve')) parentShape(curveNode, newxf) if len(curveNodes) > 1: for i in range(1, len(curveNodes)): parentShape(curveNodes[0], curveNodes[i]) return curveNodes[0]
def create_ctrl(node=None): tgt = "NAME" if node: tgt = node.name() else: sel = pm.selected(type="transform") if sel: ctrls = [] for node in sel: ctrls.append(create_ctrl(node)) return ctrls ctrl_name = get_unique_name(tgt + "_CTRL") ctrl = pm.circle(normal=[1, 0, 0], name=ctrl_name)[0] offset_grp = pm.group(empty=True, name=ctrl_name + "_offsetGrp") spaces_grp = pm.group(empty=True, name=ctrl_name + "_spacesGrp") spaces_grp.setParent(offset_grp) ctrl.setParent(spaces_grp) if node: pm.matchTransform(offset_grp, tgt) pm.parentConstraint(ctrl, tgt) ctrl.setAttr("scaleX", lock=True, keyable=False) ctrl.setAttr("scaleY", lock=True, keyable=False) ctrl.setAttr("scaleZ", lock=True, keyable=False) ctrl.setAttr("visibility", lock=True, keyable=False) return ctrl
def makeFk(sel, inputRoot): currentChain = pm.ls(selection = True, dag = True) if sel == False: currentChain = pm.ls(inputRoot, dag = True) controlList = [] primeList = [] createPad(currentChain[0]) for j, item in enumerate(currentChain): if j != len(currentChain) - 1: index = item.rfind('_') newName = item[:index] + '_ctrl' newControl = pm.circle(nr = [1,0,0], r = 1, n = newName)[0] newPrime = createPrime(item, newControl) pm.orientConstraint(newControl, item, mo = False) controlList.append(newControl) primeList.append(newPrime) for x, item in enumerate(primeList): if x != len(primeList) - 1: pm.parent(primeList[x + 1], controlList[x])
def createFkControl(self, name=None, jnt=None): ''' Create a curve, parent shape to joint, lock translations. ''' temp = pm.circle(name='%s_%s_FK_ctrl' % (name, jnt)) pm.delete(pm.parentConstraint(jnt, temp[0], mo=0)) shape = temp[0].getShape() pm.parent(shape, jnt, shape=True, r=1) pm.delete(temp[0])
def priming(*args): jointChain = pm.ls(sl = True, dag = True)[:-1] iconList = [] topGroup = [] i = 0 for jointName in jointChain: iconName = jointName.replace("bind", "ctrl") primeIcon = pm.circle(nr = [1, 0, 0], n = iconName) groupOneName = jointName.replace('bind', 'prime3') groupOne = pm.group(primeIcon, n = groupOneName) groupTwoName = jointName.replace('bind', 'prime2') groupTwo = pm.group(groupOne, n = groupTwoName) groupThreeName = jointName.replace('bind', 'prime1') groupThree = pm.group(groupTwo, n = groupThreeName) tempConstraint = pm.parentConstraint(jointName, groupThree, mo = False) pm.delete(tempConstraint) pm.makeIdentity(primeIcon, a = True, t = True, r = True, s = True) pm.parentConstraint(primeIcon, jointName, mo = True) iconList.append(primeIcon) topGroup.append(groupThree) if (i > 0): pm.parent(topGroup[i], iconList[i-1]) i = i + 1
def circle(self): """Create a nurbsCurve circle""" if self._guide: self.srt = pm.circle(n=self._guide.replace('guide', 'ctrl'), nr=[1, 0, 0])[0] else: self.srt = pm.circle(n='%s_ctrl_srt' % self._component.name, nr=[1, 0, 0])[0] if self.buffers: self.srt.setParent(self.buffers[-1]) else: self.srt.setParent(self.hrc) if self._guide: pac = pm.parentConstraint(self._guide, self.hrc, mo=False) pm.delete(pac) self._set_default_colors()
def rig_joint(joint): ''' ''' #- create ctl = pm.createNode('transform', name='XXnamespaceXX_ctl_0') cth = pm.createNode('transform', name='XXnamespaceXX_cth_0') ctg = pm.createNode('transform', name='XXnamespaceXX_ctg_0') grp = pm.createNode('transform', name='XXnamespaceXX_grp_0') #- parent pm.parent(ctl, cth) pm.parent(cth, ctg) pm.parent(ctg, grp) #- match positions pm.delete(pm.parentConstraint(joint, grp)) #- constraint pm.parentConstraint(ctl, joint) #- control shape circle = pm.circle(nr=(1, 0, 0), ch=False)[0] pm.parent(circle.getShape(), ctl, s=True, r=True) pm.delete(circle) return ctl, cth, ctg, grp
def organize(): """ Create group structure to hold the helpers rig """ rigHelpersGrp = pm.group(name='rigHelpers_grp', em=True) for side in ['L', 'R']: pm.parent(side + '_leg_0_rigHelper', rigHelpersGrp) pm.parent(side + '_arm0_rigHelper', rigHelpersGrp) pm.parent('M_spine0_rigHelper', rigHelpersGrp) crvsGrp = pm.group(n='crvs_grp', em=True) for side in ['L','R']: pm.parent(side + '_leg_helper_grp', crvsGrp) pm.parent(side + '_arm_helper_grp', crvsGrp) pm.parent('M_spine_helper_grp', crvsGrp) scaleCtrl = pm.circle(n='scale_ctrl', r=1, nr=(0,1,0)) rigUtils.setControlColor(scaleCtrl[0]) pm.parent(rigHelpersGrp, scaleCtrl[0]) helpersGrp = pm.group(n='helpers_grp', em=True) pm.parent(crvsGrp, helpersGrp) pm.parent(scaleCtrl[0], helpersGrp)
def bdCreateCircleCon(self): print 'Circle Controller' test = mui.MQtUtil.findControl('createConBtn1') print test animConName = self.bdGetConName() if animConName != '': conSize = self.inputConSize.text() overrideColor = self.conColors[str( self.inputConSide.currentText())] if not conSize: conSize = 1 selection = pm.ls(sl=True) selPos = [0, 0, 0] selRot = [0, 0, 0] if selection: selPos = selection[0].getTranslation(space='world') selRot = selection[0].getRotation(space='world') circleCon = pm.circle(n=animConName, nr=(0, 1, 0), c=(0, 0, 0), radius=float(conSize))[0] circleCon.getShape().overrideEnabled.set(1) circleCon.getShape().overrideColor.set(overrideColor) circleConGrp = pm.group(circleCon, name=circleCon.name() + '_GRP') circleConGrp.setTranslation(selPos) circleConGrp.setRotation(selRot) else: pm.warning('Need a name, aborting')
def create_manipulator(self, selected_node): """ Create manipulator for given node. """ #selected_node_name selected_node_name = selected_node.name() #grp_manipulator_node grp_manipulator_node = pm.group( em=True, n='grp_manip_{0}'.format(selected_node_name)) pm.select(cl=True) #manipulator_node manipulator_node = pm.circle( nr=(0, 1, 0), c=(0, 0, 0), s=32, ch=False, n='manip_{0}'.format(selected_node_name))[0] pm.select(cl=True) #parent pm.parent(manipulator_node, grp_manipulator_node) pm.select(cl=True) #return return manipulator_node
def circleCtrlShape(name, normalDirection=[1, 0, 0], scale=1): ctrlObject = pm.circle(n=name, ch=False, normal=normalDirection, radius=scale)[0] return ctrlObject
def vis_orbits(self): global vis_orbGrp vis_orbGrp = pm.group(n='olp_visOrbits', em=True) intervValue = self.interv_int.value() distValue = self.distance_float.value() orbitValue = self.orbit_int.value() global all_orbitObjs all_orbitObjs = [] for orbit in range(orbitValue): orbitRot = orbit * 360/float(orbitValue*2) orbit_visObject = pm.circle(n='olp_orbCircle{0}'.format(orbit+1), r=distValue, s=intervValue*2, nr=[1, 0, 0], ch=True)[0] pm.parent(orbit_visObject, vis_orbGrp) orbit_visObject.overrideEnabled.set(1) orbit_visObject.overrideColorRGB.set(0, 1, 1) orbit_visObject.overrideRGBColors.set(1) pm.xform(orbit_visObject, ro=[0, 0, orbitRot]) all_orbitObjs.append(orbit_visObject) pm.xform(vis_orbGrp, a=True, t=sel_center) pm.parent(vis_orbGrp, vis_mainGrp) pm.select(sel_objects, r=True) return vis_orbGrp
def __createNode__(self, size=None, normal=(1,0,0), multiplier=1.0, refs=None, offset=None, geometries=None, *args, **kwargs): """ Create a simple circle nurbsCurve. size: The maximum dimension of the controller. """ # Hack: Ensure geometries are hashable if isinstance(geometries, list): geometries = tuple(geometries) # Resolve size automatically if refs are provided. ref = next(iter(refs), None) if isinstance(refs, collections.Iterable) else refs if size is None: if ref is not None: size = libRigging.get_recommended_ctrl_size(ref, geometries=geometries) * multiplier else: size = 1.0 transform, make = pymel.circle() make.radius.set(size) make.normal.set(normal) # Expose the rotateOrder # transform.rotateOrder.setKeyable(True) return transform
def create_single_rotation_ctrl(joint_node): cc = pm.circle()[0] cc.rename(TEMP_NAME) cc.getShape().rename(joint_node.nodeName() + "Shape") pm.select(cc.getShape(), joint_node) pm.parent(shape=True, relative=True) pm.delete(cc.nodeName())
def buildIK(self, *args): """ Build the IK """ #Setup variables if self.normal == 1: self.normal = (1, 0, 0) if self.normal == 2: self.normal = (0, 1, 0) if self.normal == 3: self.normal = (0, 0, 1) #Create IK control self.ikControl = pm.circle(nr=self.normal, r=self.radius, n='%s_ikCnt'%self.prefix) pm.select(self.ikControl[0], r=True) pm.mel.eval("DeleteHistory;") pm.delete( pm.parentConstraint(self.ikChain[2], self.ikControl[0], mo=0) ) self.zero(self.ikControl[0]) #Create RP IK self.arm_ikHandle = pm.ikHandle(sj=self.ikChain[0], ee=self.ikChain[2], solver='ikRPsolver', name=(self.prefix + '_armIkHandle')) pm.setAttr(self.arm_ikHandle[0] + '.visibility', 0) #Parent IK Handle to the ikWrist_cnt pm.parent(self.arm_ikHandle[0], self.ikControl[0]) # Creates: self.pv_cnt self.createPoleVector()
def bdCreateCircleCon(self): print 'Circle Controller' test = mui.MQtUtil.findControl('createConBtn1') print test animConName = self.bdGetConName() if animConName != '': conSize = self.inputConSize.text() overrideColor = self.conColors[str(self.inputConSide.currentText())] if not conSize: conSize=1 selection = pm.ls(sl = True) selPos = [0,0,0] selRot = [0,0,0] if selection: selPos = selection[0].getTranslation(space='world') selRot = selection[0].getRotation(space='world') circleCon = pm.circle(n = animConName ,nr=(0, 1, 0), c=(0, 0, 0),radius=float(conSize) ) [0] circleCon.getShape().overrideEnabled.set(1) circleCon.getShape().overrideColor.set(overrideColor) circleConGrp = pm.group(circleCon,name = circleCon.name() + '_GRP') circleConGrp.setTranslation(selPos) circleConGrp.setRotation(selRot) else: pm.warning('Need a name, aborting')
def bdCreateCircleZCon(self): print 'Circle Z Controller' animConName = self.bdGetConName() if animConName!='': conSize = self.inputConSize.text() overrideColor = self.conColors[str(self.inputConSide.currentText())] if not conSize: conSize=1 selection = pm.ls(sl = True) selPos = [0,0,0] selRot = [0,0,0] if selection: selPos = selection[0].getTranslation(space='world') selRot = selection[0].getRotation(space='world') circleCon = pm.circle(n = animConName ,nr=(0, 1, 0), c=(0, 0, 0),radius=int(conSize) )[0] circleCon.getShape().overrideEnabled.set(1) circleCon.getShape().overrideColor.set(overrideColor) circleConGrp = pm.group(circleCon,name = circleCon.name() + '_GRP') conCvs = circleCon.cv zDirectionPos = conCvs[5].getPosition(space = 'world') zDirectionPos[2] = zDirectionPos[2] * 1.25 print zDirectionPos conCvs[5].setPosition(zDirectionPos) circleConGrp.setTranslation(selPos,space='world') circleConGrp.setRotation(selRot,space='world') else: pm.warning('Need a name, aborting')
def bdAddFkCtrls(scale=1, color=1): selection = pm.ls(sl=1, type='joint') pm.select(cl=1) if selection: for rootJnt in selection: chainJnt = rootJnt.listRelatives(type='joint', ad=True, f=True) # chainJnt.reverse() chainJnt.append(rootJnt) for jnt in chainJnt: pos = jnt.getTranslation(space='world') rot = jnt.getRotation(space='world') pm.select(cl=1) ctrl = pm.circle(name=jnt.name() + '_ctrl', c=[0, 0, 0], nr=[1, 0, 0], ch=0, radius=scale)[0] ctrlGrp = pm.group(ctrl, n=ctrl.name() + '_grp') pm.select(cl=1) ctrlGrp.setTranslation(pos, space='world') ctrlGrp.setRotation(rot, space='world') ctrl.getShape().overrideEnabled.set(1) ctrl.getShape().overrideColor.set(color)
def addMainCtrl(self): pos = self.ikJntList[0].getTranslation(space='world') ctrl = pm.circle(name=self.name + '_main_ctrl', radius=self.width * 2)[0] pm.delete(ctrl, ch=1) ctrlGrp = pm.group(ctrl, name=ctrl.name() + '_grp') pm.parent(ctrlGrp, self.mainGrp) print pos ctrlGrp.setTranslation(pos, space='world') pm.parentConstraint(ctrl, self.jntGrp, mo=1) self.mainCtrl = ctrl pm.addAttr(self.mainCtrl, shortName='stretch', minValue=0.0, maxValue=1.0, defaultValue=0.0, keyable=1) self.stretchRev = pm.shadingNode('reverse', name=self.name + '_stretch_rev', asUtility=1) self.mainCtrl.stretch >> self.stretchRev.inputX pm.parentConstraint(self.mainCtrl, self.allCtrlGrp, mo=1)
def shapeGenerate(shape="circle",name="new_controller"): ''' generate controller shape general rule is 1 controller fit 15 unit tall figure ''' if shape == "circle": c = pm.circle(nr=[1,0,0],ch=False,n=name)[0] elif shape == "square": c = pm.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=name ) elif shape == "sphere": c = pm.curve(d=1, p=[(-1,0,0),(-0.66,0,-0.66),(0,0,-1),(0.66,0,-0.66),(1,0,0),(0.66,0,0.66),(0,0,1),(-0.66,0,0.66),(-1,0,0),(-0.66,0.66,0),(0,1,0),(0.66,0.66,0),(1,0,0),(0.66,-0.66,0),(0,-1,0),(-0.66,-0.66,0),(-1,0,0),(-0.66,0.66,0),(0,1,0),(0,0.66,0.66),(0,0,1),(0,-0.66,0.66),(0,-1,0),(0,-0.66,-0.66),(0,0,-1),(0,0.66,-0.66),(0,1,0)], k=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],n=name ) elif shape == "cube": c= pm.curve(d=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)], k=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],n=name ) elif shape == "arrow": c= pm.curve(d=1, p=[(-0.5,0,-1),(-0.5,0,0.25),(-1,0,0.25),(0,0,1),(1,0,0.25),(0.5,0,0.25),(0.5,0,-1),(-0.5,0,-1)], k=[0,1,2,3,4,5,6,7],n=name ) elif shape == "cross": c = pm.curve(d=1, p=[(-0.33333,0,1),(-0.33333,0,0.333333),(-1,0,0.333333),(-1,0,-0.333333),(-0.33333,0,-0.333333),(-0.33333,0,-1),(0.333333,0,-1),(0.333333,0,-0.333333),(1,0,-0.333333),(1,0,0.333333),(0.333333,0,0.333333),(0.333333,0,1),(-0.33333,0,1)], k=[0,1,2,3,4,5,6,7,8,9,10,11,12],n=name ) elif shape == "diamond": c = pm.curve(d=1, p=[(0,0,1),(-1,0,0),(0,0,-1),(1,0,0),(0,0,1),(0,1,0),(0,0,-1),(0,-1,0),(0,0,1),(1,0,0),(0,1,0),(-1,0,0),(0,-1,0),(1,0,0)], k=[0,1,2,3,4,5,6,7,8,9,10,11,12,13],n=name ) else: c=None return c
def create_control(control, module): """ Creates a control for the rig, checking for existing controls or creating Args: control (str, pm.nt.Transform): can be anything really, just as long as it exists Returns: (pm.nt.Transform): the resulting transform of the control """ is_new = False # Check if default control was created if pm.objExists('grow_CTRL') and not pm.objExists(control): control = pm.PyNode('grow_CTRL') # Create the control if control doesn't exist elif not pm.objExists(control): control = pm.circle(n='grow_CTRL') # Flat control in Y... control[1].normalY.set(1) control[1].normalZ.set(0) control = control[0] is_new = True # If it's a string and we weren't passed a PyNode we need to check existing nodes elif isinstance(control, basestring): control = pm.PyNode(control) setup_control_global_attrs(control, module) return control, is_new
def makeFkChain(jnts=None): """Select joints in an FK chain starting with the root. This creates a simple FK chain of controls for it.""" prev = None ctrls = [] if not jnts: jnts = pmc.selected(type="joint") for j in jnts: n = j.split("_") n[-1] = "{0}" n = "_".join(n) ctrl = pmc.circle(nr=(1, 0, 0), n=n.format("ctrl"), ch=0)[0] ctrls.append(ctrl) ctrlGrp = pmc.group(n=n.format("offset")) ctrlGrp.setParent(prev) prev = ctrl pmc.matchTransform(ctrlGrp, j) mm = pmc.nt.MultMatrix(n=n.format("fkMtx")) ctrl.wm >> mm.i[0] ctrlGrp.pim >> mm.i[1] dm = pmc.nt.DecomposeMatrix(n=n.format("fkXform")) mm.o >> dm.imat dm.outputTranslate >> j.t dm.outputRotate >> j.r # j.addAttr("control", at="message") ctrl.addAttr("joint", at="message") ctrl.joint >> j.control j.addAttr("fk_xforms", at="message") dm.message >> j.fk_xforms return ctrls
def FTV_createMainFluidTextViewControl( inputsGrp , fluidSpaceTransform): ''' creation of the main control for the viewer''' circle = pm.circle( n='fluidTextureViewerCtrl#', c=(0,0,0), nr=(0,1,0), sw=360, r=1, ut=False,s=8, ch=False ) pm.parent(circle[0],fluidSpaceTransform,r=True) size = 0.5 ptList = [(-size,-size,-size), (size,-size,-size), (size,-size,size), (-size,-size,size), (-size,-size,-size), (-size,size,-size), (size,size,-size), (size,size,size), (-size,size,size), (-size,size,-size), (size,size,-size),(size,-size,-size),(size,-size,size),(size,size,size),(-size,size,size),(-size,-size,size)] cube = pm.curve( p = ptList, d=1, n='tempNameCubeNurbs#') grpDummyTransform = pm.group(em=True,n='dummyFluidSizeToMatrix#') pm.connectAttr( inputsGrp+'.dimensionsW', grpDummyTransform+'.scaleX') pm.connectAttr( inputsGrp+'.dimensionsH', grpDummyTransform+'.scaleY') pm.connectAttr( inputsGrp+'.dimensionsD', grpDummyTransform+'.scaleZ') FTV_lockAndHide( grpDummyTransform, ['tx','ty','tz','rx','ry','rz','sx','sy','sz','v']) circleShape = FTV_createTransformedGeometry(circle,'local', 'create',grpDummyTransform) cubeShape = FTV_createTransformedGeometry(cube,'local', 'create',grpDummyTransform) pm.setAttr(cubeShape+'.template',True) allCubeShapes = pm.listRelatives(cube,s=True) parentShapeRes = pm.parent(allCubeShapes, circle, add=True, s=True) pm.delete(cube) pm.rename( parentShapeRes[0],'BBFluidShapeSrc#' ) retShape = pm.rename( parentShapeRes[1],'BBFluidShape#' ) FTV_lockAndHide(circle[0], ['rx','ry','rz','sx','sy','sz','v']) # attributes connections addMainAttributesToObject(circle[0],True) FTV_multiConnectAutoKeyableNonLocked( circle[0], inputsGrp, ['translateX','translateY','translateZ']) pm.parent(grpDummyTransform,fluidSpaceTransform,r=True) return circle[0], retShape
def create_VarFkCtrls( IdName, guideSurface, numberOfCtrls ): # create controls ctrlGrp = pm.group( name = IdName + '_ctrls', empty = True, world = True) ctrlGrp.inheritsTransform.set(0) listOfCtrls = [] for currentCtrlIndex in range(numberOfCtrls): if numberOfCtrls > 1: FolliclePos = ( 1.0 / (numberOfCtrls-1) ) * currentCtrlIndex else: FolliclePos = ( 1.0 / (numberOfCtrls) ) * currentCtrlIndex # create controlshape currentCtrl = pm.circle( name = ( 'ctrl_vFK' + str( currentCtrlIndex+1 )+ '_' + IdName ), c=(0,0,0), nr=(1,0,0), sw=360, r=1.5, d=3, ut=0, tol=0.01, s=8, ch=False) currentCtrl[0].overrideEnabled.set(True) currentCtrl[0].overrideColor.set(4) # lock'n hide translates + scaleX currentCtrl[0].translateX.set( lock = True, keyable = False, channelBox = False ) currentCtrl[0].translateY.set( lock = True, keyable = False, channelBox = False ) currentCtrl[0].translateZ.set( lock = True, keyable = False, channelBox = False ) currentCtrl[0].scaleX.set( lock = True ) # add strength, position, radius attributes pm.addAttr( longName='rotateStrength', attributeType='float', keyable=True, defaultValue=1 ) pm.addAttr( longName='position', attributeType='float', keyable=True, min=0-FolliclePos, max=1-FolliclePos ) pm.addAttr( longName='radius', attributeType='float', keyable=True, min=0.0001, defaultValue=0.3 ) # position min/max relative to defaultposition so ctrl can be zeroed out. Is remapped later back to 0 to 1 when connected to Follicle currentFollicle = create_follicle( guideSurface[0], uPos=FolliclePos, vPos=0.5 ) currentFollicle.simulationMethod.set(0) currentFollicle.collide.set(0) currentFollicle.flipDirection.set( True ) currentFollicle = pm.listRelatives( currentFollicle, parent=True ) # connect to strength multiplier rotateStrengthMultiplier = pm.shadingNode( 'multiplyDivide', asUtility = True, n = str( currentCtrl[0] ) + '_strength_mult' ) currentCtrl[0].rotate >> rotateStrengthMultiplier.input1 pm.connectAttr( currentCtrl[0] + '.rotateStrength', rotateStrengthMultiplier + '.input2X', f=1 ) pm.connectAttr( currentCtrl[0] + '.rotateStrength', rotateStrengthMultiplier + '.input2Y', f=1 ) pm.connectAttr( currentCtrl[0] + '.rotateStrength', rotateStrengthMultiplier + '.input2Z', f=1 ) # compensate position zero value by current follicle position jntposZeroCompensate = pm.shadingNode( 'plusMinusAverage', asUtility = True, n=currentCtrl[0] + '_jntposZeroCompensate' ) pm.setAttr( jntposZeroCompensate + '.input1D[0]', pm.getAttr( currentFollicle[0].getShape() + '.parameterU' ) ) pm.connectAttr( currentCtrl[0] + '.position', jntposZeroCompensate + '.input1D[1]', f=1 ) pm.connectAttr( jntposZeroCompensate + '.output1D', currentFollicle[0].getShape() + '.parameterU', f=1 ) # grouping buf = createBufGrp( currentCtrl )[0] pm.parent( buf, ctrlGrp, relative = True ) pm.parent( currentFollicle, ctrlGrp ) # connect follicle position to control buffer currentFollicle[0].translate >> buf.translate listOfCtrls.append( currentCtrl[0] ) pm.select( clear = 1 ) print( 'Successfully created ' + currentCtrl[0] ) return listOfCtrls
def addControl(inputObject): newControl = pm.circle(n = str(inputObject) + '_control', c = [0,0,0], nr = [0,1,0], sw = 360, r = 1, d = 3, s = 16, ch = 1)[0] tempPConstr = pm.pointConstraint( inputObject, newControl) tempOConst = pm.orientConstraint(inputObject, newControl) pm.delete(tempOConst, tempPConstr) newControlPad = createPad(newControl) pm.parent(inputObject, newControl) return newControlPad, newControl
def makeThickFkCtrl(radius=1.0, name="FK_CTRL"): offset = (radius*1.05) - radius c1 = pmc.circle(r=(radius*1.05), nr=(1, 0, 0)) c2 = pmc.circle(r=(radius*0.95), nr=(1, 0, 0)) c3 = pmc.circle(r=radius, nr=(1, 0, 0)) pmc.move(offset, 0, 0) pmc.makeIdentity(apply=True) pmc.xform(c3, sp=(0, 0, 0), rp=(0, 0, 0), ws=True) c4 = pmc.circle(r=radius, nr=(1, 0, 0)) pmc.move(-offset, 0, 0) pmc.makeIdentity(apply=True) pmc.xform(c4, sp=(0, 0, 0), rp=(0, 0, 0), ws=True) pmc.select(c4, c3, c2, c1) ctrl = mergeShapes() ctrl.rename(name) return ctrl
def create_icon_1(): # Just creating a control icon. icon = pm.circle(nr=[0,1,0]) # Create the nurbs circle returns references to the circle's transform and history node. # Result: [nt.Transform(u'nurbsCircle1'), nt.MakeNurbCircle(u'makeNurbCircle1')] # # icon is a varable used to store the results of creating the nurbs circle. print 'Circle control created:', icon
def sphereCnt(self): ''' create a sphere control ''' self.__buildName() if self.controlName: circle = pm.circle(name = self.controlName, ch = 0, o=1 , nr=[1,0,0], r = 0.1)[0] circley = pm.circle(name = self.controlName, ch = 0, o = True, nr = [0, 1, 0], r = 0.1)[0] pm.parent(circley.getShape(), circle, shape = 1, add = 1 ) pm.delete(circley) circlez = pm.circle(name = self.controlName, ch = 0, o = True, nr = [0, 0, 1], r = 0.1)[0] pm.parent(circlez.getShape(), circle, shape = 1, add = 1 ) pm.delete(circlez) self.control = circle for s in self.control.getShapes(): pm.move(0, 0.1, 0, s.cv, r=1) self.__finalizeCnt()
def createFKControls(self, name=None, joints=None): ''' Create a curve, parent shape to joint. ''' for jnt in joints: temp = pm.circle(name='%s_%s_tweak_ctrl' % (name, jnt)) pm.delete(pm.parentConstraint(jnt, temp[0], mo=0)) shape = temp[0].getShape() pm.parent(shape, jnt, shape=True, r=1) pm.delete(temp[0])
def setStyle(self, style): self._deleteShape() #Circle if style == Control.Circle: tempA = pm.circle(nr=[1, 0, 0], sw=360, r=5, d=3, ch=False)[0] pm.parent([tempA.getShape()], self.node, r=True, s=True) pm.delete([tempA]) #Sphere if style == Control.Sphere: tempA = pm.mel.eval("curve -d 1 -p 0 5 0 -p 1.545085 4.755283 0 -p 2.938926 4.045085 0 -p 4.045085 2.938926 0 -p 4.755283 1.545085 0 -p 5 0 0 -p 4.755283 -1.545085 0 -p 4.045085 -2.938926 0 -p 2.938926 -4.045085 0 -p 1.545085 -4.755283 0 -p 0 -5 0 -p -1.545085 -4.755283 0 -p -2.938927 -4.045085 0 -p -4.045086 -2.938926 0 -p -4.755284 -1.545085 0 -p -5.000001 0 0 -p -4.755284 1.545085 0 -p -4.045086 2.938926 0 -p -2.938927 4.045085 0 -p -1.545085 4.755283 0 -p 0 5 0 -p -4.60471e-08 4.755283 1.545085 -p -8.75868e-08 4.045085 2.938926 -p -1.20553e-07 2.938926 4.045085 -p -1.41718e-07 1.545085 4.755283 -p -1.49012e-07 0 5 -p -1.545085 0 4.755283 -p -2.938927 0 4.045085 -p -4.045086 0 2.938927 -p -4.755284 0 1.545085 -p -5.000001 0 0 -p -4.755284 0 -1.545085 -p -4.045086 0 -2.938927 -p -2.938927 0 -4.045086 -p -1.545086 0 -4.755285 -p 0 0 -5.000002 -p 1.545086 0 -4.755285 -p 2.938928 0 -4.045087 -p 4.045088 0 -2.938928 -p 4.755286 0 -1.545086 -p 5 0 0 -p 4.755283 0 1.545085 -p 4.045085 0 2.938926 -p 2.938926 0 4.045085 -p 1.545085 0 4.755283 -p -1.49012e-07 0 5 -p -1.41718e-07 -1.545085 4.755283 -p -1.20553e-07 -2.938926 4.045085 -p -8.75868e-08 -4.045085 2.938926 -p -4.60471e-08 -4.755283 1.545085 -p 0 -5 0 -p 0 -4.755283 -1.545086 -p 0 -4.045085 -2.938928 -p 0 -2.938926 -4.045087 -p 0 -1.545085 -4.755285 -p 0 0 -5.000002 -p 0 1.545085 -4.755285 -p 0 2.938926 -4.045087 -p 0 4.045085 -2.938928 -p 0 4.755283 -1.545086 -p 0 5 0 -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 -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 -k 24 -k 25 -k 26 -k 27 -k 28 -k 29 -k 30 -k 31 -k 32 -k 33 -k 34 -k 35 -k 36 -k 37 -k 38 -k 39 -k 40 -k 41 -k 42 -k 43 -k 44 -k 45 -k 46 -k 47 -k 48 -k 49 -k 50 -k 51 -k 52 -k 53 -k 54 -k 55 -k 56 -k 57 -k 58 -k 59 -k 60 ;") pm.parent([pm.nt.Transform(tempA).getShape()], self.node, r=True, s=True) pm.delete(tempA) #Cube if style == Control.Cube: tempA = pm.mel.eval("curve -d 1 -p -5 5 5 -p 5 5 5 -p 5 -5 5 -p -5 -5 5 -p -5 5 5 -p -5 5 -5 -p 5 5 -5 -p 5 -5 -5 -p -5 -5 -5 -p -5 5 -5 -p -5 5 5 -p -5 -5 5 -p -5 -5 -5 -p 5 -5 -5 -p 5 -5 5 -p 5 5 5 -p 5 5 -5 -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 -k 16 ;") pm.parent([pm.nt.Transform(tempA).getShape()], self.node, r=True, s=True) pm.delete(tempA) #Square if style == Control.Square: tempA = pm.mel.eval("curve -d 1 -ch 0 -p 0 0 0 -p 0 15 0 -k 0 -k 1 ;") pm.parent([pm.nt.Transform(tempA).getShape()], self.node, r=True, s=True) pm.delete([tempA]) #Handle if style == Control.Handle: tempA = pm.mel.eval("curve -d 1 -p 0 15 0 -p 1.545085 15.244717 0 -p 2.938926 15.954915 0 -p 4.045085 17.061074 0 -p 4.755283 18.454915 0 -p 5 20 0 -p 4.755283 21.545085 0 -p 4.045085 22.938926 0 -p 2.938926 24.045085 0 -p 1.545085 24.755283 0 -p 0 25 0 -p -1.545085 24.755283 0 -p -2.938927 24.045085 0 -p -4.045086 22.938926 0 -p -4.755284 21.545085 0 -p -5.000001 20 0 -p -4.755284 18.454915 0 -p -4.045086 17.061074 0 -p -2.938927 15.954915 0 -p -1.545085 15.244717 0 -p 0 15 0 -p -4.60471e-08 15.244717 1.545085 -p -8.75868e-08 15.954915 2.938926 -p -1.20553e-07 17.061074 4.045085 -p -1.41718e-07 18.454915 4.755283 -p -1.49012e-07 20 5 -p 1.545085 20 4.755283 -p 2.938926 20 4.045085 -p 4.045085 20 2.938926 -p 4.755283 20 1.545085 -p 5 20 0 -p 4.755286 20 -1.545086 -p 4.045088 20 -2.938928 -p 2.938928 20 -4.045087 -p 1.545086 20 -4.755285 -p 0 20 -5.000002 -p -1.545086 20 -4.755285 -p -2.938927 20 -4.045086 -p -4.045086 20 -2.938927 -p -4.755284 20 -1.545085 -p -5.000001 20 0 -p -4.755284 20 1.545085 -p -4.045086 20 2.938927 -p -2.938927 20 4.045085 -p -1.545085 20 4.755283 -p -1.49012e-07 20 5 -p -1.41718e-07 21.545085 4.755283 -p -1.20553e-07 22.938926 4.045085 -p -8.75868e-08 24.045085 2.938926 -p -4.60471e-08 24.755283 1.545085 -p 0 25 0 -p 0 24.755283 -1.545086 -p 0 24.045085 -2.938928 -p 0 22.938926 -4.045087 -p 0 21.545085 -4.755285 -p 0 20 -5.000002 -p 0 18.454915 -4.755285 -p 0 17.061074 -4.045087 -p 0 15.954915 -2.938928 -p 0 15.244717 -1.545086 -p 0 15 0 -p 0 0 0 -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 -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 -k 24 -k 25 -k 26 -k 27 -k 28 -k 29 -k 30 -k 31 -k 32 -k 33 -k 34 -k 35 -k 36 -k 37 -k 38 -k 39 -k 40 -k 41 -k 42 -k 43 -k 44 -k 45 -k 46 -k 47 -k 48 -k 49 -k 50 -k 51 -k 52 -k 53 -k 54 -k 55 -k 56 -k 57 -k 58 -k 59 -k 60 -k 61 ;") pm.parent(pm.nt.Transform(tempA).getShape(), self.node, r=True, s=True) pm.delete(tempA) #Arrow if style == Control.Arrow: tempA = pm.mel.eval("curve -d 1 -p 1 0 -4 -p -1 0 -4 -p -1 0 1 -p -2 0 1 -p 0 0 4 -p 2 0 1 -p 1 0 1 -p 1 0 -4 -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 ;") pm.parent(pm.nt.Transform(tempA).getShape(), self.node, r=True, s=True) pm.delete(tempA) #Moveall if style == Control.MoveAll: tempA = pm.curve(d = 1, p = [(0, 0, -6.314364), (1.952926, 0, -4.7925),(1.05164, 0, -4.792499), (1.952926, 0, -1.952926), (4.7925, 0, -1.594463), (4.7925, 0, -1.952926), (6.725978, 0, 0), (4.7925, 0, 1.952926), (4.7925, 0, 1.594463), (1.952926, 0, 1.952926), (1.261715, 0, 4.699687), (1.952926, 0, 4.7925), (0, 0, 7.08783), (-1.952926, 0, 4.7925), (-1.261715, 0, 4.699687), (-1.952926, 0, 1.952926), (-4.7925, 0, 1.594463), (-4.7925, 0, 1.952926), (-6.725978, 0, 0), (-4.7925, 0, -1.952926), (-4.7925, 0, -1.594463), (-1.952926, 0, -1.952926), (-1.05164, 0, -4.792499), (-1.952926, 0, -4.7925), (0, 0, -6.314364)], k = [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24], n = newName, ch=0)[0] pm.parent(tempA.getShape(), self.node, r=True, s=True) pm.delete(tempA) #Pyramid if style == Control.Arrow: tempA = pm.curve(n = name, d = 1,p = [(0,0,0.5), (-0.5, 0.5, -0.5), (0.5,0.5,-0.5), (0.5,-0.5,-0.5), (-0.5,-0.5,-0.5), (-0.5,0.5,-0.5), (0,0,0.5), (0.5,0.5,-0.5), (0.5,-0.5,-0.5), (0,0,0.5), (-0.5,-0.5,-0.5)], k = [0,1,2,3,4,5,6,7,8,9,10]) pm.parent(pm.nt.Transform(tempA).getShape(), self.node, r=True, s=True) pm.delete(tempA)
def CtrlForThis( createZeroGroup=False , dist=1): ctrls = [] # ctrls names for return objsToPutCtrlOn = pm.ls ( sl = True ) # for every selected object create ctrl curves for i in range (len(objsToPutCtrlOn)): objToPutCtrlOn = objsToPutCtrlOn[i] # create circle, find the proper name for the contorl curve and name the circle if str(objToPutCtrlOn)[-3:] == "jnt": ctrl = pm.circle(nr = (1 , 0 , 0) , r= dist, ch=False, name = str(objToPutCtrlOn).replace("jnt", "ctrl") ) else: ctrl = pm.circle(nr = (1 , 0 , 0) , r= dist, ch=False, name = (str(objToPutCtrlOn) + "_ctrl") ) # parent curve to corisponding joint pm.parent ( ctrl[0] , objToPutCtrlOn ) #reset tranform values on circles pm.xform (ctrl[0] , t = (0,0,0) , ro= (0,0,0)) firstParent = pm.listRelatives ( objToPutCtrlOn , fullPath = True , parent = True ) # parent ctrls to their firstgrandparent if firstParent : pm.parent ( ctrl[0] , firstParent[0] ) else : pm.parent ( ctrl[0] , world = True ) pm.parent ( objToPutCtrlOn , ctrl[0] ) ctrls.append ( ctrl[0] ) # create zero groups if needed - add zero groups as well to return value if createZeroGroup == True: pm.select (ctrls) ctrls.extend ( ZeroGrp() ) return ctrls
def setupFKControls(self, *args): """ Create FK controllers """ #shoulder temp = pm.PyNode(pm.circle(nr=self.normal, r=self.radius)[0]) pm.parent(temp, self.fkChain[0]) #Parent transform under fk joint pm.move(0, 0, 0, temp) #Zero it so it snaps to FK position/orientation pm.parent(temp.getShape(), self.fkChain[0], s=True, r=True) #Parent shape to joints transform pm.delete(temp) #Delete empty transform #elbow temp = pm.PyNode(pm.circle(nr=self.normal, r=self.radius)[0]) pm.parent(temp, self.fkChain[1]) #Parent transform under fk joint pm.move(0, 0, 0, temp) #Zero it so it snaps to FK position/orientation pm.parent(temp.getShape(), self.fkChain[1], s=True, r=True) #Parent shape to joints transform pm.delete(temp) #Delete empty transform #wrist temp = pm.PyNode(pm.circle(nr=self.normal, r=self.radius)[0]) pm.parent(temp, self.fkChain[2]) #Parent transform under fk joint pm.move(0, 0, 0, temp) #Zero it so it snaps to FK position/orientation pm.parent(temp.getShape(), self.fkChain[2], s=True, r=True) #Parent shape to joints transform pm.delete(temp) #Delete empty transform # # FK Length attributes setup/ Done using the translates of the child to avoid skewing that # occurs with scaling in a non-uniform manner (1,2,1) # pm.addAttr(self.fkChain[0], ln='length', min=0, dv=1, k=True) pm.addAttr(self.fkChain[1], ln='length', min=0, dv=1, k=True) #Get current translates value to set the max SDK as twice the default length val1 = pm.getAttr('%s.translate%s' % (self.fkChain[1], self.aim)) val2 = pm.getAttr('%s.translate%s' % (self.fkChain[2], self.aim)) #SDK to connect them pm.setDrivenKeyframe(self.fkChain[1], cd='%s.length' % self.fkChain[0], at='translate%s' % self.aim, dv=1) #Set default with current value in .tx pm.setDrivenKeyframe(self.fkChain[1], cd='%s.length' % self.fkChain[0], at='translate%s' % self.aim, dv=0, v=0) #Set min pm.setDrivenKeyframe(self.fkChain[1], cd='%s.length' % self.fkChain[0], at='translate%s' % self.aim, dv=2, v=(val1 * 2)) #Set max pm.setDrivenKeyframe(self.fkChain[2], cd='%s.length' % self.fkChain[1], at='translate%s' % self.aim, dv=1) #Set default with current value in .tx pm.setDrivenKeyframe(self.fkChain[2], cd='%s.length' % self.fkChain[1], at='translate%s' % self.aim, dv=0, v=0) #Set min pm.setDrivenKeyframe(self.fkChain[2], cd='%s.length' % self.fkChain[1], at='translate%s' % self.aim, dv=2, v=(val2 * 2))#Set max
def _make_ctrl(self,name, radius=1.0, normal=[1,0,0]): '''makes a controller at the origin''' ctrl = pm.circle( #constructionHistory=True, object=True, name=name, normal=normal, radius=radius)[0] return ctrl
def circle_ctrl(self): """ Builds a circle control. """ self._build_name() if self.ctrl_name: self.ctrl = pm.circle(n=self.ctrl_name, ch=0, o=1, nr=[1, 0, 0])[0] self._finalize_ctrl()