def circle(self, joint): a = 0.25 b = 0.3432 p0 = Point(a + 0.005,0 , -a - 0.005) p1 = Point(b + 0.05, 0, 0) p2 = Point(a + 0.005, 0, a + 0.005) p3 = Point(0, 0, b) p4 = Point(-a - 0.005, 0, a + 0.005) p5 = Point(-b - 0.05, 0, 0) p6 = Point(-a - 0.005, 0, -a - 0.005) p7 = Point(0, 0, - b) points = [p0, p1, p2, p3, p4, p5, p6, p7, p0, p1, p2] pts = [] for point in points: pts.append(point.getPoint()) pm.curve(per = True, d = 3, p = pts, k = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) pm.parent("%s" % str(pm.ls(sl = True)[0]), "%s" % str(joint), relative = True) pm.parent("%s" % str(pm.ls(sl = True)[0]), world = True) pm.makeIdentity(r = True) curve = "%s" % str(pm.ls(sl = True)[0]) g = 0 while g < 8: pm.moveVertexAlongDirection(curve + ".cv[" + str(g) + "]", d = [0,1,0], m = -0.08) g += 1 group = pm.group(curve) pm.orientConstraint(curve, joint, mo = True) handle = joint + "IK" pm.pointConstraint(curve, handle, mo = True)
def make_stabilized_node(nodeName=None, centered=True): ''' Very simple proc to generate a Stabilized node for raw MoCap tracking purposes... First selected node is used as the Aim axis, second selected is used as this aim's worldUp ''' RequiredMarkers = pm.ls(sl=True, l=True) #pos = pm.xform(WorldUpObj, q=True, ws=True, t=True) curve = pm.curve(ws=True, d=1, p=(0, 0, 0), k=0) if centered: AimAt = RequiredMarkers[0] WorldUpObj = RequiredMarkers[1] pm.pointConstraint(RequiredMarkers, curve) else: AimAt = RequiredMarkers[1] WorldUpObj = RequiredMarkers[2] pm.pointConstraint(RequiredMarkers[0], curve) pm.aimConstraint((AimAt, curve), weight=1, aimVector=(0, 0, 1), upVector=(0, 1, 0), worldUpType="object", worldUpObject=WorldUpObj) #Snap a curveKnot to the pivot of all referenceMarkers for node in RequiredMarkers: pm.curve(curve, a=True, ws=True, p=(pm.xform(node, q=True, ws=True, t=True))) pm.curve(curve, a=True, ws=True, p=(pm.xform(AimAt, q=True, ws=True, t=True))) return curve
def createSrf(self): #calculate the witdth of the surface as a fraction of the total joint chain length jntChainLength = 0 crvPoints = [] for i in range(1,self.numJnt): pos1 = self.ikJntList[i-1].getTranslation(space='world') crvPoints.append(pos1) pos2 = self.ikJntList[i].getTranslation(space='world') jntChainLength += (pos2 - pos1).length() if i == self.numJnt - 1: crvPoints.append(pos2) jntChainLength = math.ceil(jntChainLength ) self.width = jntChainLength * self.widthMult crv1 = pm.curve(n=self.name + '_crv1',d=1,p=crvPoints) pm.move(crv1,self.width / 2.0,0,0,r=1) pm.parent(crv1,self.mainGrp) crv2 = pm.curve(n=self.name + '_crv2',d=1,p=crvPoints) pm.move(crv2,self.width / -2.0,0,0,r=1) pm.parent(crv2,self.mainGrp) pm.select(cl=1) loftSrf = pm.loft(crv2,crv1,ch=1,u=1,c= 0,ar= 1,d=3,ss= 1,rn=0,po=0,rsn=1,n=self.name + "_srf")[0] rebuiltLoftSrf = pm.rebuildSurface(loftSrf,ch=1, rpo=1, rt=0, end=1, kr=0, kcp=0, kc=0, su=self.numCtrl-1, du=3, sv=0, dv=3, tol=0, fr=0, dir=2 )[0] self.srf = loftSrf pm.parent(self.srf,self.mainGrp)
def _createCurves(self, objs=None, axis=None, num=None): ''' Create two curves using .getTranslation() of passed in objects ''' _name = '_createCurves' pymelLogger.info('Started: %s' % _name) positions = [] for obj in objs: loc = pm.spaceLocator() pm.parentConstraint(obj, loc, mo=0) positions.append(pm.PyNode(loc).getTranslation()) pm.delete(loc) crv1 = pm.PyNode(pm.curve(p=positions, d=1)) crv2 = pm.PyNode(pm.curve(p=positions, d=1)) move = 0.05 if axis == 1: pm.move(crv1, move, r=1, moveX=1) pm.move(crv2, -move, r=1, moveX=1) elif axis == 2: pm.move(crv1, move, r=1, moveY=1) pm.move(crv2, -move, r=1, moveY=1) elif axis == 3: pm.move(crv1, move, r=1, moveZ=1) pm.move(crv2, -move, r=1, moveZ=1) pm.rebuildCurve( crv1, rt=0, s=num ) pm.rebuildCurve( crv2, rt=0, s=num ) pymelLogger.info('Ended: %s' % _name) return crv1, crv2
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 bdBuildSrf(self,name): selected = pm.ls(sl=1) if selected: if len(selected) == 1: if selected[0].type() == 'joint': print 'start srf' self.startJnt = selected[0] children = self.startJnt.getChildren(type='joint') print children #need to implement a case with more joint chidren #build the one degree curves for lofting self.endJnt = children[0] startPos1,endPos1 = self.bdGetPos(-0.05) startPos2,endPos2 = self.bdGetPos( 0.05) pm.spaceLocator(p=startPos1) pm.spaceLocator(p=startPos2) pm.spaceLocator(p=endPos1) pm.spaceLocator(p=endPos2) dif1 = (endPos1 - startPos1) dif2 = (endPos2 - startPos2) crv1Points = [] crv2Points = [] for i in range(self.segmentsRbn): pos = dif1 * (i/(self.segmentsRbn*1.0)) + startPos1 crv1Points.append(pos ) pos = dif2 * (i/(self.segmentsRbn*1.0)) + startPos2 crv2Points.append(pos) crv1Points.append(endPos1) crv2Points.append(endPos2) print 'building curve' tmp = pm.curve(n=name + '_crv1',d=1,p=crv1Points) crv1 = pm.ls(tmp)[0] print crv1 #crv1.setScalePivot(startPos1) #crv1.setRotatePivot(startPos1) crv2 = pm.curve(n=name + '_crv2',d=1,p=crv2Points) #crv2.setScalePivot(startPos2) #crv2.setRotatePivot(startPos2) drvGrp = self.bdCreateDrvJnt(crv1,crv2) #loft the curves loftSrf = pm.loft(crv1,crv2,ch=1,u=1,c= 0,ar= 1,d=1,ss= 1,rn=0,po=0,rsn=1,n=name + "_lft_srf")[0] #loftSrf.setScalePivot(startPos2) #loftSrf.setRotatePivot(startPos2) rebuiltLoftSrf = pm.rebuildSurface(ch=1, rpo = 0, rt = 0, end = 1, kr=1, kcp=0,kc=0, su=0, du=3, sv=0, dv=1, fr=0, dir=2 , n=name + "_srf")[0] self.rbnSrf = rebuiltLoftSrf crvGrp = pm.group([crv1,crv2],name=name+'_crv_grp') crvGrp.centerPivots() srfGrp = pm.group([loftSrf,rebuiltLoftSrf],name=name+'_srf_grp') srfGrp.centerPivots() self.rbnGrp = pm.group([crvGrp,srfGrp],n=name+"_grp") pm.parent(drvGrp,self.rbnGrp)
def create_radian_trigger(prefix): prefix = ("%s_radianTrigger") %prefix display = pm.group(empty=True, name="%s_display" %prefix) display.overrideEnabled.set(1) display.overrideDisplayType.set(2) grp = pm.group(empty=True, name="%s_grp" %prefix) loc = pm.spaceLocator(name = "%s_target" %prefix) pm.addAttr(loc, at='double', ln="radical", k=True) pm.addAttr(loc, at='double', ln="angle", k=True) pos = pm.spaceLocator(name = "%s_pos" %prefix) loc.ty.set(1) loc.tz.set(1) pos.tz.set(1) radical_exp = '%s.radical = rad_to_deg( atan2( %s.translateY , %s.translateX ) )' %(loc.name(), loc.name(), loc.name()) angle_exp = "%s.angle = rad_to_deg( acos( %s.translateZ / (sqrt( pow(%s.translateX, 2) + pow(%s.translateY, 2) + pow(%s.translateZ, 2) ) ) ) )" %(loc.name(), loc.name(), loc.name(), loc.name(), loc.name()) pm.expression( o=loc, s= radical_exp, name="%s_radical_exp" %prefix) pm.expression( o=loc, s= angle_exp, name="%s_angle_exp" %prefix) planer_curve = "curve -d 1 -p 0 0 0 -p -1 0 0 -p -0.965926 0.258819 0 -p -0.765926 0.258819 0 -p -0.865926 0.258819 0 -p -0.865926 0.358819 0 -p -0.865926 0.158819 0 -p -0.865926 0.258819 0 -p -0.965926 0.258819 0 -p -0.866025 0.5 0 -p -0.707107 0.707107 0 -p -0.353553 0.353553 0 -p -0.707107 0.707107 0 -p -0.5 0.866025 0 -p -0.258819 0.965926 0 -p 0 1 0 -p 0 0.5 0 -p 0 1 0 -p 0.258819 0.965926 0 -p 0.5 0.866025 0 -p 0.707107 0.707107 0 -p 0.353553 0.353553 0 -p 0.707107 0.707107 0 -p 0.866025 0.5 0 -p 0.965926 0.258819 0 -p 1 0 0 -p 0.5 0 0 -p 1 0 0 -p 0.965926 -0.258819 0 -p 0.866025 -0.5 0 -p 0.707107 -0.707107 0 -p 0.353553 -0.353553 0 -p 0.707107 -0.707107 0 -p 0.5 -0.866025 0 -p 0.258819 -0.965926 0 -p 0 -1 0 -p 0 -0.5 0 -p 0 -1 0 -p -0.258819 -0.965926 0 -p -0.5 -0.866025 0 -p -0.707107 -0.707107 0 -p -0.353553 -0.353553 0 -p -0.707107 -0.707107 0 -p -0.866025 -0.5 0 -p -0.965926 -0.258819 0 -p -0.765926 -0.258819 0 -p -0.965926 -0.258819 0 -p -1 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" planer = pm.PyNode(pm.mel.eval(planer_curve)) planer.rename("%s_planer" %prefix) arrow_curve = 'curve -d 1 -p 0 0 0 -p 0 0.377909 0 -p -0.0449662 0.378085 0 -p 0 0.460303 0 -p 0.0449662 0.378085 0 -p 0 0.377909 0 -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 ;' arrow = pm.PyNode(pm.mel.eval(arrow_curve)) pm.makeIdentity(arrow, apply=True, t=True, r=True, s=True) arrow.rename("%s_arrow" %prefix) angle_curves = pm.circle(name="%s_angleCurve" %prefix, r=0.5) pm.aimConstraint(pos, angle_curves[0], mo=False, aimVector=[0,1,0], upVector=[-1,0,0], worldUpType='object', worldUpObject=loc) pm.parent(arrow, angle_curves) loc.angle >> angle_curves[-1].sweep posPointer = pm.curve(name='%s_posPointer'%prefix, d = 1, p = [(0,0,0), (0,0,1)]) pointer = pm.curve(name='%s_targetPointer'%prefix, d = 1, p = [(0,0,0), (0,0,0)]) pointer.inheritsTransform.set(0) cls1 = pm.cluster(pointer.cv[0], name='%s_pointerClusterStart' %prefix) cls2 = pm.cluster(pointer.cv[1], name='%s_pointerClusterEnd' %prefix) pm.parent(pos, planer, angle_curves[0], cls1, pointer, posPointer, display) pm.parent(display, loc, grp) pm.parent(cls2, loc, r=True) cls1[1].v.set(0) cls2[1].v.set(0) pos.v.set(0)
def _create_ribbon(self): """Create the ribbon spine based on the guides.""" ribboncrv = pm.curve(p=[ctl.position() for ctl in self.guides.spine], n='%s_%sRibbon_CRV' % (self.side, self.name), d=3) ribboncrv.listRelatives(ad=True)[0].rename('%sShape' % ribboncrv) crva = pm.curve(d=1, p=[ctl.position() for ctl in self.guides.spine]) crvb = crva.duplicate()[0] crva.tx.set(-1) crvb.tx.set(1) nrbname = '%s_%sRibbon_NRB' % (self.side, self.name) loft = pm.loft(crva, crvb, n=nrbname, ch=False)[0] self.ribbon = pm.rebuildSurface(loft, su=0, sv=0, ch=False) pm.delete(crva, crvb)
def createCurve(positions=[], degree=2): """ @param positions: Point positions @param degree: The degree of the curve that should be @return: The curve pynode """ if len(positions) < degree: # Force the degree to least number of points required degree = min(degree - 1, len(positions) - 1) curve = pm.curve(d=degree, p=positions[0]) for i in range(1, len(positions)): pm.curve(curve, a=1, p=positions[i]) return curve
def _setCtrlerShape(self, transformNode, shape='helper', scale=[1,1,1] ): curveShape = None if shape=='helper': # hexagon2D curveShape = pm.curve( d=1, p=[ (4.063704928114475e-17, 0.433013, 0.25), (-1.1102230246251565e-16, 0.0, 0.5), (-1.516593517436604e-16, -0.433013, 0.25), (-4.063704928114475e-17, -0.433013, -0.25), (1.1102230246251565e-16, 0.0, -0.5), (1.516593517436604e-16, 0.433013, -0.25), (4.063704928114475e-17, 0.433013, 0.25) ], k=[ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ) elif shape =='up': # diamond curveShape = pm.curve( d=1, p=[ (0.0, 0.0, 0.5), (0.5, 0.0, 0.0), (0.0, 0.0, -0.5), (-0.5, 0.0, 0.0), (0.0, 0.0, 0.5), (0.0, 0.5, 0.0), (0.0, 0.0, -0.5), (0.0, -0.5, 0.0), (0.0, 0.0, 0.5), (0.0, 0.5, 0.0), (0.5, 0.0, 0.0), (0.0, -0.5, 0.0), (-0.5, 0.0, 0.0), (0.0, 0.5, 0.0) ], k=[ 0.0, 0.707106781187, 1.41421356237, 2.12132034356, 2.82842712475, 3.53553390593, 4.24264068712, 4.94974746831, 5.65685424949, 6.36396103068, 7.07106781187, 7.77817459305, 8.48528137424, 9.19238815543 ] ) curveShape.s.set(scale) pm.makeIdentity( curveShape, apply=True, t=True, r=True, s=True ) pm.parent( curveShape.getShape(), transformNode, s=True, r=True) pm.delete( curveShape )
def triangle(self, joint): p0 = Point(-1, 0, -0.5) p1 = Point(0, 0, 1) p2 = Point(1, 0, -0.5) points = [p0, p1, p2, p0] pts = [] for point in points: pts.append(point.getPoint()) pm.curve(per = True, d = 1, p = pts, k = [0, 1, 2, 3]) pos = pm.PyNode("%s" % joint).getTranslation() pm.move(pos) pm.pointConstraint(pm.ls(sl = True)[0], joint) pm.orientConstraint("%s" % str(pm.ls(sl = True)[0]), joint)
def create(self): pointA = self.startObj pointB = self.endObj position = (0,0,0) # 커브 생성 crv = pm.curve( d=1, p=[ position, position ], k=[0,1] ) self.curve = crv.getShape() # obj에 커브 쉐입을 종속 시킴 : 커브를 선택해도 오브젝트를 선택한 효과를 줌. pm.parent( self.curve, pointA, r=True, s=True) pm.delete( crv ) # target에 locator를 종속 시킴 self.locator = pm.pointCurveConstraint( self.curve+'.ep[1]', ch=True)[0] self.locator = pm.PyNode(self.locator) pm.pointConstraint( pointB, self.locator ) # 로케이서 속성 조정 self.locator.getShape().localPosition.set(0,0,0) #이 로케이터는 보이지 않음 self.locator.getShape().v.set(False) #이 로케이터는 보이지 않음 self.locator.v.set(False) #이 로케이터는 보이지 않음 self.locator.setParent(pointA) self.locator.rename( pointB+'_CONNLOC' ) # 커브쉐입에 어트리뷰트 추가 self.curve.addAttr( 'curveConnectedTo', at='message' ) self.curve.addAttr( 'curveConnectedLOC', at='message' ) # 어트리뷰트 연결 pointB.message >> self.curve.curveConnectedTo self.locator.message >> self.curve.curveConnectedLOC
def HandCrv( size=1, name='handCrv') : ctrlName = pm.curve (d = 1 , p = ( (-0.100562 , 1.31677 , 0 ), ( 0.122399 , 1.31664 , 0 ), ( 0.299532 , 1.446367 , 0 ), ( 0.319319 , 1.568869 , 0 ), ( 0.417828 , 1.688667 , 0 ), ( 0.594046 , 1.669517 , 0 ), ( 0.550214 , 1.893314 , 0 ), ( 0.383986 , 1.878861 , 0 ), ( 0.246061 , 1.70714 , 0 ), ( 0.207006 , 1.724846 , 0 ), ( 0.215157 , 1.842864 , 0 ), ( 0.380575 , 2.182962 , 0 ), ( 0.191945 , 2.281101 , 0 ), ( 0.0856495 , 1.873534 , 0 ), ( 0.00886914 , 1.874275 , 0 ), ( 0.030434 , 2.364695 , 0 ), ( -0.209958 , 2.343528 , 0 ), ( -0.0939414 , 1.867589 , 0 ), ( -0.170241 , 1.819424 , 0 ), ( -0.349394 , 2.178222 , 0 ), ( -0.525161 , 2.058232 , 0 ), ( -0.293742 , 1.758312 , 0 ), ( -0.22419 , 1.425819 , 0 ), ( -0.100562 , 1.31677 , 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), name = name ) ctrlName.scale.set(size,size,size) pm.makeIdentity (ctrlName , apply=True , s=True) return ctrlName
def wiggleJointChain(strPnt, endPnt, side='FL', chainPos='Upper'): ''' create joint chain between two points (strPnt & endPnt). require name string of strPnt & endPnt ''' strPos = pm.xform( strPnt, q=True, ws=True, translation=True ) endPos = pm.xform( endPnt, q=True, ws=True, translation=True ) if side.endswith('L'): sideLabel = 1 elif side.endswith('R'): sideLabel = 2 ikSpCrv = pm.curve( degree=2, editPoint=( strPos, endPos) ) ikSpCrv.rename( 'wiggle_%s_%s_CRV'%(side, chainPos) ) ikSpCrvShp = ikSpCrv.listRelatives(shapes=True)[0] pm.select(clear=True) jnt2pos = pm.pointOnCurve( ikSpCrv, pr=0.3333, turnOnPercentage=True) jnt3pos = pm.pointOnCurve( ikSpCrv, pr=0.6667, turnOnPercentage=True ) jntPos = ( strPos, jnt2pos, jnt3pos, endPos ) jntList = [] for pnt in jntPos: jName = 'Wiggle_%s_%s_%02d'%(side, chainPos, jntPos.index(pnt)+1) newJoint = pm.joint(name=jName, p=pnt) newJoint.side.set(sideLabel) newJoint.__getattr__('type').set(18) newJoint.otherType.set(jName) jntList.append(newJoint) pm.joint( jntList[0], edit=True, orientJoint='xyz', secondaryAxisOrient='xup', children=True, zeroScaleOrient=True ) ikHandle = pm.ikHandle( name='Wiggle_%s_%s_ikHandle'%(side, chainPos), solver='ikSplineSolver', createCurve=False, curve=ikSpCrvShp, startJoint=jntList[0].name(), endEffector=jntList[-1].name(), rootOnCurve=False, createRootAxis=True, parentCurve=False ) jntGrp = jntList[0].listRelatives(parent=True)[0] jntGrp.rename('Wiggle_%s_%s'%(side, chainPos)) crvInfo = pm.createNode('curveInfo', name='crvInf_wiggle_%s_%s'%(side, chainPos)) multDiv1 = pm.createNode('multiplyDivide', name='md_wiggle_%s_%s_01'%(side, chainPos)) multDiv2 = pm.createNode('multiplyDivide', name='md_wiggle_%s_%s_02'%(side, chainPos)) ikSpCrvShp.worldSpace >> crvInfo.inputCurve arcLgt = crvInfo.arcLength.get() multDiv1.input2X.set(arcLgt) multDiv1.operation.set(2) spacing = jntList[1].tx.get() multDiv2.input2X.set(spacing) multDiv1.outputX >> multDiv2.input1X crvInfo.arcLength >> multDiv1.input1X for jnt in jntList[1:]: multDiv2.outputX >> jnt.tx return ikSpCrvShp, ikSpCrv, ikHandle[0], jntGrp
def drawCurve( self ): verticies = [ ] for edge in self.edges: verticies += [ edge.v1, edge.v2 ] curve = pm.curve( degree = 1, p = [ verticies[ 0 ], verticies[ 1 ] ] ) for i in range( 2, len( verticies ) ): vertex = verticies[ i ] curve = pm.curve( curve, p=[ vertex ], append = True ) return curve
def create_shape_box_arm(refs, geometries, epsilon=0.01, default_size=1.0): # TODO: Prevent crashes when there's no geometries ref = next(iter(refs)) ref_tm = ref.getMatrix(worldSpace=True) positions = [r.getTranslation(space='world') for r in refs] # Resolve raycast directions dir_offset_tm = pymel.datatypes.Matrix( # Remove translation from ref_tm to keep direction normalized. ref_tm.a00, ref_tm.a01, ref_tm.a02, ref_tm.a03, ref_tm.a10, ref_tm.a11, ref_tm.a12, ref_tm.a13, ref_tm.a20, ref_tm.a21, ref_tm.a22, ref_tm.a23, 0, 0, 0, 1 ) x_pos = ref.getTranslation(space='world').x dirs = [ OpenMaya.MPoint(0,-1,0) * dir_offset_tm, OpenMaya.MPoint(0,1,0) * dir_offset_tm, OpenMaya.MPoint(0,0,-1) * dir_offset_tm, OpenMaya.MPoint(0,0,1) * dir_offset_tm ] # HACK : Check the x_position to know in which direction we need to do the raycast if x_pos >= 0.0: dirs.append( OpenMaya.MPoint(1,0,0) * dir_offset_tm, ) else: dirs.append( OpenMaya.MPoint(-1,0,0) * dir_offset_tm, ) min_x, max_x, min_y, max_y, min_z, max_z = _get_bounds_using_raycast(positions, dirs, geometries, parent_tm=ref_tm) # Ensure a minimum size for the ctrl if (max_x - min_x) < epsilon: max_x = default_size if (max_y - min_y) < epsilon: min_y = -default_size * 0.5 max_y = default_size * 0.5 if (max_z - min_z) < epsilon: min_z = -default_size * 0.5 max_z = default_size * 0.5 # Convert our bouding box #min_x = 0 pos1 = pymel.datatypes.Point(min_x, min_y, min_z) pos2 = pymel.datatypes.Point(min_x, min_y, max_z) pos3 = pymel.datatypes.Point(min_x, max_y, min_z) pos4 = pymel.datatypes.Point(min_x, max_y, max_z) pos5 = pymel.datatypes.Point(max_x, min_y, min_z) pos6 = pymel.datatypes.Point(max_x, min_y, max_z) pos7 = pymel.datatypes.Point(max_x, max_y, min_z) pos8 = pymel.datatypes.Point(max_x, max_y, max_z) node = pymel.curve(d=1, p=[pos2, pos4, pos8, pos6, pos2, pos1, pos3, pos4, pos8, pos7, pos5, pos6, pos5, pos1, pos3, pos7] ) # Expose the rotateOrder node.rotateOrder.setKeyable(True) return node
def getUpperLowerEyeCurves(crv, cornerCvIds): ''' cornerCvIds = ids for in, up, out, low cvs ''' # get a continuous slice of cvs first lowCvId = min(cornerCvIds[0], cornerCvIds[2]) highCvId = max(cornerCvIds[0], cornerCvIds[2]) # is this the upper slice or lower slice? if lowCvId < cornerCvIds[1] < highCvId: # upCV is inbetween, so must be upper slice sliceName = ['upper', 'lower'] else: sliceName = ['lower', 'upper'] # get the first slice firstSlice = range(lowCvId, highCvId+1) # get the second slice maxCvId = crv.numCVs() secondSlice = range(highCvId, maxCvId) + range(0, lowCvId+1) crvMap = {} for name, sliceCrv in zip(sliceName, [firstSlice, secondSlice]): # create the crv print sliceCrv cvPoss = [crv.cv[i].getPosition(space='world') for i in sliceCrv] newCrv = pm.curve(p=cvPoss, d=1, n=name+'_crv') crvMap[name] = newCrv return crvMap
def test_ik_rig_build(self): pos = [(0, y, 0) for y in range(15)] crv = pm.curve(p=pos) loc = pm.spaceLocator(p=(0, 0, -1)) reg_node = ik_rig.build('temp', crv, loc, 10, 4, 'xyz') # Check controls connected to reg_node cnts = [pm.PyNode('temp%s_ik_cnt' % (x+1)) for x in range(3)] for c in cnts: attr = getattr(reg_node, c.name()) self.assertEqual(attr.listConnections()[0].name(), c) # Confirm ik joint chain root connected to reg_node self.assertEqual(reg_node.temp_chain_root.listConnections()[0]. name(), 'temp_Jnt_1') # Confirm heirarchy tn = pm.PyNode('temp_ik_rig_grp') cnts_grp = pm.PyNode('temp_cnts_grp') jnts_grp = pm.PyNode('temp_ik_skin_jnts_grp') dont_move = pm.PyNode('temp_dont_move_grp') fol_grp = pm.PyNode('temp_follicle_grp') self.assertTrue(pm.PyNode(tn).objExists()) self.assertTrue( transforms.assertParentIs(cnts_grp, tn)) self.assertTrue( transforms.assertParentIs(jnts_grp, tn)) self.assertTrue( transforms.assertParentIs(dont_move, tn)) self.assertTrue( transforms.assertParentIs(fol_grp, tn))
def GuideCrv ( startGuider=None , endGuider=None ): if startGuider==None or endGuider==None: startGuider,endGuider = pm.ls(sl=True) pm.select(clear=True) startJnt = pm.joint ( n = startGuider.name()+"_guideCrvJnt") pm.parent (startJnt , startGuider) startJnt.translate.set (0,0,0) startJnt.visibility.set (0) pm.setAttr ( startJnt.visibility , lock=True ) endJnt = pm.joint ( n = endGuider.name()+"_guideCrvJnt" ) pm.parent (endJnt , endGuider) endJnt.translate.set (0,0,0) endJnt.visibility.set (0) pm.setAttr ( endJnt.visibility , lock=True ) startJntPos = pm.xform ( startJnt , q=True , ws=True , t=True) endJntPos = pm.xform ( endJnt , q=True , ws=True , t=True) guideCrv = pm.curve ( degree=1 , p = (startJntPos ,endJntPos) , k=(1,2) ) pm.rename ( guideCrv , startGuider.name()+"_guideCrv") pm.skinCluster ( guideCrv , startJnt , endJnt ) guideCrv.inheritsTransform.set(0) guideCrv.template.set(1) pm.select(clear=True) return guideCrv
def create_guideSurface( IdName, listOfJnts ): loftCurves = [] for i in range(2): # duplicate and select hierarchy of joints listOfOffsetJnts = pm.duplicate( listOfJnts, name = 'b_' + IdName +'_offset1', parentOnly = True ) # offset each joint on it's own z-axis for jnt in listOfOffsetJnts: if i == 0: pm.move(jnt, (0,0,-0.5), relative = True, objectSpace = True, preserveChildPosition = True) if i == 1: pm.move(jnt, (0,0,0.5), relative = True, objectSpace = True, preserveChildPosition = True) # draw loftcurves loftCurvePoints = [] for each in listOfOffsetJnts: jntPosition = pm.xform(each, q = True, t = True, ws = True) loftCurvePoints.append(jntPosition) loftCurves.append( pm.curve( name = IdName + '_loftCurve' + str(i), degree = 1, point = loftCurvePoints ) ) pm.delete(listOfOffsetJnts) # loft guideSurface guideSurface = pm.loft( loftCurves[0], loftCurves[1], name = IdName + '_guide_surface', ar=True, rsn=True, d=3, ss=1, object=True, ch=False, polygon=0 ) guideSurface = pm.rebuildSurface( guideSurface ,ch=1, rpo=1, rt=0, end=1, kr=1, kcp=0, kc=0, su=0, du=3, sv=1, dv=3, tol=0.01, fr=0, dir=2 ) # cleanup pm.delete( loftCurves ) guideSurface[0].inheritsTransform.set(False) guideSurface[0].overrideEnabled.set(True) guideSurface[0].overrideDisplayType.set(1) # guideSurface[0].visibility.set(False) print('Successfully lofted guide surface. Continuing...') return guideSurface
def build(self): """builds it self """ self.curve = curve(d=1, p=[(1, 0, 0), (-1, 0, 0)], k=(0, 1)) self.corner1_locator = spaceLocator() self.corner2_locator = spaceLocator() select(self.curve) ClusterCurve() # try to find the clusterHandles curve_shape = curve.getShape() clusters = [] handles = [] for node in curve_shape.listHistroy(): if isinstance(node, ClusterHandle): handles.append(node) elif isinstance(node, Cluster): clusters.append(node) self.cluster1 = clusters[0] self.cluster2 = clusters[0] self.cluster_handle1 = handles[0] self.cluster_handle2 = handles[1] # set clusters to absolute self.cluster1.setAttr('relative', 0) self.cluster2.setAttr('relative', 0)
def FootCrv ( size=1, name='footCrv') : ctrlName = pm.curve (d = 1 , p = ( (0.00443704, -0.677552, 0) ,(0.144546, -0.530692, 0) ,(0.352021, 0.0542797, 0) ,(0.348132, 0.276213, 0) ,(0.448607, 0.414713, 0) ,(0.322616, 0.478526, 0) ,(0.256431, 0.302266, 0) ,(0.180984, 0.356473, 0) ,(0.32057, 0.570811, 0) ,(0.17346, 0.659144, 0) ,(0.0855168, 0.404945, 0) ,(0.0139709, 0.433904, 0) ,(0.106305, 0.743462, 0) ,(-0.107758, 0.761677, 0) ,(-0.0858926, 0.450201, 0) ,(-0.16749, 0.440366, 0) ,(-0.230299, 0.787238, 0) ,(-0.496683, 0.690941, 0) ,(-0.336863, 0.360119, 0) ,(-0.394508, 0.133506, 0) ,(-0.159134, -0.138775, 0) ,(-0.28817, -0.523902, 0) ,(-0.195119, -0.663426, 0) ,(0.00443704, -0.677552, 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) , name = name) ctrlName.scale.set(size,size,size) pm.makeIdentity (ctrlName , apply=True , s=True) return ctrlName
def box(name, radius, normal, color): r = radius points = [(-1*r, -1*r,-1*r), (-1*r, -1*r, 1*r), ( 1*r, -1*r, 1*r), ( 1*r, -1*r,-1*r), (-1*r, -1*r,-1*r), (-1*r, 1*r,-1*r), (-1*r, 1*r, 1*r), (-1*r, -1*r, 1*r), (-1*r, 1*r, 1*r), ( 1*r, 1*r, 1*r), ( 1*r, -1*r, 1*r), ( 1*r, 1*r, 1*r), ( 1*r, 1*r,-1*r), ( 1*r, -1*r,-1*r), ( 1*r, 1*r,-1*r), (-1*r, 1*r,-1*r)] b = pm.curve( point=points, name=name, degree=1, worldSpace=True) u.aimNormal(b, normal=normal) pm.makeIdentity(b,apply=True) b.getShape().overrideEnabled.set(True) b.getShape().overrideColor.set(color) return b
def test_ik_rig_build_errors(self): self.assertRaises(errors.InputError, ik_rig.build) self.assertRaises(errors.InputError, ik_rig.build, 'curve', 'loc', 'num') pos = [(0, y, 0) for y in range(15)] crv = pm.curve(p=pos) loc = pm.spaceLocator() self.assertRaises(errors.InputError, ik_rig.build, crv, 'loc', 'num_jnts', 'num_cnts') self.assertRaises(errors.InputError, ik_rig.build, crv, loc, 'num_jnts', 'num_cnts') self.assertRaises(errors.InputError, ik_rig.build, crv, 'loc', 5, 'num_cnts') self.assertRaises(errors.InputError, ik_rig.build, crv, loc, 5, 1, 'xyz') self.assertRaises(errors.InputError, ik_rig.build, crv, 'loc', 5, 2, 'xyz') self.assertRaises(errors.InputError, ik_rig.build, crv, loc, 5, 2, 'xya')
def fourSidedArrowCtrl(cls, name=''): node = pm.curve( per=True, d=1, p=[(-0.31907, 1.758567, 0), (-0.31907, 0.272474, 0), (-1.758567, 0.272474, 0), (-1.758567, 1.172378, 0), (-2.930946, 0, 0), (-1.758567, -1.172378, 0), (-1.758567, -0.272474, 0), (-0.31907, -0.272474, 0), (-0.31907, -1.758567, 0), (-1.172378, -1.758567, 0), (0, -2.930946, 0), (1.172378, -1.758567, 0), (0.31907, -1.758567, 0), (0.31907, -0.272474, 0), (1.758567, -0.272474, 0), (1.758567, -1.172378, 0), (2.930946, 0, 0), (1.758567, 1.172378, 0), (1.7585607, 0.272474, 0), (0.31907, 0.272474, 0), ( 0.31907, 1.758567, 0), (1.172378, 1.758567, 0), (0, 2.930946, 0), (-1.172378, 1.758567, 0), (-0.31907, 1.758567, 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]) ) cls.rename(node, name) return node
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 arrows4(name, radius, normal, color): r = radius points = [(0.25*r, 0*r, 0.75*r), (0*r, 0*r, 1*r), (-.25*r, 0*r, 0.75*r), (0.25*r, 0*r, 0.75*r), (0*r, 0*r, 1*r), (0*r, 0*r, -1*r), (0.25*r, 0*r, -.75*r), (-.25*r, 0*r, -.75*r), (0*r, 0*r, -1*r), (0*r, 0*r, 0*r), (-1*r, 0*r, 0*r), (-.75*r, 0*r, 0.25*r), (-.75*r, 0*r, -.25*r), (-1*r, 0*r, 0*r), (1*r, 0*r, 0*r), (0.75*r, 0*r, -.25*r), (0.75*r, 0*r, 0.25*r), (1*r, 0*r, 0)] a = pm.curve(point=points, name=name, degree=1, worldSpace=True) u.aimNormal(a, normal=normal) pm.makeIdentity(a,apply=True) a.getShape().overrideEnabled.set(True) a.getShape().overrideColor.set(color) return a
def alignVertexLoopWithCurve(): ''' select loop of verts curve is created to sculpt verts ''' verts = pm.ls(os=True, fl=True) sv = mesh.SortedVertices(verts) # use first and last verts to create 1-span curve firstVert = sv.verts[0] lastVert = sv.verts[-1] firstPos = firstVert.getPosition() lastPos = lastVert.getPosition() crv = pm.curve(ep=(firstPos, lastPos), d=3) endParam = crv.getParamAtPoint(lastPos) * 0.99 # place verts along curve totalVerts = len(sv.verts) params = [endParam/(totalVerts-1)*vertId for vertId in range(totalVerts)] print params for vert, param in zip(sv.verts, params): print vert, param pos = crv.getPointAtParam(param) vert.setPosition(pos) # make wire deformer to sculpt verts wire = pm.wire(sv.verts, w=crv)
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 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 createCurveFromPoints(vert1,vert2): startFrame = pm.intSliderGrp('startFrameSlider',q=1,v=1) endFrame = pm.intSliderGrp('endFrameSlider',q=1,v=1) points = [] tempPos = [0,0,0] sample = pm.floatSliderGrp('sampleSlider',q=1,v=1) for f in drange(startFrame,endFrame+1,sample): pm.currentTime(f) pos = getMidPointPos(vert1, vert2) if pos != tempPos: points.append(pos) tempPos = pos crvName = vert1.name().split('.')[0] + '_trail_crv' crv = pm.curve(name = crvName, ep=points) pm.currentTime(startFrame) return crv
def create_ik_spline(self): points = [] for jnt in self.ik_joints: pos = jnt.getTranslation(space='world') points.append(pos) self.ik_crv = pm.curve(n='spine_ikSpline_crv', d=1, p=points) self.ik_crv.attr('v').set(0) self.ik_spline = pm.ikHandle(sj=self.ik_joints[0], ee=self.ik_joints[-1], c=self.ik_crv, ccv=False, sol='ikSplineSolver', name='spine_ikSpline')[0] self.ik_spline.attr('v').set(0) pm.parent(self.ik_crv, self.rig_grp) pm.parent(self.ik_spline, self.rig_grp)
def generateCubeFromVector(start_pt, end_pt, origin): matrix = origin.worldMatrix.get().inverse() start_pt = start_pt * matrix end_pt = end_pt * matrix x_vec = start_pt - end_pt y_vec = dt.Vector([0, 1, 0]) y_vec = y_vec.rotateBy(x_vec, math.pi / 4) z_vec = dt.Vector([0, 0, 1]) z_vec = z_vec.rotateBy(x_vec, math.pi / 4) # NOTE 计算8个顶点坐标位置 distant = 3 start_corner_1 = (start_pt + y_vec * distant) start_corner_2 = (start_pt - y_vec * distant) start_corner_3 = (start_pt + z_vec * distant) start_corner_4 = (start_pt - z_vec * distant) end_corner_1 = (end_pt + y_vec * distant) end_corner_2 = (end_pt - y_vec * distant) end_corner_3 = (end_pt + z_vec * distant) end_corner_4 = (end_pt - z_vec * distant) # NOTE 生成方块曲线 return pm.curve(d=1, p=[ start_corner_1, start_corner_3, start_corner_2, start_corner_4, start_corner_1, end_corner_1, end_corner_3, end_corner_2, end_corner_4, end_corner_1, end_corner_4, start_corner_4, start_corner_2, end_corner_2, end_corner_3, start_corner_3, ])
def Circle3ArrowCrv(size=1, name='circle3ArrowCrv'): size /= 2.0 ctrlName = pm.curve( d=1, p=((-0.006446, 0, 0), (0.012892, 0.196348, 0), (0.070165, 0.38515, 0), (0.163171, 0.559152, 0), (0.288335, 0.711665, 0), (0.440848, 0.836829, 0), (0.61485, 0.929835, 0), (0.803652, 0.987108, 0), (0.803456, 1.261041, 0), (0.606912, 1.261041, 0), (1, 1.654129, 0), (1.393088, 1.261041, 0), (1.196544, 1.261041, 0), (1.196348, 0.987108, 0), (1.38515, 0.929835, 0), (1.559152, 0.836829, 0), (1.711665, 0.711665, 0), (1.836829, 0.559152, 0), (1.929835, 0.38515, 0), (1.987108, 0.196348, 0), (2.261041, 0.196544, 0), (2.261041, 0.393088, 0), (2.654129, 0, 0), (2.261041, -0.393088, 0), (2.261041, -0.196544, 0), (1.987108, -0.196348, 0), (1.929835, -0.38515, 0), (1.836829, -0.559152, 0), (1.711665, -0.711665, 0), (1.559152, -0.836829, 0), (1.38515, -0.929835, 0), (1.196348, -0.987108, 0), (1.196544, -1.261041, 0), (1.393088, -1.261041, 0), (1, -1.654129, 0), (0.606912, -1.261041, 0), (0.803456, -1.261041, 0), (0.803652, -0.987108, 0), (0.61485, -0.929835, 0), (0.440848, -0.836829, 0), (0.288335, -0.711665, 0), (0.163171, -0.559152, 0), (0.070165, -0.38515, 0), (0.012892, -0.196348, 0), (-0.006446, 0, 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, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44), name=name) ctrlName.scale.set(size, size, size) pm.makeIdentity(ctrlName, apply=True, s=True) return ctrlName
def generateCubeFromVector(start_pt, end_pt, distant=3, angle=45): x_vec = start_pt - end_pt y_vec = start_pt.cross(end_pt) if angle: # NOTE 角度转弧度 angle = angle * math.pi / 180 y_vec = y_vec.rotateBy(x_vec, angle) y_vec.normalize() z_vec = x_vec.cross(y_vec) z_vec.normalize() # NOTE 计算8个顶点坐标位置 start_corner_1 = start_pt + y_vec * distant start_corner_2 = start_pt - y_vec * distant start_corner_3 = start_pt + z_vec * distant start_corner_4 = start_pt - z_vec * distant end_corner_1 = end_pt + y_vec * distant end_corner_2 = end_pt - y_vec * distant end_corner_3 = end_pt + z_vec * distant end_corner_4 = end_pt - z_vec * distant # NOTE 生成方块曲线 return pm.curve(d=1, p=[ start_corner_1, start_corner_3, start_corner_2, start_corner_4, start_corner_1, end_corner_1, end_corner_3, end_corner_2, end_corner_4, end_corner_1, end_corner_4, start_corner_4, start_corner_2, end_corner_2, end_corner_3, start_corner_3, ])
def build(): ''' It takes extra work to draw circle with a single line. This is accomplished by having the terminal point exactly where the curve must pass through and points very near it to give it the (almost) correct bend. This is repeated 3x, then that same technique is used to make a quarter arc, then an additional hoop. The first 3 hoops and transition are made vertical, which puts the transition ending back on the ground plane, where the 4th hoop remains. ''' ctrl = sphere(ax=[0, 1, 0], ssw=0, esw=360, r=0.49 * 0.9, d=3, s=6, nsp=4)[0] major = util.CirclePoints.major minor = util.CirclePoints.minor body = util.CirclePoints.body terminal = util.CirclePoints.terminal s = [-minor, 0, -major] e = [minor, 0, -major] hoop = [terminal, s, s] + body + [e, e, terminal] count = len(hoop) transArc = [terminal] + \ [[-minor, 0, -major]] * 2 + \ [body[0]] + \ [[-major, 0, -minor]] * 2 + \ [[-.5 * 0.9, 0, 0]] line = curve(p=hoop * 3 + transArc + hoop, d=3) rotate(line.cv[:count * 3 + len(transArc) - 1], [90, 0, 0]) rotate(line.cv[count:count * 2], [0, 60, 0]) rotate(line.cv[count * 2:count * 3], [0, -60, 0]) rotate(line.cv[count * 3 + len(transArc):], [0, 90, 0]) line.rename('outline') line.getShape().setParent(ctrl, add=True, shape=True) delete(line) return ctrl
def createRbnSrf(self): startJntVec = om.MVector(self.start[0], self.start[1], self.start[2]) endJntVec = om.MVector(self.end[0], self.end[1], self.end[2]) diffVec = endJntVec - startJntVec # calculate the witdth of the surface as a fraction of the total joint chain length jntChainLength = diffVec.length() self.width = jntChainLength * self.widthMult crvPoints = [] for i in range(self.numCtrl): vec = startJntVec + diffVec * (i * 1.0 / (self.numCtrl - 1)) crvPoints.append([vec.x, vec.y, vec.z]) tmp = pm.curve(n=self.name + '_crv1', d=1, p=crvPoints) crv1 = pm.ls(tmp)[0] crv1.setPivots(self.start) crv2 = pm.duplicate(crv1)[0] self.offsetCrv(crv1, -1.0 * self.width / 2) self.offsetCrv(crv2, 1.0 * self.width / 2) tmpLoftSrf = pm.loft(crv1, crv2, ch=0, u=1, c=0, ar=1, d=3, ss=1, rn=0, po=0, rsn=1, n=self.name + "_tmp")[0] rebuiltLoftSrf = \ pm.rebuildSurface(ch=0, rpo=0, rt=0, end=1, kr=0, kcp=0, kc=0, su=0, du=3, sv=0, dv=1, fr=0, dir=2, n=self.name + "_srf")[0] rebuiltLoftSrf.setPivots(rebuiltLoftSrf.c.get()) self.rbnSrf = rebuiltLoftSrf pm.delete(self.rbnSrf, ch=1) pm.delete([crv1, crv2, tmpLoftSrf]) pm.parent(self.rbnSrf, self.mainGrp)
def createBoundingBox(x1, y1, z1, x2, y2, z2): curve1 = pm.curve(degree=1, p=[(x1, y1, z1), (x1, y1, z2), (x2, y1, z2), (x2, y1, z1), (x1, y1, z1)]) curve2 = pm.curve(degree=1, p=[(x1, y2, z1), (x1, y2, z2), (x2, y2, z2), (x2, y2, z1), (x1, y2, z1)]) curve3 = pm.curve(degree=1, p=[(x1, y1, z1), (x1, y2, z1)]) curve4 = pm.curve(degree=1, p=[(x1, y2, z2), (x1, y1, z2)]) curve5 = pm.curve(degree=1, p=[(x2, y2, z2), (x2, y1, z2)]) curve6 = pm.curve(degree=1, p=[(x2, y2, z1), (x2, y1, z1)]) pm.group(curve1, curve2, curve3, curve4, curve5, curve6, n='Bounding Box')
def makeCube(self, nameOverride='newProxy'): currentScale = self.obj.scale.get() currentTrans = self.obj.translate.get() currentRotate = self.obj.rotate.get() # set object transforms to init self.obj.scale.set((1, 1, 1)) self.obj.rotate.set((0, 0, 0)) self.obj.translate.set((0, 0, 0)) boundingBox = pm.exactWorldBoundingBox(self.obj) # return object to where it was self.obj.scale.set(currentScale) self.obj.rotate.set(currentRotate) self.obj.translate.set(currentTrans) height = (boundingBox[4] - boundingBox[1]) cube = pm.polyCube(width=(boundingBox[3] - boundingBox[0]), height=height, depth=(boundingBox[5] - boundingBox[2]), name=nameOverride + '_box')[0] cube.translate.set(0, height / 2, 0) # freeze cube transforms pm.makeIdentity(cube, a=1, t=1) # create an arrow showing the direction of # front rotation arrow = pm.curve(d=1, p=[(-2, 0, 0), (-2, 0, 6), (-4, 0, 6), (0, 0, 10), (4, 0, 6), (2, 0, 6), (2, 0, 0)], k=[0, 1, 2, 3, 4, 5, 6], n=nameOverride) pm.parent(cube, arrow) # add the cube to display layer self.addToDisplayLayer(cube) arrow.rotate.set(currentRotate) arrow.scale.set(currentScale) arrow.translate.set(currentTrans) # parent the cube to the arrow return (arrow, arrow.name())
def createLink(self, guide1, guide2): clusters = [] guide1Pos = guide1.getTranslation(space='world') guide2Pos = guide2.getTranslation(space='world') linkCrv = pm.curve(n=guide2 + '_crvlink', d=1, p=[guide1Pos, guide2Pos]) numCvs = linkCrv.numCVs() for i in range(numCvs): linkCls = pm.cluster(linkCrv.name() + '.cv[' + str(i) + ']', name=linkCrv.name() + '_cls_' + str(i))[1] linkCls.visibility.set(0) pm.parent(linkCls, self.bpTopGrp) clusters.append(linkCls) pm.pointConstraint(guide1, clusters[0], mo=1) pm.pointConstraint(guide2, clusters[1], mo=1) linkCrv.inheritsTransform.set(0) linkCrv.overrideEnabled.set(1) linkCrv.overrideDisplayType.set(1) pm.parent(linkCrv, self.bpTopGrp)
def RMCreateCubeLine(self, height, length, width, centered=False, offsetX=float(0.0), offsetY=float(0.0), offsetZ=float(0.0), name=""): if centered: offsetX = offsetX - float(height) / 2.0 if name == "": defaultName = "CubeLine" else: defaultName = name CubeCurve = [] pointArray = [ [0 + offsetX, -length / 2.0 + offsetY, width / 2.0 + offsetZ], [0 + offsetX, -length / 2.0 + offsetY, -width / 2.0 + offsetZ], [ height + offsetX, -length / 2.0 + offsetY, -width / 2.0 + offsetZ ], [height + offsetX, length / 2.0 + offsetY, -width / 2.0 + offsetZ], [height + offsetX, length / 2.0 + offsetY, width / 2.0 + offsetZ], [0 + offsetX, length / 2.0 + offsetY, width / 2.0 + offsetZ], [0 + offsetX, length / 2.0 + offsetY, -width / 2.0 + offsetZ], [height + offsetX, length / 2.0 + offsetY, -width / 2.0 + offsetZ], [ height + offsetX, -length / 2.0 + offsetY, -width / 2.0 + offsetZ ], [height + offsetX, -length / 2.0 + offsetY, width / 2.0 + offsetZ], [height + offsetX, length / 2.0 + offsetY, width / 2.0 + offsetZ], [height + offsetX, -length / 2.0 + offsetY, width / 2.0 + offsetZ], [0 + offsetX, -length / 2.0 + offsetY, width / 2.0 + offsetZ], [0 + offsetX, length / 2.0 + offsetY, width / 2.0 + offsetZ], [0 + offsetX, length / 2.0 + offsetY, -width / 2.0 + offsetZ], [0 + offsetX, -length / 2.0 + offsetY, -width / 2.0 + offsetZ] ] curve = pm.curve(d=1, p=pointArray, name=defaultName) # return CubeCurve[0] return curve
def convert_to_curve(sellist, name='converted_curve', smoothness=1): ''' Connect object in list with a Nurbs Curve ''' # print sellist if any([ get_type(ob) == typ for ob in sellist for typ in ['transform', 'joint', 'mesh','nurbsCurve']]): # print sellist cvpMatrix = [ob.getTranslation('world') for ob in sellist if hasattr(ob, 'getTranslation')] if any([get_type(cpn) == 'vertex' for cpn in sellist]): cvpMatrix = [get_closest_info(cpn.getPosition('world'), cpn.node())['Closest Point'] for cpn in sellist] if any([get_type(cpn) == 'edge' for cpn in sellist]): cvpMatrix = [get_closest_info(pm.dt.center(*[cpn.getPoint(i,'world') for i in range(2)]), cpn.node())['Closest Mid Edge'] for cpn in sellist] if any([get_type(cpn) == 'face' for cpn in sellist]): flist = [] for mfn in sellist: for mfid in mfn.indices(): mf = mfn.node().f[mfid] if mf not in flist: flist.append(mf) cvpMatrix = [ get_closest_info(pm.dt.center(*[mf.getPoint(i,'world') for i in range(4)]), mf.node())['Closest Point'] for mf in flist ] assert 'cvpMatrix' in locals(), 'Cannot create curve for input {}'.format(sellist) # cvpMatrix.sort() # temp_list = [cvpMatrix[0]] # id = 0 # while id<(len(cvpMatrix)-1): # distancelist = [(ncvp, cvpMatrix[id].distanceTo(ncvp)) for ncvp in cvpMatrix] # distancelist.sort(key=lambda x:x[1]) # shortest = distancelist[0][0] if distancelist[0][0]!=temp_list[-1] else distancelist[1][0] # cvpMatrix.remove(shortest) # temp_list.append(shortest) # id += 1 # cvpMatrix = temp_list if smoothness > 1: cvpMatrix = [cvpMatrix[0]]+cvpMatrix+[cvpMatrix[-1]] key = range(len(cvpMatrix)+smoothness-1) crv = pm.curve(d=smoothness, p=cvpMatrix, k=key) crv.rename(name) return crv
def create_shape_attrholder(size=1.0, **kwargs): s1 = size s2 = s1 * 0.7 node = pymel.curve(d=1, p=[(0, 0, s1), (0, s2, s2), (0, s1, 0), (0, s2, -s2), (0, 0, -s1), (0, -s2, -s2), (0, -s1, 0), (0, -s2, s2), (0, 0, s1), (-s2, 0, s2), (-s1, 0, 0), (-s2, s2, 0), (0, s1, 0), (s2, s2, 0), (s1, 0, 0), (s2, 0, -s2), (0, 0, -s1), (-s2, 0, -s2), (-s1, 0, 0), (-s2, -s2, 0), (0, -s1, 0), (s2, -s2, 0), (s1, 0, 0), (s2, 0, s2), (0, 0, s1), (-s2, 0, s2)], k=range(26), *kwargs) # Expose the rotateOrder node.rotateOrder.setKeyable(True) return node
def createFootIkSplineCurveAndBindIt(self): pm.select(cl = True) #create foot_splineIk_curve self.foot_splineIk_curve = pm.curve( p = self.footIkJointsPositionList, ws = True, d = 2 , n = self.prefix + '_foot_splineIk_curve') pm.select(cl = True) #create foot_splineIk_curve_grp self.foot_splineIk_curve_grp = pm.group(n = self.prefix + '_foot_splineIk_curve_grp') pm.select(cl = True) #parent pm.parent(self.foot_splineIk_curve, self.foot_splineIk_curve_grp) pm.select(cl = True) #smoothbind splineIk curve to curve bound joints self.foot_splineIk_skincluster = pm.skinCluster( self.curve_bound_j_base , self.curve_bound_j_tip , self.foot_splineIk_curve , tsb=True, n = self.prefix + '_splineIk_skincluster', rui = False, ih = True) pm.select(cl = True)
def pinCnt(self): ''' This procedure creates a pin control ''' self.__buildName() if not self.controlName: return line = pm.curve( d = 1 , p = [ ( 0 , 0 , 0 ) , ( 0.8 , 0 , 0 ) ] , k = [ 0 , 1 ] , n = self.controlName) circle = pm.circle( ch = 1 , o = True , nr = ( 0 , 1 , 0 ) , r = 0.1 ) [ 0 ] pm.move( 0.9 , 0 , 0 ,circle.getShape().cv , r = 1 ) pm.parent( circle.getShape() , line , shape = 1 , add = 1 ) pm.delete(circle) pm.select(cl = 1 ) self.control = line self.__finalizeCnt()
def boxCtrl(size=20.0, name=''): ''' Creates a box shaped nurbs curve ''' pos = size * 0.5 neg = pos * -1 points = [ (neg, pos, neg), (neg, neg, neg), (neg, neg, pos), (neg, pos, pos), (neg, pos, neg), (pos, pos, neg), (pos, neg, neg), (neg, neg, neg), (neg, neg, pos), (pos, neg, pos), (pos, neg, neg), (pos, pos, neg), (pos, pos, pos), (neg, pos, pos), (pos, pos, pos), (pos, neg, pos) ] knots = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] ctrl = pmc.curve(degree=1, p=points, k=knots, name=name) return ctrl
def hairDeformer_createCurve(*args): hfCount = 0 hfArr = [] degree = 3 # Get the selection, which should be the joint chain jointChain = getSelected() # assemble the joints to an array and get the coordinates of each for i in jointChain: jointTrans = pm.xform(i, q=True, t=True, worldSpace=True) tempX = jointTrans[0] tempY = jointTrans[1] tempZ = jointTrans[2] # Store the values in a base array hfArr.append((tempX, tempY, tempZ)) hfCount = hfCount + 1 # Number of knots # = numPoints + degree (default of 3) - 1 knotCount = degree + len(hfArr) - 1 knots = [] i = 0 while i < knotCount: knots.append(i) i = i + 1 # assemble the statement now print "Output is" print "pm.curve(p=" + str(hfArr) + ", k=" + str(knots) + ", d=" + str( degree) + ")" hairCurve = pm.curve(p=hfArr, k=knots, d=degree) print mel.eval("makeCurvesDynamic 2 { \"1\", \"0\", \"1\", \"1\", \"0\"};") # toggle the point lock to just the base # assumed the hair system is "hairSystem1" # going off from default follicle design pm.setAttr("follicleShape1.pointLock", 1) # Take the established joint chain and unparent temporarily parentJoints = cmds.listRelatives(jointChain, parent=True) # separate the joint from the parent baseJoint = jointChain[0] endJoint = jointChain[len(jointChain) - 1] print "Base joint:" + baseJoint print "End Joint:" + endJoint # Create spline handle on these joints now pm.ikHandle(sj=baseJoint, ee=endJoint, c=hairCurve) print "Hair system connection complete"
def generateCubeFromVector(start_pt, end_pt): x_vec = start_pt - end_pt y_vec = start_pt.cross(end_pt) # NOTE 旋转45度 y_vec = y_vec.rotateBy(x_vec, math.pi / 4) y_vec.normalize() z_vec = x_vec.cross(y_vec) z_vec.normalize() # NOTE 计算8个顶点坐标位置 distant = 3 start_corner_1 = start_pt + y_vec * distant start_corner_2 = start_pt - y_vec * distant start_corner_3 = start_pt + z_vec * distant start_corner_4 = start_pt - z_vec * distant end_corner_1 = end_pt + y_vec * distant end_corner_2 = end_pt - y_vec * distant end_corner_3 = end_pt + z_vec * distant end_corner_4 = end_pt - z_vec * distant # NOTE 生成方块曲线 return pm.curve(d=1, p=[ start_corner_1, start_corner_3, start_corner_2, start_corner_4, start_corner_1, end_corner_1, end_corner_3, end_corner_2, end_corner_4, end_corner_1, end_corner_4, start_corner_4, start_corner_2, end_corner_2, end_corner_3, start_corner_3, ])
def drawConnectionTo(self, toGuide): pm.select(cl=1) conMainGrp = pm.group(n=self.name + '_line_grp') conMainGrp.overrideEnabled.set(1) conMainGrp.overrideColor.set(18) pos1 = self.getPos() pos2 = toGuide.getPos() connectionCrv = pm.curve(d=1, p=[pos1, pos2], k=[0, 1], name=self.name + '_line') pm.parent(connectionCrv, conMainGrp) pm.skinCluster(self.transform, toGuide.transform, connectionCrv) self.lineConnections[connectionCrv.name()] = [ self.transform.name(), toGuide.transform.name() ] return conMainGrp
def createCompleteSwingManip(self): pm.select(cl = True) #create CompleteSwingManip self.completeSwingManip = pm.curve( p=[(-1, 1, 0), (-1, 3, 0), (-2, 3, 0), (0, 5, 0),(2, 3, 0),(1, 3, 0),(1, 1, 0), (-1, 1, 0)], ws = True, d = 1, name = self.prefix + '_complete_swing_manip' ) pm.select(cl = True) #completeSwingManipAimGrp self.completeSwingManipAimGrp = pm.group( n = self.prefix + '_complete_swing_manip_aim_grp') pm.select(cl = True) pm.parent(self.completeSwingManip, self.completeSwingManipAimGrp) pm.select(cl = True) #completeSwingManipGrp self.completeSwingManipGrp = pm.group( n = self.prefix + '_complete_swing_manip_grp') pm.select(cl = True) pm.parent(self.completeSwingManipAimGrp, self.completeSwingManipGrp) pm.select(cl = True)
def hexCtrl(radius=20.0, name='', axis='z'): ''' creates a circular nurbs curve of degree 1 with a raised section front and rear to indicate orientation ''' points = [(0, 0.2, 1.217186), (0.309017, 0.2, 0.951057), (0.309017, 0.2, 0.951057), (0.382683, 0, 0.92388), (0.382683, 0, 0.92388), (0.707107, 0, 0.707107), (0.92388, 0, 0.382683), (1, 0, 0), (0.92388, 0, -0.382683), (0.707107, 0, -0.707107), (0.382683, 0, -0.92388), (0.382683, 0, -0.92388), (0.309017, 0.2, -0.951057), (0.309017, 0.2, -0.951057), (0, 0.2, -1), (-0.309017, 0.2, -0.951057), (-0.309017, 0.2, -0.951057), (-0.382683, 0, -0.92388), (-0.382683, 0, -0.92388), (-0.707107, 0, -0.707107), (-0.92388, 0, -0.382683), (-1, 0, 0), (-0.92388, 0, 0.382683), (-0.707107, 0, 0.707107), (-0.382683, 0, 0.92388), (-0.382683, 0, 0.92388), (-0.309017, 0.2, 0.951057), (-0.309017, 0.2, 0.951057), (0, 0.2, 1.217186)] knots = [ 0, 0, 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, 26, 26 ] ctrl = pmc.curve(name=name, d=3, p=[(point[0] * radius, point[1] * radius, point[2] * radius) for point in points], k=knots) shape = coreUtils.getShape(ctrl) shape.rename(ctrl.name() + 'Shape') if '-' in axis: pmc.select('%s.cv[*]' % shape) pmc.rotate(180, rotateZ=True) if axis != 'z': orientCtrl(ctrl=ctrl, axis=axis) return ctrl
def creatSoftModCtrl(vtx): for i in vtx: a = str(type(i)) if a == "<class 'pymel.core.general.MeshVertex'>": name = (str(i)) ModifiedName = re.sub(r'[^\w]', '_', name) print (ModifiedName) else: print('Wrong Selection, Only select verticies') break pos = pm.pointPosition(i) name = (str(i)) ModifiedName = re.sub(r'[^\w]', '_', name) ctl = pm.curve(n = ModifiedName +'_SoftMod_Handle_Ctrl' ,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]) pm.addAttr(ctl , ln = 'fallOff', at = 'double', dv = 20) pm.setAttr(ctl.fallOff, k=1) pm.addAttr(ctl , ln = 'fallOffMode', at = 'enum', en = 'volume:surface') pm.setAttr(ctl.fallOffMode, k=1) pm.addAttr(ctl , ln = 'globalScale', at = 'double', dv = 1) pm.setAttr(ctl.globalScale, k=1) grp = pm.createNode('transform',n = ModifiedName + '_ctrl_grp' ) loc = pm.spaceLocator(n = ModifiedName+'_SoftMod_Ctrl') pm.select(cl=1) pm.parent(loc,grp) pm.parent(ctl,loc) grp.translate.set(pos) mesh = pm.listTransforms(i.split('.')[0])[0] pm.select(mesh) sfMod = cmds.softMod(wn = (str(mesh),str(mesh))) pm.select(cl=1) cmds.softMod(sfMod[0],e=1,wn = (str(ctl),str(ctl))) pm.setAttr(sfMod[0]+'.falloffAroundSelection',0) pm.connectAttr(loc.worldPosition[0],sfMod[0]+'.falloffCenter') mdl = pm.createNode('multDoubleLinear',n = ModifiedName+'_MDL') pm.connectAttr(ctl.fallOffMode,sfMod[0]+'.falloffMode') ctl.fallOff>>mdl.input1 ctl.globalScale>>mdl.input2 pm.connectAttr(mdl.output,sfMod[0]+'.falloffRadius') pm.connectAttr(loc.worldInverseMatrix[0],str(sfMod[0])+'.bindPreMatrix')
def bdImportCon(con): xmlPath = 'c:\\Users\\bogdan_d\\Documents\\bdPyScripts\\controllers\\' #xmlFile = 'facial_ctrl.xml' dom = parse(xmlPath + con) controllerNode = dom.getElementsByTagName('controller') for node in controllerNode: conName = node.getAttribute('name') shapeNodes = node.getElementsByTagName('shape') curvesToParent = [] for s in shapeNodes: shapeName = s.getAttribute('name') print shapeName shapeCvs = s.getAttribute('cvs') pos = [ float(pos.strip('[](),')) for pos in shapeCvs.split(" ") ] reconstructedPos = [(pos[i], pos[i + 1], pos[i + 2]) for i in range(0, len(pos), 3)] shapeKnots = s.getAttribute('knots') knots = [ float(k.strip('[](),')) for k in shapeKnots.split(" ") ] reconstructedKnots = [k for k in knots] shapeDegree = int(s.getAttribute('degree')) shapePeriodic = int(s.getAttribute('periodic')) curve = pm.curve(p=reconstructedPos, k=reconstructedKnots, d=shapeDegree, per=shapePeriodic) curve.rename(shapeName.replace('Shape', '')) curvesToParent.append(curve) parentCurve = curvesToParent[0] for curve in curvesToParent[1:]: pm.parent(curve.getShape(), parentCurve, r=1, shape=1) pm.delete(curve) pm.select(cl=1) parentCurve.centerPivots()
def __init__(self, name='control', shape='circle', size=1, line_width=user.prefs['default-line-width'], offsets=user.prefs['num-offset-ctrls'], colour='dark-blue'): """ Create controller and offset groups :param name: (string) Name of controller :param shape: (string) Controller shape :param size: (float, int) Scale factor of control :param line_width: (float, int) line width :param offsets: amount of offset locators to make """ self.name = utils.makeNameUnique(name, '_%s' % user.prefs['ctrl-suffix']) self.ctrl = \ pm.curve( d=1, p=data.controllerShapes[shape], n=(self.name + '_' + user.prefs['ctrl-suffix'])) utils.setOverrideColour(self.ctrl, c=colour) utils.scaleCtrlShapes(self.ctrl, scale_mult=size, line_width=line_width) self.null = pm.group(n=self.ctrl + '_null', em=True) self.offsets = [] for i in range(offsets): num = '{:02d}'.format(i + 1) if offsets > 1 else '' self.offsets.append( pm.spaceLocator(n=self.ctrl + '_offset%s_loc' % num)) utils.setOverrideColour(self.offsets, 'purple') utils.parentByList([self.ctrl, self.offsets, self.null])
def buildPath(self): # After the user is done adding positions, they wil call the buildPath() method # it creates a curve with the list of positions as points. myPath = pm.curve(d=1, p=self.Points) # Now we'll constrain the car's root to the path and create a motion path animation motionPath = pm.pathAnimation(self.root, fractionMode=False, c=myPath, followAxis='z', upAxis='y', startTimeU=self.Times[0], endTimeU=self.Times[-1]) # go through all the positions and set keys in the motion path for k in self.Times: # reminder to self: k is the value, and not the index of the list # I will ask Python what is the index of that value and store it in a variable... n = self.Times.index(k) pm.setKeyframe( motionPath + '.uValue', v=n, t=k ) # 'n' is the Uvalue position that the motionPath should be keyed at
def squareChamferCtrl(size=20.0, name='', axis='y'): ''' creates a square nurbs curve ''' points = [(-1, 0, -3), (-1, 0, -4), (1, 0, -4), (1, 0, -3), (3, 0, -1), (4, 0, -1), (4, 0, 1), (3, 0, 1), (1, 0, 3), (1, 0, 4), (-1, 0, 4), (-1, 0, 3), (-3, 0, 1), (-4, 0, 1), (-4, 0, -1), (-3, 0, -1), (-1, 0, -3)] knots = [i for i in range(len(points))] ctrl = pmc.curve(degree=1, p=points, k=knots, name=name) shape = coreUtils.getShape(ctrl) pmc.select('%s.cv[ * ]' % shape) pmc.rotate(45, rotateY=True) pmc.scale(size * .25, size * .25, size * .25) if axis != 'z': orientCtrl(ctrl=ctrl, axis=axis) return ctrl
def bdBuildSquareController(target, ctrlName, scale, pivotOfset=0.5): defaultPointsList = [(-1, 1, 0), (1, 1, 0), (1, -1, 0), (-1, -1, 0)] pointsList = [] targetPos = pm.xform(target, q=True, ws=True, t=True) for p in defaultPointsList: pointsList.append((p[0] * scale, p[1] * scale, p[2] * scale)) curvePoints = [ pointsList[0], pointsList[1], pointsList[2], pointsList[3], pointsList[0] ] ctrl = pm.curve(d=1, p=curvePoints) ctrl.rename(ctrlName) ctrlGrp = pm.group(ctrl, n=ctrlName.replace("anim", "anim_CON")) pm.move(targetPos[0], targetPos[1], targetPos[2], ctrlGrp, ws=True) ctrl.translateZ.set(pivotOfset) pm.makeIdentity(ctrl, apply=True, translate=True, rotate=True, scale=True) ctrl.setPivots([0, 0, 0]) return [ctrl, ctrlGrp]
def makeVector( vecs, # 先の絶対位置ではなく、始点に対する相対位置。 sources = [0.0, 0.0, 0.0], name = "tempvec") : #print test vec = pm.dt.Vector([vecs[0], vecs[1], vecs[2]]) source = pm.dt.Point([sources[0], sources[1], sources[2]]) target = source + vec atom = vec / 6 opt = pm.dt.Vector([0.0, 0.0, 1.0]) unit = vec.cross(opt) unit = unit * atom.length() / unit.length() p1 = target - atom + unit p2 = target - atom - unit cvList = [source, target, p1, target, p2] cv = [ [i[0],i[1],i[2]] for i in cvList] #print test cur = pm.curve( p = cv, n=name, d = 1 ) return cur
def square_ctrl(self): points = [(-1, 1, 0), (1, 1, 0), (1, -1, 0), (-1, -1, 0)] for i in range(len(points)): scaled_pos = (points[i][0] * self.scale, points[i][1] * self.scale, points[i][2] * self.scale) points[i] = scaled_pos crv_points = [points[0], points[1], points[2], points[3], points[0]] ctrl = pm.curve(d=1, p=crv_points) ctrl.rename(self.name) ctrl_grp = pm.group(ctrl, n=self.name + '_grp') pm.addAttr(ctrl, ln='parent', at='message') pm.connectAttr(ctrl_grp.name() + '.message', ctrl.name() + '.parent') self.ctrl = ctrl self.ctrl_grp = ctrl_grp
def create_square(size=1.0, width=None, height=None, **kwargs): if width is None: width = 1.0 if height is None: height = 1.0 width *= size height *= size pos1 = pymel.datatypes.Point(-height, -width, 0) pos2 = pymel.datatypes.Point(-height, width, 0) pos3 = pymel.datatypes.Point(height, width, 0) pos4 = pymel.datatypes.Point(height, -width, 0) pos5 = pymel.datatypes.Point(-height, -width, 0) node = pymel.curve(d=1, p=[pos1, pos2, pos3, pos4, pos5]) # Expose the rotateOrder node.rotateOrder.setKeyable(True) return node