def maya_move(angular_velocity, time_step):
            
    objects = cmds.ls(sl=True)
    if objects == []:
        print('* Please select at least an object.')
        return
        
    trajectory = cmds.ls('trajectory')
    
    for i, o in enumerate(objects):
        x = cmds.getAttr(o + '.translateX')
        y = cmds.getAttr(o + '.translateY')
        z = cmds.getAttr(o + '.translateZ')
    
        loc = [x, y, z]
        state = make_state(loc)
                
        state = simulate_circle(state, angular_velocity, time_step)
        
        old_loc = loc
        loc = get_location(state)
        
        cmds.select(o)
        cmds.move(loc[0], loc[1], loc[2])
        
        # draw trajectory for the first object
        if i == 0:
            if trajectory == []:
                cv = cmds.curve(point=[old_loc, loc], degree=1)                
                cmds.rename(cv, 'trajectory')
            else:
                cmds.curve('trajectory', point=[loc], degree=1, append=True)
        
    # keep all objects selected
    cmds.select(objects)
Ejemplo n.º 2
0
def createCurveaBasedOnLocator( prevLoc, loc, baseName, hrsSys ):
	leastSquaresMod = mn.createNode( 'leastSquaresModifier' )
	origCurv = crv.Curve( mc.curve( d = 1, ep = [prevLoc.worldPosition, loc.worldPosition] ) )
	index = mm.eval( 'getNextFreeMultiIndex( "'+ hrsSys.name +'.inputHair", 0 )' )
	origCurv.name = 'spiderWeb_base_'+ baseName + '_' + str( index ) + '_CRV'
	mc.rebuildCurve( origCurv.name, rpo = 1, rt = 0, end = 1, kr = 0, kcp = 1, kep = 1, kt =0, s= 4, d = 1, tol = 0.01  )
	origCurv.a.intermediateObject.v = 1
	controledCurv = origCurv.duplicate()
	origCurv.shape.attr( 'worldSpace[0]' ) >> leastSquaresMod.a.inputNurbsObject
	prevLoc.attr( 'worldPosition[0]')      >> leastSquaresMod.attr( 'pointConstraint[0].pointPositionXYZ' )
	leastSquaresMod.attr( 'pointConstraint[0].pointConstraintU' ).v = 0
	loc.attr( 'worldPosition[0]')          >> leastSquaresMod.attr( 'pointConstraint[1].pointPositionXYZ' )
	leastSquaresMod.attr( 'pointConstraint[1].pointConstraintU' ).v = 1
	leastSquaresMod.a.outputNurbsObject    >> controledCurv.shape.a.create
	controledCurv.shape.attr( 'worldMatrix[0]' ) >> leastSquaresMod.a.worldSpaceToObjectSpace
	fol = mn.createNode( 'follicle' )
	fol.a.restPose.v = 1
	fol.a.startDirection.v = 1
	fol.a.pointLock.v = 3
	fol.a.degree.v = 3
	fol.a.sampleDensity.v = 3
	fol.a.outHair >> hrsSys.attr( 'inputHair[' + str( index ) + ']' )
	hrsSys.attr( 'outputHair[' + str( index ) + ']' ) >> fol.a.currentPosition
	controledCurv.shape.attr( 'worldSpace[0]' ) >> fol.a.startPosition
	curv = crv.Curve( mc.curve( d = 3, ep = [prevLoc.worldPosition, loc.worldPosition] ) )
	curv.name = 'spiderWeb_' + baseName + '_' + str( index ) + '_CRV'
	fol.a.outCurve >> curv.a.create
	folPar = fol.parent
	folPar.name = 'spiderWeb_' + baseName + '_' + str( index ) + '_FOL'
	return curv, folPar
Ejemplo n.º 3
0
def createCurve(ptList,start,end,group=''):
	'''
	'''
	# Initialize Curves
	crvList = []
	for pt in ptList:
		pos = mc.pointPosition(pt)
		curve = mc.curve(p=[pos,pos],d=1)
		curve = mc.rename(curve,pt+'_curve')
		crvList.append(curve)
	
	# Track Curves
	for i in range(start,end+1):
		mc.currentTime(i)
		for n in range(len(ptList)):
			pos = mc.pointPosition(ptList[n])
			mc.curve(crvList[n],a=True,p=pos)
	
	# Remove Initial CV and Rebuild
	for crv in crvList:
		mc.delete(crv+'.cv[0]')
		mc.rebuildCurve(crv,ch=False,rpo=True,rt=0,end=1,kr=2,kcp=True,kep=True)
	
	# Group Curves
	if group:
		# Check Group
		if not mc.objExists(group): group = mc.group(em=True,n=group)
		# Parent Curves to Group
		mc.parent(crvList,group)
	
	# Return Result
	if group: return [group]
	else: return crvList
Ejemplo n.º 4
0
def createCurveOnTargetPoints( targets, degrees=3 ):
    
    trObjs = []
    curvePoints = []
    for taregt in targets:
        if cmds.nodeType( taregt ) in ['joint', 'transform']:
            trObjs.append( taregt )
            curvePoints.append( [0,0,0] )

    if len( targets ) == 2:
        crv = cmds.curve( p=curvePoints, d=1 )
    elif len( targets ) ==3:
        crv = cmds.curve( p=curvePoints, d=2 )
    else:
        crv = cmds.curve( p=curvePoints, d=degrees )
    crvShape= cmds.listRelatives( crv, s=1 )[0]
    
    for trObj in trObjs:
        i = trObjs.index( trObj )
        mmdc = cmds.createNode( 'multMatrixDecompose' )
        cmds.connectAttr( trObj+'.wm', mmdc+'.i[0]' )
        cmds.connectAttr( crvShape+'.pim', mmdc+'.i[1]' )
        cmds.connectAttr( mmdc+'.ot', crvShape+'.controlPoints[%d]' % i )
    
    return crv
Ejemplo n.º 5
0
    def corners(self):
        """
        Create corners control
        """
        ctrl = cmds.createNode('transform')

        pts = [(0.9, 0.0, 1.0), (1.0, 0.0, 1.0), (1.0, 0.0, 0.9)]
        cnr = cmds.curve(d=1, p=pts, k=range(3))
        cnrShape = cmds.listRelatives(cnr, s=True, ni=True)[0]
        cmds.parent(cnrShape, ctrl, s=True, r=True)

        pts = [(-0.9, 0.0, 1.0), (-1.0, 0.0, 1.0), (-1.0, 0.0, 0.9)]
        cnr = cmds.curve(d=1, p=pts, k=range(3))
        cnrShape = cmds.listRelatives(cnr, s=True, ni=True)[0]
        cmds.parent(cnrShape, ctrl, s=True, r=True)

        pts = [(0.9, 0.0, -1.0), (1.0, 0.0, -1.0), (1.0, 0.0, -0.9)]
        cnr = cmds.curve(d=1, p=pts, k=range(3))
        cnrShape = cmds.listRelatives(cnr, s=True, ni=True)[0]
        cmds.parent(cnrShape, ctrl, s=True, r=True)

        pts = [(-0.9, 0.0, -1.0), (-1.0, 0.0, -1.0), (-1.0, 0.0, -0.9)]
        cnr = cmds.curve(d=1, p=pts, k=range(3))
        cnrShape = cmds.listRelatives(cnr, s=True, ni=True)[0]
        cmds.parent(cnrShape, ctrl, s=True, r=True)

        return ctrl
Ejemplo n.º 6
0
def lollipopController(name, color = 0, size = [1, 1, 1], lockAttr = ['tr', 'ro', 'sc', 'vi'], lock = True):

        #cmds.createNode('transform', n =  '%s_grp' %name)
        cmds.curve(n = name, d = 1, p = [ (0, 0, 0), (0, 3, 0),(0, 4, 1),(0, 5, 0), (0, 4, -1),(0, 3, 0),(0, 4, 1),(0, 4, -1)], k = [1,2,3,4,5,6,7,8])
        cmds.scale(size[0],size[1],size[2]) 
        for attr in lockAttr:
                if attr == 'tr':
                        cmds.setAttr('%s.translateX' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.translateY' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.translateZ' %name, lock = lock, keyable = False, channelBox = False)
                elif attr == 'ro':
                        cmds.setAttr('%s.rotateX' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.rotateY' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.rotateZ' %name, lock = lock, keyable = False, channelBox = False)
                elif attr == 'sc':
                        cmds.setAttr('%s.scaleX' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.scaleY' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.scaleZ' %name, lock = lock, keyable = False, channelBox = False)
                elif attr == 'vi':
                        cmds.setAttr('%s.visibility' %name, lock = True, keyable = False, channelBox = False)
                
        shapeNode = cmds.listRelatives(name)
                
        cmds.setAttr('%s.overrideEnabled' %shapeNode[0], 1)
        cmds.setAttr('%s.overrideColor' %shapeNode[0], color)

        util.group(name, '%s_grp' %name)
        
        return name
Ejemplo n.º 7
0
 def obj_single_rotate ():
     ctrl_shapes = []
     ctrl_shapes.append( mc.curve( p = [( -7.105427357601002e-15, -0.3358735290035888, 0.7361468691490706 ), ( -0.030221345939771993, -0.43042515285533867, 0.6908148502394227 ), ( -0.072472769789524, -0.5107046042608161, 0.6274377144647979 ), ( -0.12400997464880703, -0.5684975545498503, 0.5501319071758723 ), ( -0.12400997464880703, -0.5684975545498503, 0.5501319071758723 ), ( -0.12400997464880703, -0.5684975545498503, 0.5501319071758723 ), ( -0.12400997464880703, -0.5819931861859402, 0.5346306603447717 ), ( -0.12400997464880703, -0.5819931861859402, 0.5346306603447717 ), ( -0.12400997464880703, -0.5819931861859402, 0.5346306603447717 ), ( -0.12400997464880703, -0.5819931861859402, 0.5346306603447717 ), ( -0.08197748359885537, -0.540253001036092, 0.5946770761304137 ), ( -0.04551343522386375, -0.48527382262420815, 0.6467685738089758 ), ( -0.015501246831107096, -0.4192182992656619, 0.6896431286557706 ), ( -0.015501246831107096, -0.4192182992656619, 0.6896431286557706 ), ( -0.015501246831107096, -0.4192182992656619, 0.6896431286557706 ), ( -0.015501246831107096, -0.7077292503941806, 0.43808875481816606 ), ( -0.015501246831107096, -0.80800092168273, -0.016811817720621902 ), ( -0.015501246831107096, -0.6943482219457593, -0.34108941639861884 ), ( -0.015501246831107096, -0.5527220271320061, -0.5148315398676033 ), ( -0.015501246831107096, -0.3348935247151239, -0.6771644412642893 ), ( -0.015501246831107096, -0.1758560186022855, -0.7361468691392242 ), ( -0.015501246831107096, -7.844604263429887e-05, -0.7361468691392242 )], per = False, d = 3, k = [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 19] ) )
     ctrl_shapes.append( mc.curve( p = [( 3.552713678800501e-15, -0.3358735290035959, 0.7361468691490706 ), ( 0.03022134593976844, -0.43042515285534577, 0.6908148502394227 ), ( 0.07247276978952044, -0.5107046042608232, 0.6274377144647979 ), ( 0.12400997464880348, -0.5684975545498574, 0.5501319071758723 ), ( 0.12400997464880348, -0.5684975545498574, 0.5501319071758723 ), ( 0.12400997464880348, -0.5684975545498574, 0.5501319071758723 ), ( 0.12400997464880348, -0.5819931861859473, 0.5346306603447717 ), ( 0.12400997464880348, -0.5819931861859473, 0.5346306603447717 ), ( 0.12400997464880348, -0.5819931861859473, 0.5346306603447717 ), ( 0.12400997464880348, -0.5819931861859473, 0.5346306603447717 ), ( 0.08197748359885182, -0.5402530010360991, 0.5946770761304137 ), ( 0.0455134352238602, -0.48527382262421526, 0.6467685738089758 ), ( 0.015501246831103543, -0.419218299265669, 0.6896431286557706 ), ( 0.015501246831103543, -0.419218299265669, 0.6896431286557706 ), ( 0.015501246831103543, -0.419218299265669, 0.6896431286557706 ), ( 0.015501246831103543, -0.7077292503941877, 0.43808875481816606 ), ( 0.015501246831103543, -0.8080009216827371, -0.016811817720621902 ), ( 0.015501246831103543, -0.6943482219457664, -0.34108941639861884 ), ( 0.015501246831103543, -0.5527220271320132, -0.5148315398676033 ), ( 0.015501246831103543, -0.334893524715131, -0.6771644412642893 ), ( 0.015501246831103543, -0.1758560186022926, -0.7361468691392242 ), ( 0.015501246831103543, -7.844604263433487e-05, -0.7361468691392242 )], per = False, d = 3, k = [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 19] ) )
     ctrl_shapes.append( mc.curve( p = [( 0.0, 0.33587352900359235, 0.7361468691490706 ), ( -0.030221345939764888, 0.4304251528553422, 0.6908148502394227 ), ( -0.07247276978951689, 0.5107046042608197, 0.6274377144647979 ), ( -0.12400997464879993, 0.5684975545498538, 0.5501319071758723 ), ( -0.12400997464879993, 0.5684975545498538, 0.5501319071758723 ), ( -0.12400997464879993, 0.5684975545498538, 0.5501319071758723 ), ( -0.12400997464879993, 0.5819931861859438, 0.5346306603447717 ), ( -0.12400997464879993, 0.5819931861859438, 0.5346306603447717 ), ( -0.12400997464879993, 0.5819931861859438, 0.5346306603447717 ), ( -0.12400997464879993, 0.5819931861859438, 0.5346306603447717 ), ( -0.08197748359884827, 0.5402530010360955, 0.5946770761304137 ), ( -0.045513435223856646, 0.4852738226242117, 0.6467685738089758 ), ( -0.01550124683109999, 0.41921829926566545, 0.6896431286557706 ), ( -0.01550124683109999, 0.41921829926566545, 0.6896431286557706 ), ( -0.01550124683109999, 0.41921829926566545, 0.6896431286557706 ), ( -0.01550124683109999, 0.7077292503941841, 0.43808875481816606 ), ( -0.01550124683109999, 0.8080009216827335, -0.016811817720621902 ), ( -0.01550124683109999, 0.6943482219457628, -0.34108941639861884 ), ( -0.01550124683109999, 0.5527220271320097, -0.5148315398676033 ), ( -0.01550124683109999, 0.33489352471512746, -0.6771644412642893 ), ( -0.01550124683109999, 0.17585601860228905, -0.7361468691392242 ), ( -0.01550124683109999, 7.844604263078215e-05, -0.7361468691392242 )], per = False, d = 3, k = [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 19] ) )
     ctrl_shapes.append( mc.curve( p = [( 3.552713678800501e-15, 0.33587352900359235, 0.7361468691490706 ), ( 0.03022134593976844, 0.4304251528553422, 0.6908148502394227 ), ( 0.07247276978952044, 0.5107046042608197, 0.6274377144647979 ), ( 0.12400997464880348, 0.5684975545498538, 0.5501319071758723 ), ( 0.12400997464880348, 0.5684975545498538, 0.5501319071758723 ), ( 0.12400997464880348, 0.5684975545498538, 0.5501319071758723 ), ( 0.12400997464880348, 0.5819931861859438, 0.5346306603447717 ), ( 0.12400997464880348, 0.5819931861859438, 0.5346306603447717 ), ( 0.12400997464880348, 0.5819931861859438, 0.5346306603447717 ), ( 0.12400997464880348, 0.5819931861859438, 0.5346306603447717 ), ( 0.08197748359885182, 0.5402530010360955, 0.5946770761304137 ), ( 0.0455134352238602, 0.4852738226242117, 0.6467685738089758 ), ( 0.015501246831103543, 0.41921829926566545, 0.6896431286557706 ), ( 0.015501246831103543, 0.41921829926566545, 0.6896431286557706 ), ( 0.015501246831103543, 0.41921829926566545, 0.6896431286557706 ), ( 0.015501246831103543, 0.7077292503941841, 0.43808875481816606 ), ( 0.015501246831103543, 0.8080009216827335, -0.016811817720621902 ), ( 0.015501246831103543, 0.6943482219457628, -0.34108941639861884 ), ( 0.015501246831103543, 0.5527220271320097, -0.5148315398676033 ), ( 0.015501246831103543, 0.33489352471512746, -0.6771644412642893 ), ( 0.015501246831103543, 0.17585601860228905, -0.7361468691392242 ), ( 0.015501246831103543, 7.844604263078215e-05, -0.7361468691392242 )], per = False, d = 3, k = [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 19] ) )
     return ctrl_shapes
Ejemplo n.º 8
0
def arrowController(name, color = 0, lockAttr = ['sc', 'vi'], lock = True):
        cmds.curve(n = name , d =  1, p = [(0, 2, 1),(0, 3, 1),(0, 0, 3), (0, -3, 1), (0, -2, 1), (0, -2, -2), (0, 2, -2), (0, 2, 1), (0, -2, -2), (0, 2, -2), (0, -2, 1)], k = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
        cmds.createNode('transform', n = '%s_grp' %name)

        #lock Attribute
        for attr in lockAttr:
                if attr == 'tr':
                        cmds.setAttr('%s.translateX' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.translateY' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.translateZ' %name, lock = lock, keyable = False, channelBox = False)
                elif attr == 'ro':
                        cmds.setAttr('%s.rotateX' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.rotateY' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.rotateZ' %name, lock = lock, keyable = False, channelBox = False)
                elif attr == 'sc':
                        cmds.setAttr('%s.scaleX' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.scaleY' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.scaleZ' %name, lock = lock, keyable = False, channelBox = False)
                elif attr == 'vi':
                        cmds.setAttr('%s.visibility' %name, lock = lock, keyable = False, channelBox = False)
        
        #color change
        shapeNode = cmds.listRelatives(name)
        cmds.rename(shapeNode, name + 'Shape')
        
        cmds.setAttr(name + 'Shape.overrideEnabled', 1)
        cmds.setAttr(name + 'Shape.overrideColor', color)       
        cmds.select(name, r = True)
        cmds.select('%s_grp' %name, tgl = True)
        cmds.parent()
        
        return name
	def buildNurbsRibbon(self):
		if self.guideSpline:
			guideDeg = cmds.getAttr(self.guideSpline + '.degree' )
			guideSpan = cmds.getAttr(self.guideSpline + '.spans' )
			oneCurvePoints = []
			otherCurvePoints = []
			for i in xrange(guideDeg + guideSpan):
				cvPos = cmds.pointPosition(self.guideSpline + '.cv[' + str(i) + "]", w=True )
				newPara = cmds.closestPointOnCurve(self.guideSpline, ip=cvPos, paramU=True)  #Find the parameter Value
				newParaVal = cmds.getAttr(newPara + ".paramU")
				cmds.delete(newPara)
				infoNode = cmds.pointOnCurve(self.guideSpline, ch=True, pr=newParaVal)  #Now find the Position and tangent!
				posy = (cmds.getAttr(infoNode + ".position"))[0]  # returns the position
				posy = MVector(posy[0],posy[1],posy[2])
				normy = (cmds.getAttr(infoNode + ".tangent"))[0]
				normy = MVector(normy[0],normy[1],normy[2]) #Use MVector from maya.openMaya
				normy = normy.normal()
				vertVect = MVector(0,1,0)
				sideMove = normy^vertVect #This is the notation for a cross product. Pretty cool. Should be a normal movement
				sideMove = sideMove.normal() * 0.5
				sideMovePos = posy + sideMove 
				otherSideMovePos = posy - sideMove
				oneCurvePoints.append([sideMovePos[0],sideMovePos[1],sideMovePos[2]])
				otherCurvePoints.append([otherSideMovePos[0],otherSideMovePos[1],otherSideMovePos[2]])

			oneSideCurve = cmds.curve(editPoint = oneCurvePoints, degree=3)
			OtherSideCurve = cmds.curve(editPoint = otherCurvePoints, degree=3)
			self.tempConstructionParts.append(oneSideCurve)
			self.tempConstructionParts.append(OtherSideCurve)
			#Now we loft the surface between the two Curves!
			nameStart = nameBase(self.totalMarkerList[0].getName(), self.searchString, "loc", "nbs")
			nameStart += "ribbonSurface"
			self.guideNurbsRibbon = cmds.loft(oneSideCurve, OtherSideCurve, name = nameStart, constructionHistory = True, uniform = True, close = False, autoReverse = True, degree = 3, sectionSpans = 1, range = False, polygon = 0, reverseSurfaceNormals = True)
			self.guideNurbsRibbon = self.guideNurbsRibbon[0]
			self.ribbonParts.append(self.guideNurbsRibbon)
Ejemplo n.º 10
0
	def createCurve(self,*args):
		"""
		  Create curve on locators
		"""
		prefix = mc.textFieldGrp(self.prefixFld,query=True,text=True)
		locators = mc.ls(sl=True,fl=True)
		rotations = mc.intFieldGrp(self.rotFld,query=True,v1=True)
		
		#Error checking here: Are locators selected?
		if len(locators) == 0:
			print '\nSelection is empty. Please select locators.\n'
			
		#create splineIK curve
		curve = " "
		x = 0
		while x < rotations:
			for each in locators:
				try:        #Try to append to existing curve
					x_loc = mc.getAttr('%s.localPositionX'%each)
					y_loc = mc.getAttr('%s.localPositionY'%each)
					z_loc = mc.getAttr('%s.localPositionZ'%each)
					mc.curve(curve,a=True,p=(x_loc,y_loc,z_loc) )
					
				except:     #If appending fails, means a new curve needs to be created
					x_loc = mc.getAttr('%s.localPositionX'%each)
					y_loc = mc.getAttr('%s.localPositionY'%each)
					z_loc = mc.getAttr('%s.localPositionZ'%each)
					curve = mc.curve( p=(x_loc,y_loc,z_loc), n='%s_ikCurve'%prefix ) 
			x = x + 1
Ejemplo n.º 11
0
def createLine(_parents, _sceneData = False, _layer = False):
    nodes = []
    lineCurve = ""
    firstTime = True
    for obj in _parents:
        pos = cmds.xform(obj, q=1, t=1, ws=1)
        if firstTime:
            lineCurve = cmds.curve(d=1, p=[pos])
            nodes.append(lineCurve)
            cmds.setAttr(lineCurve+".overrideEnabled", 1)
            cmds.setAttr(lineCurve+".overrideDisplayType", 2)
            cmds.setAttr(lineCurve+".inheritsTransform", 0)
            firstTime = False
        else:
            cmds.curve(lineCurve, a=True, p=pos)
    #Clusters must be added after all the cvs are created.
    #Don't ask me why!
    for j in range(len(_parents)):
        clusterName = _parents[j]+"_CLUSTER"
        clusterPoint = cmds.cluster(lineCurve+".cv["+str(j)+"]", n=clusterName)
        nodes.append(clusterPoint[1])
        #cmds.setAttr(clusterPoint[1]+".visibility", 0)
        cmds.parent(clusterPoint[1], _parents[j], a=1)
    if(_sceneData):
        addToLayer(_sceneData, "hidden", nodes)
        if _layer:
            addToLayer(_sceneData, _layer, lineCurve)
    return nodes
Ejemplo n.º 12
0
    def createPoleVector(self, prefix=None, distanceScale=2, verbose=False):
        print 'Building pole vector...'

        if prefix is None:
            prefix = self.prefix

        # Create Joint Vectors
        shoulderIkPos = cmds.xform(self.shoulder, q=True, ws=True, t=True)
        shoulderIkVec = OpenMaya.MVector(shoulderIkPos[0], shoulderIkPos[1], shoulderIkPos[2])
        elbowIkPos = cmds.xform(self.elbow, q=True, ws=True, t=True)
        elbowIkVec = OpenMaya.MVector(elbowIkPos[0], elbowIkPos[1], elbowIkPos[2])
        wristIkPos = cmds.xform(self.wrist, q=True, ws=True, t=True)
        wristIkVec = OpenMaya.MVector(wristIkPos[0], wristIkPos[1], wristIkPos[2])

        # Transpose vectors to correct pole vector translation point
        bisectorVec = (shoulderIkVec * 0.5) + (wristIkVec * 0.5)
        transposedVec = (elbowIkVec * distanceScale) - (bisectorVec * distanceScale)
        ikChainPoleVec = bisectorVec + transposedVec

        # Create a pole vector
        poleVecCon = self.utils.createBoxControl('%selbowPV' % self.prefix, 0.125)
        poleVecPos = [ikChainPoleVec.x, ikChainPoleVec.y, ikChainPoleVec.z]
        cmds.xform(poleVecCon, t=poleVecPos)
        self.utils.orientSnap(self.elbow, poleVecCon)

        # Visualize Vectors and End Points
        if verbose:
            for vector, letter in zip([bisectorVec, transposedVec, ikChainPoleVec,
                                       shoulderIkVec, elbowIkVec, wristIkVec],
                                      ['bisectorVec', 'transposedVec', 'ikChainPoleVec',
                                      'shoulderIk', 'elbowIk', 'wristIk']):
                cmds.spaceLocator(n='%sVecLoc' % letter, p=[vector.x, vector.y, vector.z])
                cmds.curve(n='%sVecCurve' % letter, degree=1, p=[(0, 0, 0), (vector.x, vector.y, vector.z)])

        return poleVecCon
def createSquare(*args):
    cmds.curve(d=1,p=[(0.5,0,0.5), (-0.5,0,0.5), 
    (-0.5,0,-0.5),(0.5,0,-0.5),(0.5,0,0.5)],
    k=[0,1,2,3,4],per=True)
    cmds.scale(2.458224,2.459224,2.459224,r=True)
    cmds.select(cl=True)
    print 'Created a Nurbs Square'
Ejemplo n.º 14
0
        def createTemplate(self , eyeMesh):
                # create eye jnt
                eyeJnt=[]
                if 'L_' in str(eyeMesh):
                        helpClu = mc.cluster(eyeMesh)[0]
                        LeyeJnt = mc.joint(p=(0,0,0),name=eyeMesh+'_skin_jnt')
                        self.fromAtoB(eyeJnt,helpClu,1)
                        ReyeJnt = mc.mirrorJoint(mirrorYZ=True,mirrorBehavior=False,searchReplace=('L_', 'R_')
                        eyeJnt.append(LeyeJnt)
                        eyeJnt.append(ReyeJnt)
                else:
                        self.mayaError('Please select the left eye.')

                return eyeJnt

        def createEyeRig(self):
                if mc.objExists(self.eyeGlobalCtrl) == False:
                        EyesGlobalCtrl = mc.curve(d=1,p=[(-1.069806, 1.027703, 0),(-1.651954,1.89895,0),(-2.523201,2.481098,0),(-3.550904,2.68552,0),(-4.578607,2.481098,0),(-5.449854,1.89895,0),(-6.032002,1.027703,0),(-6.236424,0,0),(-6.032002,-1.027703,0),(-5.449854 ,-1.89895, 0),(-4.578607,-2.481098,0), (-3.550904,-2.68552,0),(-2.523201, -2.481098, 0),(-1.651954,-1.89895,0),(-1.069806,-1.027703,0),(1.058138,-1.032345,0),(1.642915, -1.907527,0),(2.518098,-2.492305,0),( 3.550443,-2.69765,0),(4.582788,-2.492305,0),(5.45797,-1.907527,0),( 6.042748,-1.032345,0),(6.248093,0,0),(6.042748,1.032345,0),( 5.45797,1.907527,0 ),(4.582788,2.492305,0),( 3.550443,2.69765,0),(2.518098,2.492305,0 ),(1.642915,1.907527,0),(1.058138,1.032345,0),( -1.069806,1.027703,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],n=self.eyeGlobalCtrl)
                        L_EyeAimCtrl = mc.curve(d=1,p=[(3.653116 ,0.946994,0), (3.653116 ,0 ,0),( 2.706122, 0, 0) , (3.653116 ,0, 0),(4.600109, 0 ,0) , (3.653116 ,0, 0) , (3.653116 ,-0.946994, 0) ],k=[0, 1, 2 ,3 ,4 ,5 , 6 ],n='L_'+self.eyeAimCtrl)
                        R_EyeAimCtrl = mc.curve(d=1,p=[(3.653116 ,0.946994,0), (3.653116 ,0 ,0),( 2.706122, 0, 0) , (3.653116 ,0, 0),(4.600109, 0 ,0) , (3.653116 ,0, 0) , (3.653116 ,-0.946994, 0) ],k=[0, 1, 2 ,3 ,4 ,5 , 6 ],n='R_'+self.eyeAimCtrl)

                        mc.parent(L_EyeAimCtrl , EyesGlobalCtrl)
                        mc.parent(R_EyeAimCtrl , EyesGlobalCtrl)

                        self.fastGrp('On' , ['zero','con','sdk'],L_EyeAimCtrl)
                        self.fastGrp'On' , ['zero','con','sdk'],R_EyeAimCtrl)
                        zeroGrp = self.fastGrp('On' , ['zero','con','sdk'],EyesGlobalCtrl)[2]
Ejemplo n.º 15
0
def extraController(name, color = 0, lockAttr = ['sc', 'vi'], lock = True):

        cmds.createNode('transform', n =  '%s_grp' %name)
        cmds.curve(n = name, d = 1, p =[(-4, 0, -3),(-1, 0, -3),(-1, 0, -2),(-3, 0, -2),(-3, 0, -1), (-1, 0, -1),(-1, 0, 0),(-3, 0, 0),(-3, 0, 1),(-1, 0, 1),(-1, 0, 2),(-4, 0, 2),(-4, 0, -3),(3, 0, -3),(2, 0, -1),(2, 0, 0),(3, 0, 2),(2, 0, 2),(1, 0, 0),(0, 0, 2),(-1, 0, 2),(0, 0, 0),(0, 0, -1),(-1, 0, -3),(0, 0, -3),(1, 0, -1),(2, 0, -3),(3, 0, -3),(3, 0, 2),(-4, 0, 2)], 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])
        cmds.scale(0.2,0.2,0.2) 
        for attr in lockAttr:
                if attr == 'tr':
                        cmds.setAttr('%s.translateX' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.translateY' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.translateZ' %name, lock = lock, keyable = False, channelBox = False)
                elif attr == 'ro':
                        cmds.setAttr('%s.rotateX' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.rotateY' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.rotateZ' %name, lock = lock, keyable = False, channelBox = False)
                elif attr == 'sc':
                        cmds.setAttr('%s.scaleX' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.scaleY' %name, lock = lock, keyable = False, channelBox = False)
                        cmds.setAttr('%s.scaleZ' %name, lock = lock, keyable = False, channelBox = False)
                elif attr == 'vi':
                        cmds.setAttr('%s.visibility' %name, lock = lock, keyable = False, channelBox = False)
                
        shapeNode = cmds.listRelatives(name)
                
        cmds.setAttr('%s.overrideEnabled' %shapeNode[0], 1)
        cmds.setAttr('%s.overrideColor' %shapeNode[0], color)
        
        return name
Ejemplo n.º 16
0
def archimedes(loops,spiralIn,gaps,height):
    '''
    Creates a Archimedes spiral
    
    loops    : Number of complete turns the spiral should have
    spiralIn : Direction of the generated curve
    gaps     : Distance between successive turnings
    height   : Vertical height of the spiral
    
    The curve is created and the required number of control vertices is calculated 
    along with the fraction of the height each CV needs to be placed. The polar 
    equation of a Archimedes spiral is r=a+b*theta where a rotates the spiral 
    and b controls distance between successive turnings. The polar coordinates 
    are converted to Cartesian form by x=r*math.cos(theta) and y=r*math.sin(theta).
    The direction of the curve can be reversed based on the spiralInwards flag.
    '''
    curve=cmds.curve(p=[(0,0,0)],n='curve_01')
    cvNo=loops*8
    heightFrac = float(height)/cvNo
    for i in range(1,cvNo+1):
        theta=i*(0.25*math.pi)
        r=(gaps/(1.8*math.pi))*theta
        x=r*math.cos(theta)
        y=r*math.sin(theta)
        cmds.curve(curve,a=True,p=[(x,i*heightFrac,y)])
    if spiralIn==True:
        cmds.reverseCurve(curve,ch=0,rpo=1)
Ejemplo n.º 17
0
def logarithmic(loops,spiralIn,growth,height):
    '''
    Creates a logarithmic spiral
    
    loops    : Number of complete turns the spiral should have
    spiralIn : Direction of the generated curve
    growth   : Growth factor
    height   : Vertical height of the spiral
    
    The curve is created and the required number of control vertices is calculated 
    along with the fraction of the height each CV needs to be placed. The polar 
    equation of a logarithmic spiral is r=a*e^(b*theta) where a scales the spiral 
    and b controls how tightly it winds. The polar coordinates are converted to 
    Cartesian form by x=r*math.cos(theta) and y=r*math.sin(theta). The direction 
    of the curve can be reversed based on the spiralInwards flag.
    '''
    curve=cmds.curve(p=[(0,0,0)],n='curve_01')
    cvNo=loops*8
    heightFrac = float(height)/cvNo
    for i in range(1,cvNo+1):
        theta=i*(0.25*math.pi)
        r=0.1*(1/(1.8*math.pi))*math.e**(growth*theta)
        x=r*math.cos(theta)
        y=r*math.sin(theta)
        cmds.curve(curve,a=True,p=[(x,i*heightFrac,y)])
    if spiralIn==True:
        cmds.reverseCurve(curve,ch=0,rpo=1)
Ejemplo n.º 18
0
def hyperbolic(loops,spiralIn,height):
    '''
    Creates a hyperbolic spiral
    
    loops    : Number of complete turns the spiral should have
    spiralIn : Direction of the generated curve
    height   : Vertical height of the spiral
    
    The curve is created and the required number of control vertices is calculated 
    along with the fraction of the height each CV needs to be placed. The polar 
    equation of a hyperbolic spiral is r=a/theta where a scales the spiral. The 
    polar coordinates are converted to Cartesian form by x=r*math.cos(theta) and 
    y=r*math.sin(theta). The direction of the curve can be reversed based on the 
    spiralInwards flag.
    '''
    curve=cmds.curve(p=[(0,0,0)],n='curve_01')
    cvNo=loops*8
    heightFrac = float(height)/cvNo
    for i in range(1,cvNo+2):
        theta=i*(0.25*math.pi)
        r=theta**(-1)
        x=r*math.cos(theta)
        y=r*math.sin(theta)
        cmds.curve(curve,a=True,p=[(x,i*heightFrac,y)])
    cmds.delete(curve+'.cv[0]')
    if spiralIn==False:
        cmds.reverseCurve(curve,ch=0,rpo=1)
Ejemplo n.º 19
0
def archimedesDouble(loops,spiralDown,gaps,height):
    '''
    Creates a Archimedes spiral that spirals out then in again
    
    loops      : Number of complete turns the spiral should have
    spiralDown : Direction of the generated curve
    growth     : Growth factor
    height     : Vertical height of the spiral
    
    The curve is created and the required number of control vertices is calculated 
    along with the fraction of the height each CV needs to be placed. The polar 
    equation of a Archimedes spiral is r=a+b*theta where a rotates the spiral 
    and b controls distance between successive turnings. The polar coordinates 
    are converted to Cartesian form by x=r*math.cos(theta) and y=r*math.sin(theta).
    After half the CVs, I reverse the equation to wind the spiral back in. The 
    direction of the curve can be reversed based on the spiralDown flag.
    '''
    curve=cmds.curve(p=[(0,0,0)],n='curve_01')
    cvNo=int(loops*8)
    heightFrac = float(height)/cvNo
    for i in range(1,(cvNo/2)+1):
        theta=i*(0.25*math.pi)
        r=(gaps/(1.8*math.pi))*theta
        x=r*math.cos(theta)
        y=r*math.sin(theta)
        cmds.curve(curve,a=True,p=[(x,i*heightFrac,y)])
    for i in reversed(range(0,cvNo/2)):
        theta=i*(0.25*math.pi)
        r=(gaps/(1.8*math.pi))*theta
        x=(r*math.cos(theta))
        y=-(r*math.sin(theta))
        cmds.curve(curve,a=True,p=[(x,height-i*heightFrac,y)])
    if spiralDown==True:
        cmds.reverseCurve(curve,ch=0,rpo=1)
Ejemplo n.º 20
0
 def sqGenerateCurves(self, *args):
     self.edgeList = cmds.ls(selection=True, flatten=True)
     if not self.edgeList == None and not self.edgeList == [] and not self.edgeList == "":
         self.baseCurve = cmds.polyToCurve(name="baseCurve", form=2, degree=1)[0]
         cmds.select(self.baseCurve+".ep[*]")
         cmds.insertKnotCurve(cmds.ls(selection=True, flatten=True), constructionHistory=True, curveOnSurface=True, numberOfKnots=1, addKnots=False, insertBetween=True, replaceOriginal=True)
         
         pointListA, pointListB, sideA, sideB = self.sqGetPointLists()
         
         toDeleteList = []
         p = 2
         for k in range((sideA+2), (sideB-1)):
             if p%2 == 0:
                 toDeleteList.append(self.baseCurve+".cv["+str(k)+"]")
                 toDeleteList.append(self.baseCurve+".cv["+str(k+len(pointListA)-1)+"]")
             p = p+1
         q = 2
         m = sideA-2
         if m >= 0:
             while m >= 0:
                 if not m == sideA and not m == sideB:
                     if q%2 == 0:
                         toDeleteList.append(self.baseCurve+".cv["+str(m)+"]")
                 m = m-1
                 q = q+1
         
         cmds.delete(toDeleteList)
         cmds.insertKnotCurve([self.baseCurve+".u["+str(len(pointListA)-1)+"]", self.baseCurve+".ep["+str(len(pointListA)-1)+"]"], constructionHistory=True, curveOnSurface=True, numberOfKnots=1, addKnots=False, insertBetween=True, replaceOriginal=True)
         
         pointListA, pointListB, sideA, sideB = self.sqGetPointLists()
         
         posListA, posListB = [], []
         for i in range(0, len(pointListA)-1):
             posListA.append(cmds.xform(pointListA[i], query=True, worldSpace=True, translation=True))
             posListB.append(cmds.xform(pointListB[i], query=True, worldSpace=True, translation=True))
         
         self.mainCurveA = cmds.curve(name="StickyLips_Main_A_Crv", degree=1, point=posListA)
         self.mainCurveB = cmds.curve(name="StickyLips_Main_B_Crv", degree=1, point=posListB)
         
         cmds.rename(cmds.listRelatives(self.mainCurveA, children=True, shapes=True)[0], self.mainCurveA+"Shape")
         cmds.rename(cmds.listRelatives(self.mainCurveB, children=True, shapes=True)[0], self.mainCurveB+"Shape")
         
         cmds.select(self.mainCurveA+".cv[*]")
         self.curveLenght = len(cmds.ls(selection=True, flatten=True))
         cmds.select(clear=True)
         
         self.sqCheckCurveDirection(self.mainCurveA)
         self.sqCheckCurveDirection(self.mainCurveB)
         
         self.baseCurveA = cmds.duplicate(self.mainCurveA, name=self.mainCurveA.replace("_Main_", "_Base_"))[0]
         self.baseCurveB = cmds.duplicate(self.mainCurveB, name=self.mainCurveB.replace("_Main_", "_Base_"))[0]
         
         cmds.delete(self.baseCurve)
         self.maxIter = len(posListA)
         
         cmds.group(self.mainCurveA, self.mainCurveB, self.baseCurveA, self.baseCurveB, name="StickyLips_StaticData_Grp")
     else:
         mel.eval("warning \"Please, select an closed edgeLoop.\";")
Ejemplo n.º 21
0
	def square_curve( self ):
		cmds.curve( d = 1, p = [( 0.5, 0, -0.5 ),
											  ( 0.5, 0, 0.5 ),
											  ( -0.5, 0, 0.5 ),
											  ( -0.5, 0, -0.5 ),
											  ( 0.5, 0, -0.5 )],
											  k = [0, 1, 2, 3, 4] )

		self.controller_dag = maya_dag.DAG_Node()
Ejemplo n.º 22
0
def rebuildCurveWithKnotData(knots, crvs):
    for crv in crvs:
        cvPositions = mc.getAttr('%s.cv[*]'%crv)
        degree = mc.getAttr('%s.degree'%crv)
        numOfCV = len(cvPositions)
        if numOfCV + degree - 1 == len(knots):
            mc.curve(crv, r=1, os=1, p=cvPositions, k=knots)
        else:
            mc.error('Knot values do not match number of CVs')
Ejemplo n.º 23
0
 def testStaticNurbsCurvePropReadWrite(self):
     nodeName = 'nCurve'
     shapeName = 'curveShape1'
     MayaCmds.curve(p=[(0, 0, 0), (3, 5, 6), (5, 6, 7), (9, 9, 9)],
         name=nodeName)
     self.setProps(shapeName)
     self.__files.append(util.expandFileName('staticPropCurve.abc'))
     MayaCmds.AbcExport(j='-atp SPT_ -root %s -f %s' % (nodeName, self.__files[-1]))
     self.verifyProps(shapeName, self.__files[-1])
Ejemplo n.º 24
0
	def diamond_curve( self ):
		cmds.curve( d = 1, p = [( 0.5, 0, 0 ), ( 0, 0, -0.5 ), ( -0.5, 0, 0 ),
											  ( 0, 0, 0.5, ), ( 0, -0.5, 0 ), ( 0, 0, -0.5 ),
											  ( 0, 0.5, 0 ), ( -0.5, 0, 0 ), ( 0, -0.5, 0 ),
											  ( 0.5, 0, 0 ), ( 0, 0.5, 0 ), ( 0, 0, 0.5 ),
											  ( 0.5, 0, 0 )],
											  k = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] )

		self.controller_dag = maya_dag.DAG_Node()
def createCube(*args):
    cmds.curve(d=1, p=[ (0.5, 0.126219, -0.5), (0.5, 0.126219, 0.5) ,(0.5, 1.126219, 0.5), (0.5, 1.126219, -0.5),
                       (0.5, 0.126219, -0.5) ,(-0.5, 0.126219, -0.5) ,(-0.5, 1.126219, -0.5) ,(0.5, 1.126219, -0.5),
                       (-0.5, 1.126219, -0.5) ,(-0.5, 1.126219, 0.5) ,(-0.5, 0.126219, 0.5) ,(-0.5, 0.126219, -0.5),
                       (-0.5, 1.126219, -0.5), (-0.5, 1.126219, 0.5) ,(0.5, 1.126219, 0.5) ,(0.5, 0.126219, 0.5),
                       (-0.5, 0.126219, 0.5)], k=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])
    cmds.CenterPivot()
    cmds.select(cl=True)

    print 'Created a Solid Nurbs Cube'
Ejemplo n.º 26
0
	def box_curve( self ):
		cmds.curve( d = 1, p = [( 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.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.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.5, -0.5, 0.5 ), ( 0.5, -0.5, 0.5 ),
											  ( 0.5, -0.5, -0.5 ), ( -0.5, -0.5, -0.5 )] )

		self.controller_dag = maya_dag.DAG_Node()
Ejemplo n.º 27
0
 def curveOnEdgeLoop(self):
     """
     first two edge selection are important( it determines the first vertex)
     create curve based on the ordered vertices list
     """
     myList = cmds.ls(os=1, fl=1)
     allVerts = self.orderedVertsEdgeLoop(myList)
     vertsPos = []
     for v in allVerts:
         pos = cmds.xform(v, q =1, ws =1, t =1)
         vertsPos.append(pos)
     cmds.curve(n= 'loftCurve01', d =1, per =1, p = vertsPos)
Ejemplo n.º 28
0
def createPathCurve(*arg):
	pathNodes = cmds.ls('pathNode*',type='transform')
	print pathNodes
	pathCurve = 'pathCurve'
	i=0
	for node in pathNodes:
		if i==0:
			nodePos = cmds.xform(node, q=True,a=True,t=True)
			pathCurve = cmds.curve(n=pathCurve,p=[nodePos])
			i+=1
		else:
			nodePos = cmds.xform(node, q=True,a=True,t=True)
			cmds.curve(pathCurve,a=True,p=[nodePos])
Ejemplo n.º 29
0
def drawCurve( target,start,end,colour,samples ):
	# print target,start,end,samples,colour
	# make locator, constrain to target
	cmds.spaceLocator( name="myLocator" )
	cmds.select( target )
	cmds.select( "myLocator", add=True )
	cmds.pointConstraint()

	# make a new render layer with locator, and change display colour
	cmds.select( "myLocator" )
	exists = cmds.objExists( "AnimationCurves" )
	if ( exists==False ):
		cmds.createDisplayLayer( name="AnimationCurves", number=1, nr=True )
		cmds.createDisplayLayer( name="Spheres", number=1, nr=True )
		cmds.setAttr( "AnimationCurves.color", colour )
		cmds.setAttr( "Spheres.color", 16 )		

	# make a list of all the frames where points for the curve will be created
	frameList = []
	frameList.append( start )
	length = end - start
	samples = cmds.intField( samplesField, q=1, v=1 )
	interval = int( length / (samples-1) ) # using int() to ensure integer frame numbers
	for i in range( 1,samples ):
		frameList.append( start+interval*i )
	frameList.append( end )

	# make a list of tuples containing the locations of the target/locator for every frame needed
	xFormList = []
	n = 0
	for frame in ( frameList ):
		x = cmds.getAttr( "myLocator.tx",time=frame )
		y = cmds.getAttr( "myLocator.ty",time=frame )
		z = cmds.getAttr( "myLocator.tz",time=frame )
		currentXForm = ( x,y,z )
		xFormList.append( currentXForm )
		cmds.sphere( n="sphere"+str(n), r=0.2 )
		cmds.move( x,y,z, "sphere"+str(n), a=True )
		n+=1
		# print frame, "= ", x,y,z
	cmds.editDisplayLayerMembers( "Spheres", "sphere*", nr=True )

	# create curve using list of tuples
	cmds.curve( p=xFormList, d=1, ws=True )
	cmds.rename( target+"_animation_curve" )
	cmds.group( target+"_animation_curve", "sphere*", n="curve" )
	# add curve to animation curves layer
	cmds.editDisplayLayerMembers( "AnimationCurves", "curve", nr=True )
	cmds.delete("myLocator")
	cmds.button( ccButton, e=1, en=0 )
	cmds.frameLayout( buttonGroup, e=1, l="Delete curve before creating another" )
Ejemplo n.º 30
0
def clock():
    c1 = cmds.circle(nr=(0,1,0), c=(0,0,0))

    sp = (0,0,0)
    ep = (0,0,-1)

    hours = cmds.curve(p=[sp, ep])
    minutes = cmds.curve(p=[sp, ep])
    seconds = cmds.curve(p=[sp, ep])

    # scale = 100
    hour_degrees = -90
    minute_degrees = 12 * hour_degrees
    second_degrees = 60 * minute_degrees
Ejemplo n.º 31
0
 def TDPyramid(self, name):
     return cmds.curve(d=1,
                       n=name,
                       p=[(0, 2, 0), (1, 0, -1), (-1, 0, -1), (0, 2, 0),
                          (-1, 0, 1), (1, 0, 1), (0, 2, 0), (1, 0, -1),
                          (1, 0, 1), (-1, 0, 1), (-1, 0, -1)])
Ejemplo n.º 32
0
def Leg_R():
    Scale_Guide=cmds.xform('Guide_Ctrl_Master',ws=True, q=True, s=True )[0]
    ##Joints Leg_R##
    #J_Leg_R#
    trans_Guide_Leg_R = cmds.xform ('Loc_Guide_Leg_R', ws=True, q=True, t=True)
    translate_Guide_ForeLeg_R = cmds.xform ('Loc_Guide_ForeLeg_R', ws=True, q=True, t=True)
    translate_Guide_Foot_R = cmds.xform ('Loc_Guide_Foot_R', ws=True, q=True, t=True)
    Joint_Leg_Neutral_R=cmds.joint(n='J_Leg_Neutral_R',p=trans_Guide_Leg_R,rad=1*Scale_Guide)
    Joint_ForeLeg_Neutral_R=cmds.joint(n='J_ForeLeg_Neutral_R',p=translate_Guide_ForeLeg_R,rad=1*Scale_Guide)
    Joint_Ankle_Neutral_R=cmds.joint(n='J_Ankle_Neutral_R',p=translate_Guide_Foot_R,rad=1*Scale_Guide)
    OJ_Joint_Leg_Neutral_R=cmds.joint('J_Leg_Neutral_R', e=True, zso=True, oj='xzy',sao='zup')
    OJ_Joint_ForeLeg_Neutral_R=cmds.joint('J_ForeLeg_Neutral_R', e=True, zso=True, oj='xzy',sao='zup')
    OJ_Joint_Ankle_Neutral_R=cmds.joint('J_Ankle_Neutral_R', e=True, zso=True, oj='xzy',sao='zup')
    joX_Ankle_R=cmds.setAttr("J_Ankle_Neutral_R.jointOrientX",0)
    joY_Ankle_R=cmds.setAttr("J_Ankle_Neutral_R.jointOrientY",0)
    joZ_Ankle_R=cmds.setAttr("J_Ankle_Neutral_R.jointOrientZ",0)
    cmds.select(d=True)
    #J_Ankle_R#
    trans_Guide_Foot_R = cmds.xform ('Guide_Foot_R', ws=True, q=True, t=True)
    translate_Guide_Toe_R = cmds.xform ('Loc_Guide_Toe_R', ws=True, q=True, t=True)
    translate_Guide_Tip_R = cmds.xform ('Loc_Guide_Tip_R', ws=True, q=True, t=True)
    Joint_Toe_Neutral_R=cmds.joint(n='J_Toe_Neutral_R',p=translate_Guide_Toe_R,rad=1*Scale_Guide)
    Joint_Tip_Neutral_R=cmds.joint(n='J_Tip_Neutral_R',p=translate_Guide_Tip_R,rad=1*Scale_Guide)
    OJ_Joint_Leg_Neutral_R=cmds.joint('J_Toe_Neutral_R', e=True, zso=True, oj='xzy',sao='yup')
    OJ_Joint_ForeLeg_Neutral_R=cmds.joint('J_Tip_Neutral_R', e=True, zso=True, oj='xzy',sao='yup')
    rot_Ankle_R = cmds.xform ('J_Ankle_Neutral_R', ws=True, q=True, ro=True)
    cmds.select( d=True )
    cmds.parent('J_Toe_Neutral_R','J_Ankle_Neutral_R')
    cmds.select(d=True)
    cmds.select(Joint_Leg_Neutral_R)
    cmds.mirrorJoint (myz=True, mb=True)
    cmds.delete('J_Leg_Neutral_R')
    Rename_FK= mel.eval('searchReplaceNames("_R1","_R","all")')
    cmds.select(d=True)
    rot_Guide_Leg_R = cmds.xform ('J_Leg_Neutral_R', ws=True, q=True, ro=True)
    trans_Guide_Leg_R = cmds.xform ('J_Leg_Neutral_R', ws=True, q=True, t=True)
    Z_J_Leg=cmds.group(n='Z_J_Leg_Neutral_R',em=True)
    P_J_Leg=cmds.group(n='P_J_Leg_Neutral_R')
    emparentarTrans = cmds.xform ('P_J_Leg_Neutral_R', ws=True, t=trans_Guide_Leg_R)
    emparentarRot = cmds.xform ('P_J_Leg_Neutral_R', ws=True, ro=rot_Guide_Leg_R)
    P_J_Leg_Neutral_R_Z_J_Leg_Neutral_R=cmds.parent('J_Leg_Neutral_R','Z_J_Leg_Neutral_R')
    Activar_color= cmds.setAttr('P_J_Leg_Neutral_R.overrideEnabled', 1)
    Blanco= cmds.setAttr('P_J_Leg_Neutral_R.overrideColor', 16)
    cmds.select( d=True ) 
    #Duplicate the original chain
    Duplicar_a_FK= cmds.duplicate(P_J_Leg, rc=True)
    Duplicar_a_IK= cmds.duplicate(P_J_Leg, rc=True)
    #rename the chain
    Rename_FK= mel.eval('searchReplaceNames("_Neutral_R1","_FK_R","all")')
    Rename_IK= mel.eval('searchReplaceNames("_Neutral_R2","_IK_R","all")')
    #Change Color Herarchy FK_IK
    Activar_Color= cmds.setAttr(('P_J_Leg_FK_R.overrideEnabled'), 1)
    Azul= cmds.setAttr('P_J_Leg_FK_R.overrideColor', 6)
    Activar_Color= cmds.setAttr('P_J_Leg_IK_R.overrideEnabled', 1)
    Amarillo= cmds.setAttr('P_J_Leg_IK_R.overrideColor', 17)
    def J(Joints,nombre,radio):
        for Elemento in Joints:
            Change_Radius_Tip_FK= cmds.setAttr(Elemento+'_'+nombre+'_R'+'.radius',radio*Scale_Guide)
    J(['J_Leg','J_ForeLeg','J_Ankle','J_Toe','J_Tip'],"FK",.5)    
    J(['J_Leg','J_ForeLeg','J_Ankle','J_Toe','J_Tip'],"IK",.3)
    #########Create_Ctrls_FK_R#############
    #Create_Ctrl_Leg_FK_R
    translate = cmds.xform ('J_Leg_FK_R', ws=True, q=True, t=True)
    rot = cmds.xform ('J_Leg_FK_R', ws=True, q=True, ro=True)
    #Emparentar R_FK_Leg_CTL
    emparentarTrans_R = cmds.xform ('P_R_FK_Leg_CTL', ws=True, t=translate)
    emparentarRot_R = cmds.xform ('P_R_FK_Leg_CTL', ws=True, ro=rot)
    cmds.parentConstraint ('R_FK_Leg_CTL', 'J_Leg_FK_R',mo=True)
    #Create_Ctrl_ForeLeg_FK_R
    translate = cmds.xform ('J_ForeLeg_FK_R', ws=True, q=True, t=True)
    rot = cmds.xform ('J_ForeLeg_FK_R', ws=True, q=True, ro=True)
    #Emparentar R_FK_Leg_CTL
    emparentarTrans_R = cmds.xform ('P_R_FK_ForeLeg_CTL', ws=True, t=translate)
    emparentarRot_R = cmds.xform ('P_R_FK_ForeLeg_CTL', ws=True, ro=rot)
    cmds.parentConstraint ('R_FK_ForeLeg_CTL', 'J_ForeLeg_FK_R',mo=True)
    P_ForeLeg_R_Ctrl_Leg_R= cmds.parent(("P_R_FK_ForeLeg_CTL","R_FK_Leg_CTL"))
    #Create_IKAnklele_Leg_R
    Ik_Ankle_Leg_R=cmds.ikHandle(n='Ik_Ankle_Leg_R', sj='J_Leg_IK_R', ee='J_Ankle_IK_R')
    Hidde_Ik_Ankle_Leg_R=cmds.hide('Ik_Ankle_Leg_R')
    #Create_Ctrl_PV_Leg_R
    pos_Leg_IK_R = cmds.xform ('Guide_Leg_R', ws=True, q=True, t=True)
    pos_ForeLeg_IK_R = cmds.xform ('Guide_ForeLeg_R', ws=True, q=True, t=True)
    pos_Ankle_IK_R = cmds.xform ('Guide_Foot_R', ws=True, q=True, t=True)
    Cv_Polevector_Leg_R=cmds.curve(n='Cv_PV_Guide_Leg_R',d=1,p=[(pos_Leg_IK_R ),(pos_ForeLeg_IK_R),(pos_Ankle_IK_R)],k=(0,1,2))
    Move_Cv_Guide=cmds.moveVertexAlongDirection ('Cv_PV_Guide_Leg_R.cv[1]', n= 4.8*Scale_Guide)
    pos_Cv= cmds.pointPosition ('Cv_PV_Guide_Leg_R.cv[1]')
    emparentarTrans_R_PV_Leg_R = cmds.xform ('P_R_PolevectorLeg_CTL', ws=True, t=pos_Cv)
    delete_Cv_Polevector_Leg_R=cmds.delete(Cv_Polevector_Leg_R)
    Cons_PV_Leg_R= cmds.poleVectorConstraint('R_PolevectorLeg_CTL', 'Ik_Ankle_Leg_R' )
    #R_IK_Leg_CTL
    translate_Ctrl_IK_R = cmds.xform ('J_Ankle_IK_R', ws=True, q=True, t=True)
    emparentarTrans_IK_Leg_R = cmds.xform ('P_R_IK_Leg_CTL', ws=True, t=translate_Ctrl_IK_R)
    #Herarchy_IkH_Ctrl_Leg_IK_R
    IkH_Leg_R_Ctrl_Leg_IK_R=cmds.parent('Ik_Ankle_Leg_R','R_IK_Leg_CTL')
    #Create_Ctrl_Switch_Leg_R
    translate_Switch_Leg_R = cmds.xform ('Guide_Ctrl_Switch_Leg_R', ws=True, q=True, t=True)
    rot_Switch_Leg_R = cmds.xform ('Guide_Ctrl_Switch_Leg_R', ws=True, q=True, ro=True)
    emparentarTrans_R_Switch_Leg_R = cmds.xform ("P_R_SwitchLeg_CTL", ws=True, t=translate_Switch_Leg_R)
    emparentarRot_R_Switch_Leg_R = cmds.xform ("P_R_SwitchLeg_CTL", ws=True, ro=rot_Switch_Leg_R)
    #Add_Attrs_Switch_Leg_R
    Atributo_Switch= cmds.addAttr("R_SwitchLeg_CTL",longName='Switch_FK_IK',attributeType='float', defaultValue=10, minValue=0, maxValue=10 )
    agregarAttr= cmds.setAttr ("R_SwitchLeg_CTL.Switch_FK_IK", k=True)
    Atributo_Stretch= cmds.addAttr("R_SwitchLeg_CTL",longName='Stretch',attributeType='float', defaultValue=1, minValue=0, maxValue=1)
    AgregarAttrStretch= cmds.setAttr ("R_SwitchLeg_CTL.Stretch", k=True)
    #Switch_FK_IK_Leg_R
    Select_Leg=cmds.select('J_Leg_Neutral_R','J_ForeLeg_Neutral_R','J_Ankle_Neutral_R')
    sel = cmds.ls (sl=True)
    def Clear_Select():
        cmds.select (cl=True)
    Clear_Select()
    MD_switch_fk_ik = cmds.shadingNode ("multiplyDivide", asUtility=True, n="MD_Leg_Switch_FK_IK_R")
    cmds.setAttr(MD_switch_fk_ik+'.operation',2)
    cmds.setAttr(MD_switch_fk_ik+'.input2X',10)
    cmds.connectAttr ('R_SwitchLeg_CTL.Switch_FK_IK', MD_switch_fk_ik + ".input1X")
    for J in sel:
        N = J.split("_Neutral_R")[0]
        print N
        New_N=N.split("J_")[1]
        BC_rotate = cmds.shadingNode ("blendColors", asUtility=True, n="BC_" + New_N+"_rotate_R")
        BC_translate = cmds.shadingNode ("blendColors", asUtility=True, n="BC_" + New_N+"_translate_R")
        cmds.connectAttr (BC_rotate + ".output", J + ".rotate")
        cmds.connectAttr (MD_switch_fk_ik + ".outputX", BC_rotate + ".blender")
        cmds.connectAttr (BC_translate + ".output", J + ".translate")
        cmds.connectAttr (MD_switch_fk_ik + ".outputX", BC_translate + ".blender")
    j_Leg_neutral=('J_Leg_Neutral_R')
    j_foreLeg_neutral=('J_ForeLeg_Neutral_R')
    jnt_Ankle_neutral_R=('J_Ankle_Neutral_R')
    JN1 = j_Leg_neutral.split("_Neutral_R")[0]
    JN2 = j_foreLeg_neutral.split("_Neutral_R")[0]
    JN3 = jnt_Ankle_neutral_R.split("_Neutral_R")[0]
    Milista=[]
    list.append(Milista,JN1)
    list.append(Milista,JN2)
    list.append(Milista,JN3)
    def fun1(Var1):    
        list.append (Milista, Milista[0] + Var1)
        list.append (Milista, Milista[1] + Var1)
        list.append (Milista, Milista[2] + Var1)
    fun1('_FK_R')
    fun1('_IK_R')
    def fun(Var):    
        cmds.connectAttr (Milista[3]+ "."+Var, "BC_Leg_"+Var+"_R.color2")
        cmds.connectAttr (Milista[6]+ "."+Var, "BC_Leg_"+Var+"_R.color1")
        cmds.connectAttr (Milista[4]+ "."+Var, "BC_ForeLeg_"+Var+"_R.color2")
        cmds.connectAttr (Milista[7]+ "."+Var, "BC_ForeLeg_"+Var+"_R.color1")
        cmds.connectAttr (Milista[5]+ "."+Var, "BC_Ankle_"+Var+"_R.color2")
        cmds.connectAttr (Milista[8]+ "."+Var, "BC_Ankle_"+Var+"_R.color1")
    fun('rotate')
    fun('translate')
    #Cons_Orient_Ik_Ankle_J_Ankle_R
    Parent_Cons_FK_Ctrl_J_Ik_Leg=cmds.parentConstraint('R_FK_Leg_CTL','J_Leg_IK_R',mo=True)
    Herarchy_Switch_Leg_R_J_Ankle_Neutral_R=cmds.parent('P_R_SwitchLeg_CTL','J_Ankle_Neutral_R')
    translate_J_ForeLeg_Ik_R = cmds.xform ('J_ForeLeg_IK_R', ws=True, q=True, t=True)
    translate_Ctrl_Polevector_Leg_R = cmds.xform ('R_PolevectorLeg_CTL', ws=True, q=True, t=True)
    #CVPv_IK_R#
    Cv_Polevector_Leg_R=cmds.curve(n='Cv_Polevector_Leg_R',d=1,p=[(translate_J_ForeLeg_Ik_R),(translate_Ctrl_Polevector_Leg_R)],k=(0,1))
    Z_Cvv_Polevector_Leg_R= cmds.group (n=("Z_Cv_Polevector_Leg_R"),em=True)
    Herarchy_CV_Grp=cmds.parent('Cv_Polevector_Leg_R',"Z_Cv_Polevector_Leg_R")
    lineWidth_Cv_Polevector_Leg_R=cmds.setAttr (Cv_Polevector_Leg_R+".lineWidth",2)
    OvE_Cv_Polevector_Leg_R=cmds.setAttr(Cv_Polevector_Leg_R+".overrideEnabled",1)
    OvDT_Cv_Polevector_Leg_R=cmds.setAttr(Cv_Polevector_Leg_R+".overrideDisplayType",2)
    cmds.select(d=True)
    J_CV_0_Leg_R=cmds.joint(p=translate_J_ForeLeg_Ik_R,n="J_Cv_0_Leg_R")
    Grp_J_CV_0_Leg_R=cmds.group(n='Z_J_Cv_0_Leg_R')
    cmds.select(d=True)
    J_CV_1_Leg_R=cmds.joint(p=translate_Ctrl_Polevector_Leg_R,n="J_Cv_1_Leg_R")
    Grp_J_CV_1_Leg_R=cmds.group(n='Z_J_Cv_1_Leg_R')
    cmds.select(d=True)
    Skin_J_Cvs=cmds.skinCluster('J_Cv_0_Leg_R','J_Cv_1_Leg_R','Cv_Polevector_Leg_R',dr=4)
    Parent_J_CV_Leg_R_J_ForeLeg_IK_R=cmds.parent(Grp_J_CV_0_Leg_R,'J_ForeLeg_IK_R')
    Parent_J_CV_Leg_R_J_ForeLeg_IK_R=cmds.parent(Grp_J_CV_1_Leg_R,'R_PolevectorLeg_CTL')
    cmds.select(d=True)
    #Create Node_Vis_Leg_R#
    Node_Reverse_Vis_Leg_R=cmds.shadingNode('reverse',au=True, n='R_Vis_Leg_R')
    Node_MD_Vis_Leg_R=cmds.shadingNode('multiplyDivide',au=True, n='MD_Vis_Leg_R')
    Operation_MD_Vis_Leg_R= cmds.setAttr (Node_MD_Vis_Leg_R+'.operation',2, k=True)
    Set_2X_Node_MD_Vis_Leg_R= cmds.setAttr (Node_MD_Vis_Leg_R+'.input2X',10, k=True)
    #Conect Vis_Leg_R#
    Switch_MD_Leg_R=cmds.connectAttr('R_SwitchLeg_CTL.Switch_FK_IK',Node_MD_Vis_Leg_R+'.input1X')
    MD_R_Leg_R=cmds.connectAttr(Node_MD_Vis_Leg_R+'.outputX',Node_Reverse_Vis_Leg_R+'.inputX')
    R_Ctrl_FK_Leg_R=cmds.connectAttr(Node_Reverse_Vis_Leg_R+'.outputX','P_R_FK_ForeLeg_CTL.visibility')
    R_J_FK_Leg_R=cmds.connectAttr(Node_Reverse_Vis_Leg_R+'.outputX','P_J_Leg_FK_R.visibility')
    MD_Ctrl_IK_Leg_R=cmds.connectAttr(Node_MD_Vis_Leg_R+'.outputX','P_R_IK_Leg_CTL.visibility')
    MD_PV_IK_Leg_R=cmds.connectAttr(Node_MD_Vis_Leg_R+'.outputX','R_PolevectorLeg_CTL.visibility')
    MD_CV_PV_IK_Leg_R=cmds.connectAttr(Node_MD_Vis_Leg_R+'.outputX','Z_Cv_Polevector_Leg_R.visibility')
    MD_J_IK_Leg_R=cmds.connectAttr(Node_MD_Vis_Leg_R+'.outputX','P_J_Leg_IK_R.visibility')
Ejemplo n.º 33
0
 def TDDirSingleFat(self, name):
     return cmds.curve(d=1,
                       n=name,
                       p=[(0, 0, -0.99), (-0.66, 0, 0), (-0.33, 0, 0),
                          (-0.33, 0, 0.66), (0.33, 0, 0.66), (0.33, 0, 0),
                          (0.66, 0, 0), (0, 0, -0.99)])
Ejemplo n.º 34
0
def generateTeeth():
    stacks = ['up', 'dn']
    sides = ['L', 'R']

    baseName = 'teeth'
    MainGuideSuff = 'jnt_GUIDE'
    noXformGrp = 'teeth_noXformGrp'
    mouthCtrl = 'mouth_ctrl'
    gumsMesh = 'gum_hi'
    gumsMeshAlt = 'gums_hi'
    teethGuidesGrp = '%s_guides_grp' % baseName

    # --- creating noXformGrp for later use
    mc.group(n=noXformGrp, em=True)
    mc.parent(noXformGrp, 'facial_fGrp')
    mc.hide(noXformGrp)

    # --- creating hold_jnt for further use
    mc.select(cl=True)
    holdJnt = mc.joint(n='%s_hold_jnt' % baseName)
    mc.parent(holdJnt, noXformGrp)

    for stack in stacks:
        mainTeethParent = '%s_%s_SKN' % (baseName, stack)
        mainBaseGuide = '%s_%s_%s' % (baseName, stack, MainGuideSuff)
        crvGuidesGrp = '%s_%s_guides_grp' % (baseName, stack)

        # --- get all teeth guides from template groups
        mainGuides = mc.listRelatives(mainBaseGuide, c=True, type='joint')

        # --- tweak and realign jawGen generated controls
        allGuides = mainGuides
        mainGuides.append(mainBaseGuide)
        allOrient = []
        for guide in allGuides:
            parent = mc.listRelatives(guide, p=True)[0]
            mc.parent(guide, w=True)
            RO = mc.getAttr('%s.rotate' % guide)[0]
            JO = mc.getAttr('%s.jointOrient' % guide)[0]
            orient = (RO[0] + JO[0], RO[1] + JO[1], RO[2] + JO[2])
            allOrient.append(orient)
            mc.parent(guide, parent)

        parentList = []
        for g, guide in enumerate(allGuides):
            ctrl = guide.replace('GUIDE', 'orig')
            parent = mc.listRelatives(ctrl, p=True)[0]
            parentList.append(parent)
            mc.parent(ctrl, w=True)
            mc.setAttr('%s.jointOrient' % ctrl, 0, 0, 0)
            mc.setAttr('%s.rotate' % ctrl, allOrient[g][0], allOrient[g][1],
                       allOrient[g][2])

        for g, guide in enumerate(reversed(allGuides)):
            ctrl = guide.replace('GUIDE', 'orig')
            parent = parentList[-1 - g]
            mc.parent(ctrl, parent)
            if g > 0:
                mc.setAttr('%s.jointOrientX' % ctrl, 0)
                mc.setAttr('%s.jointOrientZ' % ctrl, 0)
                mc.setAttr('%s.rotateX' % ctrl, 0)
                mc.setAttr('%s.rotateZ' % ctrl, 0)

        ## --- create midCtrls symmetry
        midCtrls = []
        for g, guide in enumerate(allGuides):
            ctrl = guide.replace('GUIDE', 'orig')
            splitName = ctrl.rsplit('_', 3)[1]
            if splitName == 'mid':
                midCtrls.append(ctrl)
                RCtrls = mc.duplicate(ctrl, n=ctrl.replace('L_', 'R_'))
                midCtrls.append(RCtrls[0])
                ### --- rename childs of dupilcated control
                RCtrlChilds = mc.listRelatives(RCtrls[0], ad=True, f=True)
                for c, child in enumerate(RCtrlChilds):
                    if c > 0:
                        strippedName = child.rsplit('|', 1)[1]
                        newName = mc.rename(child,
                                            strippedName.replace('L_', 'R_'))
                ### --- reconnect control to SKN of duplicated mid Ctrl
                renamedChilds = mc.listRelatives(RCtrls[0], ad=True)
                for child in renamedChilds:
                    splitName = child.rsplit('_', 1)[1]
                    if splitName == 'ctrl':
                        if not mc.objectType(child) == 'nurbsCurve':
                            patchLib.smartcopyAttr(
                                child, child.replace('_ctrl', '_SKN'))
                            patchLib.smartConnect(
                                child, child.replace('_ctrl', '_SKN'))
                ### --- position RCtrl on symmetry
                #print ctrl
                mc.setAttr('%s.translateX' % RCtrls[0],
                           -(mc.getAttr('%s.translateX' % ctrl)))
                mc.setAttr('%s.scaleX' % RCtrls[0], -1)
        ## --- create new parent placed at origin for midCtrls
        midParent = mc.group(n='%s_%s_mids_orig' % (stack, baseName), em=True)
        mc.parent(midParent, mainTeethParent)
        mc.parent(midCtrls, midParent)

        # --- create world rigs from jawGen generated controls
        ## --- get all the objects that need a world duplicate
        mainTeethChilds = mc.listRelatives(mainTeethParent,
                                           c=True,
                                           ad=True,
                                           s=False)
        worldTargets = []
        for child in mainTeethChilds:
            if not mc.objectType(child) == 'nurbsCurve':
                worldTargets.append(child)
        ## --- create duplicated world objects and connects them to the actual controls
        ### --- create duplicate for main node
        worldParent = mc.duplicate(mainTeethParent,
                                   po=True,
                                   n='%s_world' % mainTeethParent)[0]
        mc.parent(worldParent, noXformGrp)
        ### --- create duplicates for every childNode of main node. Connect local Rig to world Rig
        worldParentdict = dict()
        worldNodes = []
        for target in worldTargets:
            splitName = target.split('_')
            parent = mc.listRelatives(target, p=True)[0]

            if not 'ctrl' in splitName:
                if not splitName[0] == 'C':
                    #### --- create world node
                    worldNode = mc.duplicate(target,
                                             po=True,
                                             n='%s_world' % target)[0]
                    mc.parent(worldNode, noXformGrp)
                    worldNodes.append(worldNode)
                    worldParentdict[worldNode] = (parent)
                    #### --- do the conection
                    if not 'mid' in splitName:
                        if not 'mids' in splitName:
                            patchLib.smartcopyAttr(target, worldNode)
                            patchLib.smartConnect(target, worldNode)
                        elif 'mids' in splitName:
                            pass
                    elif 'mid' in splitName:
                        if not 'orig' in splitName:
                            patchLib.smartcopyAttr(target, worldNode)
                            patchLib.smartConnect(target, worldNode)
                        else:
                            ROCon = mc.listConnections('%s.rotateOrder' %
                                                       target,
                                                       s=True,
                                                       p=True)
                            if ROCon:
                                mc.disconnectAttr(ROCon[0],
                                                  '%s.rotateOrder' % target)
                            patchLib.smartcopyAttr(worldNode, target)
                            patchLib.smartConnect(worldNode, target)

                elif splitName[0] == 'C':
                    #### --- create world node
                    LWorldNode = mc.duplicate(target,
                                              po=True,
                                              n='L%s_world' % target)[0]
                    RWorldNode = mc.duplicate(target,
                                              po=True,
                                              n='R%s_world' % target)[0]
                    mc.parent(LWorldNode, RWorldNode, noXformGrp)
                    worldNodes.append(LWorldNode)
                    worldNodes.append(RWorldNode)

                    parentSplit = parent.split('_', 1)[0]
                    if not parentSplit == 'C':
                        worldParentdict[LWorldNode] = (parent)
                        worldParentdict[RWorldNode] = (parent)
                    elif parentSplit == 'C':
                        worldParentdict[LWorldNode] = ('L%s' % parent)
                        worldParentdict[RWorldNode] = ('R%s' % parent)
                    #### --- do the conection
                    patchLib.smartcopyAttr(target, LWorldNode)
                    patchLib.smartcopyAttr(target, RWorldNode)
                    patchLib.smartConnect(target, LWorldNode)
                    patchLib.smartConnect(target, RWorldNode)

        ### --- reparent world nodes to recreate local hierarchy
        for node in worldNodes:
            localParent = worldParentdict.get(node)
            mc.parent(node, '%s_world' % localParent)

        # --- get all curve teeth guides from template groups
        allCrvGuides = mc.listRelatives(crvGuidesGrp, c=True)

        ## --- separate the loft guides from the rest
        popIndex = 0
        crvLoftGuide = ''
        for g, guide in enumerate(allCrvGuides):
            splitName = guide.rsplit('_crv_')[-1]
            if splitName == 'GUIDE':
                popIndex = g
                crvLoftGuide = allCrvGuides.pop(g)

        # --- lofts from curves and symmetrise them to create n0 surfaces
        ## --- create left loft curves
        LdnCrv = mc.duplicate(crvLoftGuide,
                              n=crvLoftGuide.replace('GUIDE', 'Loft_00'))[0]
        LupCrv = mc.duplicate(crvLoftGuide,
                              n=crvLoftGuide.replace('GUIDE', 'Loft_01'))[0]
        patchLib.locksSwitch(LdnCrv,
                             T=True,
                             R=True,
                             S=True,
                             V=True,
                             lockdo='unlock',
                             keydo=True)
        patchLib.locksSwitch(LupCrv,
                             T=True,
                             R=True,
                             S=True,
                             V=True,
                             lockdo='unlock',
                             keydo=True)
        mc.parent(LdnCrv, LupCrv, mainTeethParent)
        mc.makeIdentity(LdnCrv, a=True)
        mc.makeIdentity(LupCrv, a=True)
        mc.makeIdentity(LdnCrv, a=False)
        mc.makeIdentity(LupCrv, a=False)
        offsetVal = 0.01
        mc.setAttr('%s.translateY' % LdnCrv, (-offsetVal))
        mc.setAttr('%s.translateY' % LupCrv, offsetVal)
        mc.parent(LdnCrv, LupCrv, w=True)
        mc.makeIdentity(LdnCrv, a=True)
        mc.makeIdentity(LupCrv, a=True)
        mc.makeIdentity(LdnCrv, a=False)
        mc.makeIdentity(LupCrv, a=False)
        ## --- create right loft curves
        RdnCrv = mc.duplicate(LdnCrv, n=LdnCrv.replace('L_', 'R_'))[0]
        RupCrv = mc.duplicate(LupCrv, n=LupCrv.replace('L_', 'R_'))[0]
        mc.setAttr('%s.scaleX' % RdnCrv, -1)
        mc.setAttr('%s.scaleX' % RupCrv, -1)
        mc.makeIdentity(RdnCrv, a=True)
        mc.makeIdentity(RupCrv, a=True)
        mc.makeIdentity(RdnCrv, a=False)
        mc.makeIdentity(RupCrv, a=False)
        ## --- create loft surfaces
        LLoftSurf = mc.loft(LdnCrv,
                            LupCrv,
                            n='L_%s_%s_surf_n0' % (stack, baseName),
                            ch=False)[0]
        RLoftSurf = mc.loft(RdnCrv,
                            RupCrv,
                            n='R_%s_%s_surf_n0' % (stack, baseName),
                            ch=False)[0]
        loftSurfsN0 = [LLoftSurf, RLoftSurf]
        loftSurfsN1 = mc.duplicate(loftSurfsN0)
        loftSurfsN2 = mc.duplicate(loftSurfsN0)
        loftSurfsAll = [loftSurfsN0, loftSurfsN1, loftSurfsN2]
        mc.delete(LdnCrv, LupCrv, RdnCrv, RupCrv)
        mc.parent(loftSurfsAll[0], loftSurfsAll[1], loftSurfsAll[2],
                  noXformGrp)

        ## --- disconnect unwanted ctrl to joints connections
        for target in worldNodes:
            splitName = target.split('_')
            if not 'gumsBase' in splitName:
                if 'SKN' in splitName:
                    scaleCons = mc.listConnections('%s.scale' % target,
                                                   s=True,
                                                   p=True)
                    if scaleCons:
                        for con in scaleCons:
                            mc.disconnectAttr(con, '%s.scale' % target)
                            if 'mid' in splitName:
                                mc.connectAttr('%sX' % con,
                                               '%s.scaleX' % target)
                            if not 'mid' in splitName:
                                if 'LC' in splitName or 'RC' in splitName:
                                    mc.connectAttr('%sX' % con,
                                                   '%s.scaleX' % target)
                                if 'L' in splitName or 'R' in splitName:
                                    mc.connectAttr('%sZ' % con,
                                                   '%s.scaleZ' % target)

        ## --- symmetrise teeth guides and creates final teeth hierarchy
        LCtrlList = []
        RCtrlList = []
        ctrlLists = [LCtrlList, RCtrlList]
        for guide in allCrvGuides:
            guideChild = mc.listRelatives(guide, c=True, type='transform')[0]
            mainCtrl = createTeethCtrl(guide, mouthCtrl, stack)
            tipCtrl = createTeethCtrl(guideChild, mouthCtrl, stack)
            mc.parent(tipCtrl[1], mainCtrl[0])
            mc.parent(mainCtrl[1], '%s_%s_SKN_world' % (baseName, stack))
            skelLib.jointOrientToRotate(mainCtrl[1])
            LCtrlList.append(mainCtrl[1])

            splitName = guide.split('ibt_01')
            if not len(splitName) > 1:
                getTx = mc.getAttr('%s.translateX' % mainCtrl[1])
                getRy = mc.getAttr('%s.rotateY' % mainCtrl[1])
                symOrig = mc.duplicate(mainCtrl[1],
                                       ic=True,
                                       n=mainCtrl[1].replace('L_', 'R_'))[0]
                skelLib.jointOrientToRotate(symOrig)
                mc.setAttr('%s.translateX' % symOrig, -getTx)
                mc.setAttr('%s.rotateY' % symOrig, -getRy)
                symChilds = mc.listRelatives(symOrig, c=True, ad=True, f=True)
                for child in symChilds:
                    splitName = child.rsplit('|', 1)[1]
                    mc.rename(child, splitName.replace('L_', 'R_'))
                RCtrlList.append(symOrig)
        teethGroup = '%s_%s_allCtrls_orig' % (baseName, stack)
        mc.group(n=teethGroup, em=True)
        mc.parent(teethGroup, mainTeethParent)
        mc.parent(LCtrlList, RCtrlList, teethGroup)

        ## --- generating surfaces deformers and connections
        for s, side in enumerate(sides):
            ## --- weighting n0 surface
            n0SKC = mc.skinCluster(
                '%sC_%s_%s_SKN_world' % (side, baseName, stack),
                '%s_%s_%s_SKN_world' % (side, baseName, stack),
                loftSurfsN0[s],
                n='%s_SKC' % loftSurfsN0[s],
                mi=2,
                tsb=True)[0]
            ### --- create skinWeights anime Curve and reskin Surf from that curve
            skinCurveDef = {
                'tangentsVal': [
                    0.0, 47.702933224999114, 53.989547386085576,
                    55.545989790698755
                ],
                'keyCount':
                4,
                'keysValues':
                [0.0, 0.1322238293848932, 0.6123709362161491, 1.0],
                'keysAtFrame': [0.0, 0.404, 0.696, 1.0]
            }
            skinCurve = patchLib.createAnimCurveFromDef(
                skinCurveDef, 'temp_teeth_skinCurve')

            ## --- weighting n1 surfaces and connect n0 outShape to n1 orig
            n1SKC = mc.skinCluster('%s_%s_%s_mid_SKN_world' %
                                   (side, baseName, stack),
                                   holdJnt,
                                   loftSurfsN1[s],
                                   n='%s_SKC' % loftSurfsN1[s],
                                   mi=2,
                                   dr=2,
                                   tsb=True)[0]
            patchLib.sineWeightsOnSurf(loftSurfsN1[s], 'u', False)
            patchLib.basicBPMOnNurbs(SKC=n1SKC, holdJnt=holdJnt)
            n0OutShape = mc.listConnections('%s.outputGeometry' % n0SKC,
                                            sh=True)[0]
            n1ShapeOrig = dagLib.findShapeOrig(loftSurfsN1[s])
            mc.connectAttr('%s.worldSpace[0]' % n0OutShape,
                           '%s.create' % n1ShapeOrig)
            ## --- attache midCtrls to surf n0 with XRivet
            for node in worldNodes:
                splitName = node.split('_')
                if side in splitName:
                    if stack in splitName:
                        if 'mid' in splitName:
                            if 'orig' in splitName:
                                if side == 'L':
                                    offset = getOffsetFromXrivet('x', 'y')
                                elif side == 'R':
                                    offset = getOffsetFromXrivet('-x', '-y')
                                mc.setAttr('%s.rotateOrder' % node, 0)
                                mc.setAttr('%s.jointOrient' % node, 0, 0, 0)
                                midXrivet = xrivetTrOnNurbs(
                                    node,
                                    loftSurfsN0[s],
                                    mainDirection=1,
                                    out='worldSpace[0]',
                                    u=None,
                                    v=None,
                                    offsetOrient=offset,
                                    min=False)
                                #print '%s is beeing xrivetted !!! ' %node
            ## --- create node based final n2 surfaces
            ### --- extract new curves from isoParms
            dnCfsi = mc.createNode('curveFromSurfaceIso',
                                   n='%s_dn_cfsi' % loftSurfsN1[s])
            upCfsi = mc.createNode('curveFromSurfaceIso',
                                   n='%s_up_cfsi' % loftSurfsN1[s])
            mc.setAttr('%s.isoparmDirection' % dnCfsi, 1)
            mc.setAttr('%s.isoparmDirection' % upCfsi, 1)
            mc.setAttr('%s.isoparmValue' % dnCfsi, 0)
            mc.setAttr('%s.isoparmValue' % upCfsi, 1)
            mc.connectAttr('%s.worldSpace[0]' % loftSurfsN1[s],
                           '%s.inputSurface' % dnCfsi)
            mc.connectAttr('%s.worldSpace[0]' % loftSurfsN1[s],
                           '%s.inputSurface' % upCfsi)
            ### --- create sliding from rebuild on curves
            dnRc = mc.createNode('rebuildCurve', n='%s_dn_rc' % loftSurfsN1[s])
            upRc = mc.createNode('rebuildCurve', n='%s_up_rc' % loftSurfsN1[s])
            surfSpans = mc.getAttr('%s.spansV' % loftSurfsN1[s])
            mc.setAttr('%s.spans' % dnRc, surfSpans)
            mc.setAttr('%s.spans' % upRc, surfSpans)
            mc.connectAttr('%s.outputCurve' % dnCfsi, '%s.inputCurve' % dnRc)
            mc.connectAttr('%s.outputCurve' % upCfsi, '%s.inputCurve' % upRc)
            ### --- create finalLoft and connect to surf n2
            loft = mc.createNode('loft', n='%s_loft' % loftSurfsN2[s])
            mc.setAttr('%s.uniform' % loft, 1)
            mc.connectAttr('%s.outputCurve' % dnRc, '%s.inputCurve[0]' % loft)
            mc.connectAttr('%s.outputCurve' % upRc, '%s.inputCurve[1]' % loft)
            mc.connectAttr('%s.outputSurface' % loft,
                           '%s.create' % loftSurfsN2[s])

            ## --- attach teeth on n2 surface
            for control in ctrlLists[s]:
                endXrivet = xrivetTrOnNurbs(control,
                                            loftSurfsN2[s],
                                            mainDirection=1,
                                            out='worldSpace[0]',
                                            u=None,
                                            v=None,
                                            offsetOrient=offset,
                                            min=False)
                mc.setAttr('%s.jointOrient' % control, 0, 0, 0)

            ## --- connect teeth ctrl joits to teeth scales
            endsCtrls = [
                'C_%s_%s_ctrl' % (baseName, stack),
                '%s_%s_%s_ctrl' % (side, baseName, stack)
            ]
            midCtrl = '%s_%s_%s_mid_ctrl' % (side, baseName, stack)

            for i, each in enumerate(ctrlLists[s]):

                # getting position percentage from position on surface
                ## getVpos from joints, it will be used in the 'curveFromSurfaceUV' node
                surfShape = dagLib.getFirstShape(loftSurfsN2[s])
                cpos = mc.createNode('closestPointOnSurface', n='temp_cpos')
                mc.connectAttr('%s.worldSpace[0]' % surfShape,
                               '%s.inputSurface' % cpos)
                pointPos = mc.xform(each, q=True, ws=True, t=True)
                mc.setAttr('%s.inPosition' % cpos, pointPos[0], pointPos[1],
                           pointPos[2])
                paramV = mc.getAttr('%s.parameterV' % cpos)
                mc.delete(cpos)
                ## creates curve from node and get position percentage of joint from it
                tempCrv = mc.curve(d=3,
                                   p=[(0, 0, 0), (1, 1, 1), (2, 2, 2),
                                      (3, 3, 3)])
                tempCfsi = mc.createNode('curveFromSurfaceIso', n='temp_cfsi')
                mc.setAttr('%s.isoparmValue' % tempCfsi, paramV)
                mc.setAttr('%s.isoparmDirection' % tempCfsi, 1)
                mc.connectAttr('%s.worldSpace[0]' % surfShape,
                               '%s.inputSurface' % tempCfsi)
                mc.connectAttr('%s.outputCurve' % tempCfsi,
                               '%s.create' % tempCrv)
                paramOnCrv = curveLib.getClosestPointOnCurve(tempCrv,
                                                             pointPos,
                                                             space='world')[1]
                percent = curveLib.findPercentFromParam(tempCrv, paramOnCrv)
                mc.delete(tempCfsi, tempCrv)
                #print '%s is %s percent' %(each,percent)

                # get soft fallof from percent and sine function
                sideSine = ((math.sin((percent * math.pi) -
                                      (math.pi / 2))) + 1) / 2
                midSine = math.sin(percent * math.pi)
                #print '%s is %s sideSine' %(each,sideSine)

                PMA = mc.createNode('plusMinusAverage',
                                    n='%s_scale_pma' % each)
                centerPMA = mc.createNode('plusMinusAverage',
                                          n='%s_scale_center_pma' % each)
                sidePMA = mc.createNode('plusMinusAverage',
                                        n='%s_scale_center_side_pma' % each)
                midPMA = mc.createNode('plusMinusAverage',
                                       n='%s_scale_center_mid_pma' % each)
                mc.setAttr('%s.operation' % centerPMA, 2)
                mc.setAttr('%s.input3D[1]' % centerPMA, 1, 1, 1)
                mc.setAttr('%s.operation' % sidePMA, 2)
                mc.setAttr('%s.input3D[1]' % sidePMA, 1, 1, 1)
                mc.setAttr('%s.operation' % midPMA, 2)
                mc.setAttr('%s.input3D[1]' % midPMA, 1, 1, 1)
                mc.connectAttr('%s.scale' % endsCtrls[0],
                               '%s.input3D[0]' % centerPMA)
                mc.connectAttr('%s.scale' % endsCtrls[1],
                               '%s.input3D[0]' % sidePMA)
                mc.connectAttr('%s.scale' % midCtrl, '%s.input3D[0]' % midPMA)

                centerMD = mc.createNode('multiplyDivide',
                                         n='%s_center_scale_MD' % each)
                sideMD = mc.createNode('multiplyDivide',
                                       n='%s_side_scale_MD' % each)
                midMD = mc.createNode('multiplyDivide',
                                      n='%s_mid_scale_MD' % each)

                mc.connectAttr('%s.output3D' % centerPMA,
                               '%s.input1' % centerMD)
                mc.connectAttr('%s.output3D' % sidePMA, '%s.input1' % sideMD)
                mc.connectAttr('%s.output3D' % midPMA, '%s.input1' % midMD)

                mc.setAttr('%s.input2' % centerMD, 1 - sideSine, 1 - sideSine,
                           1 - sideSine)
                mc.setAttr('%s.input2' % sideMD, sideSine, sideSine, sideSine)
                mc.setAttr('%s.input2' % midMD, midSine, midSine, midSine)

                mc.setAttr('%s.input2D[0]' % PMA, 1, 1)

                mc.connectAttr('%s.outputZ' % centerMD,
                               '%s.input2D[1].input2Dx' % PMA)
                mc.connectAttr('%s.outputY' % centerMD,
                               '%s.input2D[1].input2Dy' % PMA)

                mc.connectAttr('%s.outputX' % sideMD,
                               '%s.input2D[2].input2Dx' % PMA)
                mc.connectAttr('%s.outputY' % sideMD,
                               '%s.input2D[2].input2Dy' % PMA)

                mc.connectAttr('%s.outputZ' % midMD,
                               '%s.input2D[3].input2Dx' % PMA)
                mc.connectAttr('%s.outputY' % midMD,
                               '%s.input2D[3].input2Dy' % PMA)

                mc.connectAttr('%s.output2Dx' % PMA, '%s.scaleZ' % each)
                mc.connectAttr('%s.output2Dy' % PMA, '%s.scaleY' % each)

        # --- add bpm cluster to top and bottom teeth
        for ctrl in worldTargets:
            splitName = ctrl.split('_')
            if 'gumsBase' in splitName:
                if 'SKN' in splitName:
                    parent = mc.listRelatives(ctrl, p=True)[0]
                    mc.select(cl=True)
                    newClstr = mc.cluster(n='%s_%s_cluster' %
                                          (splitName[0], splitName[1]),
                                          bs=True,
                                          wn=(ctrl, ctrl))[0]
                    mc.connectAttr('%s.parentInverseMatrix[0]' % ctrl,
                                   '%s.bindPreMatrix' % newClstr)

                    if mc.objExists(gumsMesh):
                        clstrSet = mc.listConnections(newClstr,
                                                      type="objectSet")[0]
                        mc.sets(gumsMesh, add=clstrSet)
                    elif mc.objExists(gumsMeshAlt):
                        clstrSet = mc.listConnections(newClstr,
                                                      type="objectSet")[0]
                        mc.sets(gumsMeshAlt, add=clstrSet)

        # --- tweak shapes and colors of base ctrls
        for ctrl in worldTargets:
            splitName = ctrl.split('_')
            if 'gumsBase' in splitName:
                if 'ctrl' in splitName:
                    shapes.create(ctrl,
                                  shape='circleLowHalf',
                                  size=0.2,
                                  scale=[1, 1, 1],
                                  axis='y',
                                  twist=90,
                                  offset=[0, 0, -0.06],
                                  color=[1, 0, 0],
                                  colorDegradeTo=None,
                                  replace=True,
                                  middle=False)
            if 'L' in splitName:
                if 'ctrl' in splitName:
                    if not 'mid' in splitName:
                        shapes.create(ctrl,
                                      shape='pyramid',
                                      size=0.15,
                                      scale=[1, 1, 1],
                                      axis='x',
                                      twist=0,
                                      offset=[0.05, 0, 0],
                                      color=[0, 0, 1],
                                      colorDegradeTo=None,
                                      replace=True,
                                      middle=False)
                    if 'mid' in splitName:
                        shapes.create(ctrl,
                                      shape='pyramid',
                                      size=0.1,
                                      scale=[1, 1, 1],
                                      axis='z',
                                      twist=0,
                                      offset=[0, 0, 0.05],
                                      color=[0.5, 0.5, 1],
                                      colorDegradeTo=None,
                                      replace=True,
                                      middle=False)
            if 'R' in splitName:
                if 'ctrl' in splitName:
                    if not 'mid' in splitName:
                        shapes.create(ctrl,
                                      shape='pyramid',
                                      size=0.15,
                                      scale=[1, 1, 1],
                                      axis='-x',
                                      twist=0,
                                      offset=[-0.05, 0, 0],
                                      color=[1, 0, 0],
                                      colorDegradeTo=None,
                                      replace=True,
                                      middle=False)
                    if 'mid' in splitName:
                        shapes.create(ctrl,
                                      shape='pyramid',
                                      size=0.1,
                                      scale=[1, 1, 1],
                                      axis='z',
                                      twist=0,
                                      offset=[0, 0, 0.05],
                                      color=[1, 0.5, 0.5],
                                      colorDegradeTo=None,
                                      replace=True,
                                      middle=False)
            if 'C' in splitName:
                if 'ctrl' in splitName:
                    shapes.create(ctrl,
                                  shape='pyramid',
                                  size=0.15,
                                  scale=[1, 1, 1],
                                  axis='z',
                                  twist=0,
                                  offset=[0, 0, 0.05],
                                  color=[1, 1, 0],
                                  colorDegradeTo=None,
                                  replace=True,
                                  middle=False)

        # --- cleanup , sets and stuff
        trashNodes = mc.ls('transform?', type='transform')
        mc.delete(trashNodes)
    mc.parent(teethGuidesGrp, 'head_%s' % MainGuideSuff)
    addToSetList = [
        'L_teeth_up_ctrl', 'R_teeth_up_ctrl', 'C_teeth_up_ctrl',
        'L_teeth_dn_ctrl', 'R_teeth_dn_ctrl', 'C_teeth_dn_ctrl',
        'gumsBase_up_ctrl', 'gumsBase_dn_ctrl', 'L_teeth_up_mid_ctrl',
        'L_teeth_dn_mid_ctrl', 'R_teeth_up_mid_ctrl', 'R_teeth_dn_mid_ctrl'
    ]
    if mc.objExists('anim_set'):
        mc.sets(addToSetList, add='anim_set')
Ejemplo n.º 35
0
    except Exception, error:
        pprint.pprint(vars())
        raise ValueError, "Cast fail | {0}".format(error)
    try:
        if not l_pos:
            log.warning("Cast return: %s" % d_castReturn)
            raise StandardError, "createMeshSliceCurve>> Not hits found. Nothing to do"
        if len(l_pos) >= 3:
            if closedCurve:
                l_pos.extend(l_pos[:curveDegree])

                knot_len = len(l_pos) + curveDegree - 1
                curveBuffer = mc.curve(d=curveDegree,
                                       periodic=True,
                                       p=l_pos,
                                       k=[i for i in range(0, knot_len)],
                                       os=True)
                for i, ep in enumerate(
                        mc.ls("{0}.ep[*]".format(curveBuffer), flatten=True)):
                    #Second loop to put ep's where we want them. Necessary only because I couldn't get curve create to work right closed
                    POS.set(ep, l_pos[i])

            else:
                knot_len = len(l_pos) + curveDegree - 1
                curveBuffer = mc.curve(d=curveDegree,
                                       ep=l_pos,
                                       k=[i for i in range(0, knot_len)],
                                       os=True)
            if returnDict:
                return {
Ejemplo n.º 36
0
    def stretchy(self, obj_start, obj_end, name, side, scale_obj_first,
                 scale_obj_second, stretchy_joint, ik_fk_control):
        obj_start_pos = cmds.xform(obj_start, t=True, ws=True, q=True)
        obj_end_pos = cmds.xform(obj_end, t=True, ws=True, q=True)

        stretchy_curve = cmds.curve(d=1,
                                    p=[obj_start_pos, obj_end_pos],
                                    k=(0, 1),
                                    n=name)
        cmds.parent(stretchy_curve, 'extra')
        cmds.skinCluster(obj_start, stretchy_joint, stretchy_curve, tsb=True)

        shape = cmds.listRelatives(stretchy_curve)[0]
        curve_info_node = cmds.shadingNode('curveInfo',
                                           asUtility=True,
                                           n=stretchy_curve + '_' +
                                           'side_curve_info')
        MD_node = cmds.shadingNode('multiplyDivide',
                                   asUtility=True,
                                   n=stretchy_curve + '_' + side + '_MD')
        condition_node = cmds.shadingNode('condition',
                                          asUtility=True,
                                          n=stretchy_curve + '_' + side +
                                          '_condition')

        cmds.connectAttr(shape + '.worldSpace[0]',
                         curve_info_node + '.inputCurve')
        cmds.connectAttr(curve_info_node + '.arcLength', MD_node + '.input1X')
        arc_length = cmds.getAttr(curve_info_node + '.arcLength')
        cmds.setAttr(MD_node + '.input2X', arc_length)
        cmds.setAttr(MD_node + '.operation', 2)

        cmds.connectAttr(curve_info_node + '.arcLength',
                         condition_node + '.firstTerm')
        cmds.setAttr(condition_node + '.secondTerm', arc_length)
        cmds.setAttr(condition_node + '.operation', 4)
        cmds.setAttr(condition_node + '.colorIfTrueR', 1)

        #glooal scale
        global_scale_MD = cmds.shadingNode('multiplyDivide',
                                           asUtility=True,
                                           n='global_scale_MD')
        cmds.setAttr(global_scale_MD + '.operation', 2)
        cmds.connectAttr(MD_node + '.outputX', global_scale_MD + '.input1X')
        cmds.connectAttr('main_control.sx', global_scale_MD + '.input2X')
        cmds.connectAttr(global_scale_MD + '.outputX',
                         condition_node + '.colorIfFalseR')

        # connect condition node for fk mode as well
        condition_fk = cmds.shadingNode('condition',
                                        asUtility=True,
                                        n=stretchy_curve + '_' + side +
                                        '_condition_fk')
        cmds.connectAttr(ik_fk_control + '.ikfk', condition_fk + '.firstTerm')
        cmds.setAttr(condition_fk + '.secondTerm', 0)
        cmds.setAttr(condition_fk + '.operation', 0)

        cmds.connectAttr(condition_node + '.outColorR',
                         condition_fk + '.colorIfTrueR')
        cmds.setAttr(condition_fk + '.colorIfFalseR', 1)

        # set another condition node for stretch on and off
        condition_stretch = cmds.shadingNode('condition',
                                             asUtility=True,
                                             n=stretchy_curve + '_' + side +
                                             'condition_stretch')
        cmds.connectAttr(ik_fk_control + '.stretch',
                         condition_stretch + '.firstTerm')
        cmds.setAttr(condition_stretch + '.secondTerm', 0)
        cmds.setAttr(condition_stretch + '.operation', 1)

        cmds.connectAttr(condition_fk + '.outColorR',
                         condition_stretch + '.colorIfTrueR')
        cmds.setAttr(condition_stretch + '.colorIfFalseR', 1)

        cmds.connectAttr(condition_stretch + '.outColorR',
                         scale_obj_first + '.sx')
        cmds.connectAttr(condition_stretch + '.outColorR',
                         scale_obj_second + '.sx')

        # volume preservation
        MD_volume_node = cmds.shadingNode('multiplyDivide',
                                          asUtility=True,
                                          n="MD_volume_" + side)
        cmds.connectAttr(condition_stretch + '.outColorR',
                         MD_volume_node + '.input1Y')
        cmds.connectAttr(condition_stretch + '.outColorR',
                         MD_volume_node + '.input2Y')

        MD_volume_node_2 = cmds.shadingNode('multiplyDivide',
                                            asUtility=True,
                                            n="MD_volume_" + side)
        cmds.setAttr(MD_volume_node_2 + '.input1Y', 1)
        cmds.setAttr(MD_volume_node_2 + '.operation', 2)
        cmds.connectAttr(MD_volume_node + '.outputY',
                         MD_volume_node_2 + '.input2Y')

        cmds.connectAttr(MD_volume_node_2 + '.outputY',
                         scale_obj_first + '.sy')
        cmds.connectAttr(MD_volume_node_2 + '.outputY',
                         scale_obj_first + '.sz')
        cmds.connectAttr(MD_volume_node_2 + '.outputY',
                         scale_obj_second + '.sy')
        cmds.connectAttr(MD_volume_node_2 + '.outputY',
                         scale_obj_second + '.sz')
Ejemplo n.º 37
0
def createCurveFromPoints(points,
                          degree=3,
                          name='curve',
                          transformType="transform",
                          form="Open"):
    '''
    :param points: Points you wish to use to create a curve
    :type points: list

    :param degree: The degree of the curve you want to create
    :type degree: int

    :param name: the name of the curve.
    :type name: str

    :param form: The form of the curve. i.e (Open, Closed, Periodic). If the form is Closed or 
                    Periodic we will use a nurbs circle.
    :type form: str

    :return: The name of the curve that was created.
    :rtype: str
    '''
    knotList = [0]
    if degree == 1:
        knotList.extend(range(len(points))[1:])
    elif degree == 2:
        knotList.extend(range(len(points) - 1))
        knotList.append(knotList[-1])
    elif degree == 3:
        knotList.append(0)
        knotList.extend(range(len(points) - 2))
        knotList.extend([knotList[-1], knotList[-1]])

    # if the form is closed, we will use a circle to create the control
    if form not in ['Closed', 'Periodic']:
        curve = mc.curve(name=name, p=points, k=knotList, degree=degree)
    else:
        curve = mc.circle(name=name,
                          c=(0, 0, 0),
                          nr=(0, 1, 0),
                          sw=360,
                          r=1,
                          d=degree,
                          ut=0,
                          tol=0.01,
                          s=len(points),
                          ch=False)[0]
        for i, position in enumerate(points):
            mc.setAttr("{}.controlPoints[{}]".format(curve, i), *position)

    # rename all of the shapes that are children of the curve. In this instance, there should
    # only be one.
    for shape in mc.listRelatives(curve, c=True, type="shape"):
        if transformType == "joint":
            trsTypeName = mc.createNode("joint", name="{}_jtn".format(name))
            mc.parent(shape, trsTypeName, r=True, shape=True)
            mc.delete(curve)
            mc.rename(trsTypeName, curve)
            mc.setAttr("{}.drawStyle".format(curve), 2)
        mc.rename(shape, "{}Shape".format(curve))

    return curve
Ejemplo n.º 38
0
def Controllers():
    charName = cmds.textFieldGrp(NameInput, q=True, text=True)
    lengthY = locXYZ[1][1] - locXYZ[0][1]
    lengthZ = abs(locXYZ[0][2]) + abs(locXYZ[1][2])
    legY = locXYZ[0][1] - locXYZ[5][1]
    side = ['_L_', '_R_']
    nb = [1, -1]
    for i in range(len(side)):
        cmds.ikHandle(n='Leg' + side[i] + 'ikHandle',
                      sj=charName + side[i] + 'thigh_Jnt_01',
                      ee=charName + side[i] + 'ankie_Jnt_01')
        cmds.spaceLocator(n='poleVector' + side[i] + 'leg',
                          p=(nb[i] * locXYZ[4][0] - legY * 0.005,
                             locXYZ[4][1] + legY * 0.05, locXYZ[4][2]))
        cmds.xform(centerPivots=1)
        # aims the pole vector of 1 at 2.
        cmds.poleVectorConstraint('poleVector' + side[i] + 'leg',
                                  'Leg' + side[i] + 'ikHandle')
        cmds.move(nb[i] * lengthY * 0.75,
                  -lengthY * 0.75,
                  'poleVector' + side[i] + 'leg',
                  moveXY=True)
        cmds.setAttr('Leg' + side[i] + 'ikHandle.twist', nb[i] * 90)
        cmds.ParentConstraint('controllerfoot', 'poleVector' + side[i] + 'leg')
        cmds.parent('poleVector' + side[i] + 'leg',
                    'Leg' + side[i] + 'ikHandle',
                    relative=True)
        cmds.ikHandle(n='Foot' + side[i] + 'ball_ikHandle',
                      sj=charName + side[i] + 'ankie' + '_Jnt_01',
                      ee=charName + side[i] + 'ball' + '_Jnt_01')
        cmds.ikHandle(n='Foot' + side[i] + 'toe_ikHandle',
                      sj=charName + side[i] + 'ball' + '_Jnt_01',
                      ee=charName + side[i] + 'toe' + '_Jnt_01')
        cmds.group('Leg' + side[i] + 'ikHandle',
                   n='Foot' + side[i] + 'heelPeel')
        #change pivot position
        Xpos = cmds.getAttr('Foot' + side[i] + 'ball_ikHandle.translateX')
        Ypos = cmds.getAttr('Foot' + side[i] + 'ball_ikHandle.translateY')
        Zpos = cmds.getAttr('Foot' + side[i] + 'ball_ikHandle.translateZ')
        cmds.move(Xpos,
                  Ypos,
                  Zpos,
                  'Foot' + side[i] + 'heelPeel.scalePivot',
                  'Foot' + side[i] + 'heelPeel.rotatePivot',
                  absolute=True)
        cmds.group('Foot' + side[i] + 'ball_ikHandle',
                   'Foot' + side[i] + 'toe_ikHandle',
                   n='Foot' + side[i] + 'toeTap')
        cmds.move(Xpos,
                  Ypos,
                  Zpos,
                  'Foot' + side[i] + 'toeTap.scalePivot',
                  'Foot' + side[i] + 'toeTap.rotatePivot',
                  absolute=True)
        cmds.group('Foot' + side[i] + 'ball_ikHandle',
                   'Foot' + side[i] + 'toeTap',
                   n='Foot' + side[i] + 'TipToe')
        cmds.group(n='Foot' + side[i] + '1', em=True)
        cmds.parent('Foot' + side[i] + 'heelPeel',
                    'Foot' + side[i] + 'TipToe',
                    'Foot' + side[i] + '1',
                    relative=True)
        cmds.move(Xpos,
                  Ypos,
                  Zpos,
                  'Foot' + side[i] + '1.scalePivot',
                  'Foot' + side[i] + '1.rotatePivot',
                  absolute=True)
        Xpos = cmds.getAttr('Foot' + side[i] + 'ball_ikHandle.translateX')
        Ypos = cmds.getAttr('Foot' + side[i] + 'ball_ikHandle.translateY')
        Zpos = cmds.getAttr('Foot' + side[i] + 'ball_ikHandle.translateZ')
        CreateCtr('Foot' + side[i] + 'Crl', 'Foot' + side[i] + '1',
                  (Xpos, Ypos, Zpos),
                  (lengthY / 60 * 10, lengthY / 60 * 10, lengthY / 60 * 16),
                  (0, 0, 0))
    #left Arm
    for i in range(len(side)):
        cmds.ikHandle(n='Arm' + str(side[i]) + 'ikHandle',
                      sj=charName + str(side[i]) + 'shoulder' + '_Jnt_02',
                      ee=charName + str(side[i]) + 'wrist' + '_Jnt_01')
        cmds.CreateNURBSCircle()
        cmds.rename('nurbsCircle1', 'Elbow' + str(side[i]) + 'Crl')
        cmds.move(nb[i] * locXYZ[2][0], locXYZ[2][1], locXYZ[2][2] * 30)
        cmds.scale(2, 2, 3)
        cmds.rotate(90, 0, 0)
        cmds.move(nb[i] * locXYZ[2][0],
                  locXYZ[2][1],
                  locXYZ[2][2],
                  'Elbow' + str(side[i]) + 'Crl.scalePivot',
                  'Elbow' + str(side[i]) + 'Crl.rotatePivot',
                  absolute=True)
        cmds.makeIdentity(apply=True)
        cmds.xform(centerPivots=1)
        cmds.poleVectorConstraint('Elbow' + str(side[i]) + 'Crl',
                                  'Arm' + str(side[i]) + 'ikHandle')
        #left Arm controller
        CreateCtr('Arm' + side[i] + 'Crl', 'Arm' + side[i] + 'ikHandle',
                  (nb[i] * locXYZ[3][0], locXYZ[3][1], locXYZ[3][2]),
                  (lengthY / 60 * 5, lengthY / 60 * 5, lengthY / 60 * 8),
                  (0, 0, nb[i] * 30))
    #spline
    cmds.parent(charName + '_R_shoulder_Jnt_01', w=True)
    cmds.parent(charName + '_L_shoulder_Jnt_01', w=True)
    cmds.select(d=True)
    cmds.select(charName + '_spline_Jnt_03')
    cmds.DisconnectJoint(charName + '_spline_Jnt_03')
    cmds.rename(charName + '_spline_Jnt_03', charName + '_neck_Jnt_00')
    cmds.rename('joint1', charName + '_spline_Jnt_03')
    cmds.rename(charName + '_root' + '_Jnt_01', charName + '_spline_Jnt_00')
    cmds.parent(charName + '_R_hip_Jnt_01', w=True)
    cmds.parent(charName + '_L_hip_Jnt_01', w=True)
    cmds.select(d=True)
    cmds.joint(p=(locXYZ[0][0], locXYZ[0][1], locXYZ[0][2]),
               n=charName + '_root' + '_Jnt_01')
    cmds.parent(charName + '_L_hip_Jnt_01')
    cmds.select(charName + '_root' + '_Jnt_01')
    cmds.parent(charName + '_R_hip_Jnt_01')
    cmds.curve(n=charName + '_SplineIK_Crv_01',
               p=[(locXYZ[0][0], locXYZ[0][1], locXYZ[0][2]),
                  (0.0, locXYZ[0][1] + lengthY * 0.43,
                   locXYZ[0][2] + lengthZ * 0.43),
                  (0.0, locXYZ[0][1] + lengthY * 0.8,
                   locXYZ[0][2] + lengthZ * 0.18),
                  (locXYZ[1][0], locXYZ[1][1], locXYZ[1][2])])
    cmds.ikHandle(n=charName + 'SplineIK_01',
                  sj=charName + '_spline_Jnt_00',
                  ee=charName + '_spline_Jnt_03',
                  curve=charName + '_SplineIK_Crv_01',
                  sol='ikSplineSolver',
                  createCurve=False,
                  parentCurve=False)
    for i in range(4):
        cmds.select(charName + '_SplineIK_Crv_01' + '.cv[' + str(i) + ']')
        cmds.cluster(n='cluster_' + str(i + 1))
    CreateCtr(charName + '_Spline_Ctrl_01', 'cluster_1Handle',
              (0, locXYZ[0][1] * 1.05, 0),
              (lengthY / 60 * 25, lengthY / 60 * 25, lengthY / 60 * 25),
              (0, 0, 0))
    cmds.parentConstraint(charName + '_Spline_Ctrl_01',
                          charName + '_root_Jnt_01',
                          maintainOffset=True)
    CreateCtr(charName + '_Chest_Ctrl_01', 'cluster_4Handle',
              (0, locXYZ[1][1], 0),
              (lengthY / 60 * 25, lengthY / 60 * 25, lengthY / 60 * 25),
              (0, 0, 0))
    for i in range(len(side)):
        cmds.parentConstraint(charName + '_Chest_Ctrl_01',
                              charName + side[i] + 'shoulder_Jnt_01',
                              maintainOffset=True)
        cmds.parent('Arm' + side[i] + 'Crl_grp', charName + '_Chest_Ctrl_01')
        cmds.parent('Elbow' + side[i] + 'Crl', charName + '_Chest_Ctrl_01')
    CreateCtr(charName + '_Chest_Ctrl_02', 'cluster_2Handle',
              (0, (locXYZ[0][1] + locXYZ[1][1]) / 2, 0),
              (lengthY / 60 * 20, lengthY / 60 * 20, lengthY / 60 * 20),
              (0, 0, 0))
    cmds.parentConstraint(charName + '_Chest_Ctrl_01',
                          charName + '_neck_Jnt_00',
                          maintainOffset=True,
                          w=1)
    cmds.parentConstraint(charName + '_Chest_Ctrl_01',
                          'cluster_3Handle',
                          maintainOffset=True,
                          weight=0.5)
    cmds.parentConstraint(charName + '_Chest_Ctrl_01',
                          charName + '_Chest_Ctrl_02_grp',
                          maintainOffset=True,
                          weight=0.5)
    cmds.parentConstraint(charName + '_Spline_Ctrl_01',
                          charName + '_Chest_Ctrl_02_grp',
                          maintainOffset=True,
                          weight=0.5)
    cmds.CreateNURBSCircle()
    cmds.rename('nurbsCircle1', charName + '_Hip_Ctrl_01')
    cmds.move(0, locXYZ[0][1], 0)
    cmds.scale(lengthY / 60 * 30, lengthY / 60 * 30, lengthY / 60 * 30)
    cmds.makeIdentity(apply=True)
    cmds.parentConstraint(charName + '_Hip_Ctrl_01',
                          charName + '_Spline_Ctrl_01',
                          maintainOffset=True,
                          weight=0.5)
    cmds.parentConstraint(charName + '_Hip_Ctrl_01',
                          charName + '_Chest_Ctrl_01',
                          maintainOffset=True,
                          weight=0.5)
    #clean
    for i in range(len(side)):
        cmds.parent(charName + side[i] + 'shoulder_Jnt_01',
                    charName + '_Joints_01')
        cmds.parent(charName + '_Chest_Ctrl_0' + str(i + 1) + '_grp',
                    charName + '_Controls_01')
        cmds.parent('Foot' + side[i] + '1', charName + '_Controls_01')
        cmds.parent('Foot' + side[i] + 'Crl_grp', charName + '_Controls_01')
        cmds.parent('Arm' + side[i] + 'ikHandle', charName + '_ikHandle_01')
        cmds.parent('cluster_' + str(i + 1) + 'Handle',
                    charName + '_ikHandle_01')
        cmds.parent('cluster_' + str(i + 3) + 'Handle',
                    charName + '_ikHandle_01')
    cmds.parent(charName + 'SplineIK_01', charName + '_ikHandle_01')
    cmds.parent(charName + '_SplineIK_Crv_01', charName + '_ikHandle_01')
    cmds.parent(charName + '_neck_Jnt_00', charName + '_Joints_01')
    cmds.parent(charName + '_root_Jnt_01', charName + '_Joints_01')
    cmds.parent(charName + '_spline_Jnt_00', charName + '_Joints_01')
    cmds.parent(charName + '_Spline_Ctrl_01_grp', charName + '_Controls_01')
    cmds.parent(charName + '_Hip_Ctrl_01', charName + '_Controls_01')
Ejemplo n.º 39
0
    def make_ik_joint_chain(self, side, thigh, knee, knee_end, ankle, toe,
                            toe_end, heel, color):
        # make ik handle and control
        ik_leg = cmds.ikHandle(n='ik_leg_' + side,
                               sj=thigh,
                               ee=knee_end,
                               sol='ikRPsolver')
        c = custom_controls.create_custom_controls()
        self.leg_control = c.cube_curve('ANIM_leg_' + side)
        self.override_colors(self.leg_control, color)
        cmds.setAttr(self.leg_control + '.lineWidth', 2)
        cmds.xform(self.leg_control, cp=True)
        self.leg_control_grp = cmds.group(self.leg_control,
                                          n='grp_ANIM_leg_' + side)
        cmds.matchTransform(self.leg_control_grp, ik_leg, pos=True)
        self.controls.append(self.leg_control_grp)
        cmds.parent(self.leg_control_grp, 'controls')

        #create a pole vector
        self.create_pole_vector(side, thigh, knee, knee_end, 'leg',
                                'ik_leg_' + side, color)

        #create toe roll joint
        jDrv_foot = cmds.duplicate(toe, name='jDrv_bind_foot_' + side)
        temp = cmds.pickWalk(jDrv_foot[0], d='down')
        cmds.delete(temp)
        cmds.parent(jDrv_foot, toe)

        # creating locators
        #
        loc_ankle = cmds.spaceLocator(n='locDrv_ankle_' + side)[0]
        loc_ankle_grp = cmds.group(loc_ankle,
                                   n='locDrv_ankle_' + side + '_Null')
        cmds.matchTransform(loc_ankle_grp, ankle)

        ##
        loc_toe_grp = cmds.duplicate(loc_ankle_grp,
                                     n='locDrv_foot_' + side + '_Null')[0]
        temp = cmds.pickWalk(loc_toe_grp, d='down')
        loc_toe = cmds.rename(temp, 'locDrv_foot_' + side)
        cmds.matchTransform(loc_toe_grp, toe, pos=True)
        cmds.matchTransform(loc_toe_grp, ankle, rot=True)

        ###
        loc_toe_end_grp = cmds.duplicate(loc_toe_grp,
                                         n='locDrv_toe_' + side + '_Null')[0]
        temp = cmds.pickWalk(loc_toe_end_grp, d='down')
        loc_toe_end = cmds.rename(temp, 'locDrv_toe_' + side)
        cmds.matchTransform(loc_toe_end_grp, toe_end)

        ####
        loc_heel = cmds.spaceLocator(n='locDrv_heel_' + side)[0]
        loc_heel_grp = cmds.group(loc_heel, n='locDrv_heel_' + side + '_Null')
        cmds.matchTransform(loc_heel_grp, heel)

        ##parenting
        cmds.parent(loc_ankle, loc_toe)
        cmds.parent(loc_toe_grp, loc_toe_end)
        cmds.parent(loc_toe_end_grp, loc_heel)
        cmds.delete(loc_ankle_grp)
        cmds.parent(loc_heel_grp, self.leg_control)

        ##constraints
        cmds.pointConstraint(loc_ankle, 'ik_leg_' + side)
        cmds.orientConstraint(loc_toe, ankle, mo=True)
        cmds.orientConstraint(loc_toe_end, toe, mo=True)

        #creating controls for foot system
        toe_Ctl = cmds.curve(n='ANIM_toe_' + side,
                             d=1,
                             p=[(-1, 0, -1), (1, 0, -1), (1, 0, 1), (-1, 0, 1),
                                (-1, 0, -1)],
                             k=[0, 1, 2, 3, 4])
        toe_end_Ctl = cmds.curve(n='ANIM_toe_end_' + side,
                                 d=1,
                                 p=[(0, 1, 1), (0, 1, -1), (0, -1, -1),
                                    (0, -1, 1), (0, 1, 1)],
                                 k=[0, 1, 2, 3, 4])
        heel_Ctl = cmds.curve(n='ANIM_heel_' + side,
                              d=1,
                              p=[(-1, 1, 0), (1, 1, 0), (1, -1, 0),
                                 (-1, -1, 0), (-1, 1, 0)],
                              k=[0, 1, 2, 3, 4])

        self.controls.extend((toe_Ctl, toe_end_Ctl, heel_Ctl))
        self.foot_controls = [toe_Ctl, toe_end_Ctl, heel_Ctl]

        grp_foot_controls = self.group_foot_controls(self.foot_controls)
        grp_grp_foot_controls = self.group_foot_controls(grp_foot_controls)

        cmds.parent('ANIM_heel_' + side + '_grp_grp', loc_heel_grp)
        cmds.parent('ANIM_toe_' + side + '_grp_grp', loc_toe_grp)
        cmds.parent('ANIM_toe_end_' + side + '_grp_grp', loc_toe_end_grp)
        self.alignObjs(grp_grp_foot_controls)

        # orientConstraint
        cmds.orientConstraint(toe_Ctl, loc_toe, mo=True)
        cmds.orientConstraint(heel_Ctl, loc_heel)
        cmds.orientConstraint(toe_end_Ctl, loc_toe_end)

        # create an attribute for toe roll and foot roll
        cmds.select(self.leg_control)
        cmds.addAttr(shortName='tr',
                     longName='toe_roll',
                     defaultValue=0,
                     k=True)
        cmds.addAttr(shortName='fr',
                     longName='foot_roll',
                     defaultValue=0,
                     minValue=-10,
                     maxValue=10,
                     k=True)
        cmds.connectAttr(self.leg_control + '.toe_roll', jDrv_foot[0] + '.rz')

        cmds.setDrivenKeyframe('ANIM_toe_end_' + side + '_grp.rz',
                               cd=self.leg_control + '.fr',
                               v=0,
                               dv=0)
        cmds.setDrivenKeyframe('ANIM_toe_' + side + '_grp.rz',
                               cd=self.leg_control + '.fr',
                               v=0,
                               dv=0)
        cmds.setDrivenKeyframe('ANIM_heel_' + side + '_grp.rx',
                               cd=self.leg_control + '.fr',
                               v=0,
                               dv=0)

        cmds.setDrivenKeyframe('ANIM_toe_end_' + side + '_grp.rz',
                               cd=self.leg_control + '.fr',
                               v=0,
                               dv=4)
        cmds.setDrivenKeyframe('ANIM_toe_' + side + '_grp.rz',
                               cd=self.leg_control + '.fr',
                               v=-45,
                               dv=5)
        cmds.setDrivenKeyframe('ANIM_toe_end_' + side + '_grp.rz',
                               cd=self.leg_control + '.fr',
                               v=-70,
                               dv=10)
        cmds.setDrivenKeyframe('ANIM_toe_' + side + '_grp.rz',
                               cd=self.leg_control + '.fr',
                               v=40,
                               dv=10)

        cmds.setDrivenKeyframe('ANIM_toe_end_' + side + '_grp.rz',
                               cd=self.leg_control + '.fr',
                               v=0,
                               dv=-10)
        cmds.setDrivenKeyframe('ANIM_toe_' + side + '_grp.rz',
                               cd=self.leg_control + '.fr',
                               v=-0,
                               dv=-10)
        cmds.setDrivenKeyframe('ANIM_heel_' + side + '_grp.rx',
                               cd=self.leg_control + '.fr',
                               v=-40,
                               dv=-10)

        # hide locators
        self.hideShape([loc_toe_end, loc_toe, loc_heel, loc_ankle])
        cmds.parent('ik_leg_' + side, 'IKs')

        condition = cmds.shadingNode('condition',
                                     asUtility=True,
                                     n='condition_node' +
                                     self.leg_control_grp[0])
        cmds.setAttr(condition + '.secondTerm', 1)
        cmds.connectAttr(self.ik_fk_control + '.ikfk',
                         condition + '.firstTerm')
        cmds.connectAttr(condition + '.outColorR',
                         self.leg_control_grp + '.visibility')
        cmds.connectAttr(condition + '.outColorR',
                         'PV_ik_leg_' + side + '_Null' + '.visibility')

        for obj in self.foot_controls:
            cmds.connectAttr(condition + '.outColorR', obj + '.visibility')

        #point Constraint ankle
        cmds.pointConstraint('ik_leg_' + side, ankle, mo=True)
        cmds.pointConstraint(knee_end, ankle, mo=True)

        #make a joint for stretching
        self.stretchy_joint = cmds.joint()
        cmds.setAttr(self.stretchy_joint + '.drawStyle', 2)
        cmds.matchTransform(self.stretchy_joint, self.leg_control)
        cmds.parent(self.stretchy_joint, self.leg_control)
Ejemplo n.º 40
0
import maya.cmds as cmds
Ejemplo n.º 41
0
def buildRibbonSurface(locators,
                       name='',
                       close=False,
                       vector=[1, 0, 0],
                       width=10):

    lineCrvs = []

    for locator in locators:

        pos = cmds.xform(locator, q=True, ws=True, rp=True)

        posVector = om.MVector(pos[0], pos[1], pos[2])

        inverseWidth = width * -1

        translateVectorForward = om.MVector(vector[0] * width,
                                            vector[1] * width,
                                            vector[2] * width)
        translateVectorBackward = om.MVector((vector[0] * inverseWidth),
                                             (vector[1] * inverseWidth),
                                             (vector[2] * inverseWidth))

        startTransformationMatrix = om.MTransformationMatrix()
        startTransformationMatrix.setTranslation(posVector, om.MSpace.kWorld)
        startTransformationMatrix.addTranslation(translateVectorForward,
                                                 om.MSpace.kObject)
        startPosVector = startTransformationMatrix.getTranslation(
            om.MSpace.kWorld)

        endTransformationMatrix = om.MTransformationMatrix()
        endTransformationMatrix.setTranslation(posVector, om.MSpace.kWorld)
        endTransformationMatrix.addTranslation(translateVectorBackward,
                                               om.MSpace.kObject)
        endPosVector = endTransformationMatrix.getTranslation(om.MSpace.kWorld)

        startPos = [startPosVector.x, startPosVector.y, startPosVector.z]
        endPos = [endPosVector.x, endPosVector.y, endPosVector.z]
        lineCrv = cmds.curve(d=1, p=(startPos, endPos))
        lineCrvs.append(lineCrv)

    ribbonOrig = cmds.loft(lineCrvs,
                           ch=1,
                           u=1,
                           c=close,
                           ar=1,
                           d=3,
                           ss=1,
                           rn=0,
                           po=0,
                           rsn=True,
                           n='%s_Surface' % name)
    ribbonRebuild = cmds.rebuildSurface(ribbonOrig[0],
                                        ch=1,
                                        rpo=1,
                                        rt=0,
                                        end=1,
                                        kr=0,
                                        kcp=1,
                                        kc=0,
                                        su=8,
                                        du=1,
                                        sv=2,
                                        dv=3,
                                        tol=0.01,
                                        fr=0,
                                        dir=2)

    ribbon = []

    shape = cmds.listRelatives(ribbonRebuild[0], type='shape')[0]
    ribbon.append(ribbonRebuild[0])
    ribbon.append(shape)
    cmds.delete(ribbonOrig[0], ch=True)
    cmds.delete(lineCrvs)
    return ribbon
Ejemplo n.º 42
0
 def TDTransform(self, name):
     self.attr = [
         ".tx", ".ty", ".tz", ".rx", ".ry", ".rz", ".sx", ".sy", ".sz", ".v"
     ]
     self.arrows = []
     self.circleHelper = cmds.circle(c=[0, 0, 0],
                                     nr=[0, 1, 0],
                                     sw=360,
                                     r=1.5,
                                     d=3,
                                     ut=0,
                                     tol=0.01,
                                     s=8,
                                     ch=0,
                                     n=name)
     self.arrows1 = cmds.curve(d=1,
                               n="helperArrow1",
                               p=[(1.75625, 0, 0.115973),
                                  (1.75625, 0, -0.170979),
                                  (2.114939, 0, -0.170979),
                                  (2.114939, 0, -0.314454),
                                  (2.473628, 0, -0.0275029),
                                  (2.114939, 0, 0.259448),
                                  (2.114939, 0, 0.115973),
                                  (1.75625, 0, 0.115973)])
     self.arrows2 = cmds.curve(d=1,
                               n="helperArrow2",
                               p=[(0.143476, 0, -1.783753),
                                  (0.143476, 0, -2.142442),
                                  (0.286951, 0, -2.142442),
                                  (0, 0, -2.501131),
                                  (-0.286951, 0, -2.142442),
                                  (-0.143476, 0, -2.142442),
                                  (-0.143476, 0, -1.783753),
                                  (0.143476, 0, -1.783753)])
     self.arrows3 = cmds.curve(d=1,
                               n="helperArrow3",
                               p=[(-1.75625, 0, -0.170979),
                                  (-2.114939, 0, -0.170979),
                                  (-2.114939, 0, -0.314454),
                                  (-2.473628, 0, -0.0275029),
                                  (-2.114939, 0, 0.259448),
                                  (-2.114939, 0, 0.115973),
                                  (-1.75625, 0, 0.115973),
                                  (-1.75625, 0, -0.170979)])
     self.arrows4 = cmds.curve(d=1,
                               n="helperArrow4",
                               p=[(-0.143476, 0, 1.728747),
                                  (-0.143476, 0, 2.087436),
                                  (-0.286951, 0, 2.087436),
                                  (0, 0, 2.446125), (0.286951, 0, 2.087436),
                                  (0.143476, 0, 2.087436),
                                  (0.143476, 0, 1.728747),
                                  (-0.143476, 0, 1.728747)])
     self.arrowGRP = cmds.group(self.arrows1,
                                self.arrows2,
                                self.arrows3,
                                self.arrows4,
                                n="helperArrows_GP",
                                p="%s" % self.circleHelper[0])
     cmds.setAttr(self.arrowGRP + ".template", 1)
     """
     for attrs in self.attr:
         cmds.setAttr(self.arrowGRP+attrs,k=False,cb=False)
     """
     cmds.select(self.circleHelper)
     return self.circleHelper[0]
Ejemplo n.º 43
0
 def TDDirSingleNormal(self, name):
     return cmds.curve(d=1,
                       n=name,
                       p=[(0, 0, -1.32), (-0.99, 0, 0), (-0.33, 0, 0),
                          (-0.33, 0, 0.99), (0.33, 0, 0.99), (0.33, 0, 0),
                          (0.99, 0, 0), (0, 0, -1.32)])
import maya.cmds as cmds
import math
import random as rnd

cmds.file(f=True, new=True)
# clear up the scene
cmds.select(all=True)
cmds.delete()
# Create a set of simple objects for the motion path animation

# create a path, e,g, a curve
path = cmds.curve(d=3,
                  p=[(-10, 0, 0), (-6, 0, 10), (-3, 0, -10), (10, 0, 0)],
                  k=[0, 0, 0, 1, 1, 1])

# create an object, e.g. a sphere
leader = cmds.sphere()
cmds.group(leader[0], n='group1')

for i in range(2, 10):
    follower = cmds.instance(leader[0], smartTransform=True)
    x = rnd.randint(1, 3)
    y = rnd.randint(1, 3)
    z = rnd.randint(1, 3)
    cmds.select(cl=True)
    cmds.select(follower[0])
    print follower[0]
    cmds.move(x, y, z)
    cmds.scale(0.1, 0.1, 0.1)

cmds.pathAnimation('group1', stu=0, etu=30, follow=True, c=path)
def ControllerForAttr(Attr, Type, PosDir, nameIndex, List):
    if len(List):

        controllerToUse = List[nameIndex - 1]
        print "using selected controller:", controllerToUse
        CtrlCurrentLimit = mc.transformLimits(controllerToUse, q=True, ty=True)
        if PosDir:
            mc.transformLimits(controllerToUse,
                               ety=(1, 1),
                               ty=(CtrlCurrentLimit[0], 1))
            mc.connectAttr(controllerToUse + ".Pos_Y", Attr)
        else:
            mc.transformLimits(controllerToUse,
                               ety=(1, 1),
                               ty=(-1, CtrlCurrentLimit[1]))
            mc.connectAttr(controllerToUse + ".Neg_Y", Attr)
        #figure the new limits:
        newLimit = mc.transformLimits(controllerToUse, q=True, ty=True)
        range = controllerToUse + "_range"
        if mc.objExists(range):
            minLimitCV = range + ".cv[0]"
            maxLimitCV = range + ".cv[1]"
            mc.xform(minLimitCV, ws=False, t=(0, newLimit[0], 0))
            mc.xform(maxLimitCV, ws=False, t=(0, newLimit[1], 0))

    else:
        controllerNameBase = mc.textFieldGrp("ControllerTextFieldID",
                                             q=True,
                                             tx=True)
        controllerName = "ac_" + controllerNameBase + "_" + str(nameIndex)
        mc.circle(n=controllerName, nr=(0, 0, 1), ch=False, r=0.15)

        #hide un nessary controlls
        mc.setAttr(controllerName + ".tx",
                   lock=True,
                   keyable=False,
                   channelBox=False)
        mc.setAttr(controllerName + ".tz",
                   lock=True,
                   keyable=False,
                   channelBox=False)
        mc.setAttr(controllerName + ".sx",
                   lock=True,
                   keyable=False,
                   channelBox=False)
        mc.setAttr(controllerName + ".sy",
                   lock=True,
                   keyable=False,
                   channelBox=False)
        mc.setAttr(controllerName + ".sz",
                   lock=True,
                   keyable=False,
                   channelBox=False)
        mc.setAttr(controllerName + ".rx",
                   lock=True,
                   keyable=False,
                   channelBox=False)
        mc.setAttr(controllerName + ".ry",
                   lock=True,
                   keyable=False,
                   channelBox=False)
        mc.setAttr(controllerName + ".rz",
                   lock=True,
                   keyable=False,
                   channelBox=False)
        mc.setAttr(controllerName + ".v",
                   lock=True,
                   keyable=False,
                   channelBox=False)

        #create clamp nodes to extract positive and nagative value:
        clampPosNode = mc.createNode('clamp', n=controllerName + "clamp_Pos")
        clampNegNode = mc.createNode('clamp', n=controllerName + "clamp_Neg")
        NegReverseMD = mc.createNode('multiplyDivide',
                                     n=controllerName + "_NegReverseMD")

        mc.setAttr(clampPosNode + ".maxG", 1)
        mc.setAttr(clampNegNode + ".minG", -1)
        mc.setAttr(NegReverseMD + ".input2X", -1)
        mc.setAttr(NegReverseMD + ".input2Y", -1)
        mc.setAttr(NegReverseMD + ".input2Z", -1)
        mc.connectAttr(controllerName + ".translate", clampPosNode + ".input")
        mc.connectAttr(controllerName + ".translate", clampNegNode + ".input")
        mc.connectAttr(clampNegNode + ".output", NegReverseMD + ".input1")

        #add attribute to controller for furture useage:
        mc.addAttr(controllerName, ln="Pos_Y", at="double")
        mc.addAttr(controllerName, ln="Neg_Y", at="double")

        #connect clamp result to new attribute:
        mc.connectAttr(clampPosNode + ".outputG", controllerName + ".Pos_Y")
        mc.connectAttr(NegReverseMD + ".output.outputY",
                       controllerName + ".Neg_Y")

        #set Limitations:
        if PosDir:
            mc.transformLimits(controllerName, ety=(1, 1), ty=(0, 1))
            mc.connectAttr(controllerName + ".Pos_Y", Attr)
        else:
            mc.transformLimits(controllerName, ety=(1, 1), ty=(-1, 0))
            mc.connectAttr(controllerName + ".Neg_Y", Attr)

        #create nessary hierachy:
        controllerGrpName = controllerName + "_grp"
        mc.group(controllerName, n=controllerGrpName)

        if Type == "Slider":
            rangeCurve = controllerName + "_range"
            mc.curve(d=1, p=[(0, 0, 0), (0, 1, 0)], n=rangeCurve)
            mc.setAttr(rangeCurve + ".template", 1)
            mc.parent(rangeCurve, controllerGrpName)

        mc.setAttr(controllerGrpName + ".tx", nameIndex / 2.0)
Ejemplo n.º 46
0
    def __init__(self, name, jointNum=3, driverJointNum=2, primaryAxis="X"):
        mt.Rivet.__init__(self, mo=True)
        self.name = name
        self.jointNum = jointNum
        self.driverJointNum = driverJointNum
        self.primaryAxis = primaryAxis
        self.spans = ((jointNum - 1) * (driverJointNum - 1))
        self.ribbon = []
        self.lenCurves = []
        self.joints = []
        self.driverJoints = []
        self.deformers = []
        self.proxies = []

        if jointNum < 3 or driverJointNum < 2:
            return mc.error("Rig needs a minimum of 2 drivers and 3 joints")

        ptPosList = []
        attrs = [POS_ATTR, SCL_ATTR]
        prxyGrp = mc.createNode("transform", n="{}_prxy{}".format(name, GRP))
        prevPrxy = "{}_base_prxy".format(name)
        for i in range(driverJointNum):
            # Create a set of locators to be used as proxies for your ribbon's driver joints
            # Set position based on rig's primary axis
            if primaryAxis == "Z":
                ptPos = (0, 0, i * 10)
            elif primaryAxis == "Y":
                ptPos = (0, i * 10, 0)
            else:
                ptPos = (i * 10, 0, 0)
            ptPosList.append(ptPos)

            # Name the proxy based on its order in the chain
            if i == 0:
                prxy = "{}_base_prxy".format(name)
            elif i == driverJointNum - 1:
                prxy = "{}_tip_prxy".format(name)
            elif i >= 1 and driverJointNum >= 4:
                prxy = "{}_mid{}_prxy".format(name, str(i).zfill(2))
            else:
                prxy = "{}_mid_prxy".format(name)

            # Create the locator
            mc.spaceLocator(n=prxy)
            mc.setAttr("{}.translate{}".format(prxy, primaryAxis), i * 10)

            # Lock attributes you don't want to be changed so the rig is buit properly
            if i == 0:
                # As the root, the first proxy will have the freest range of motion
                for v in VECTORS:
                    mc.setAttr("{}.scale{}".format(prxy, v),
                               lock=True, keyable=False, channelBox=False)
                # Parent to the appropriate group
                mc.parent(prxy, prxyGrp)

            if i > 0:
                # Child proxies will have a more limited range of movement
                for attr in attrs:
                    for v in VECTORS:
                        if attr == SCL_ATTR or v != primaryAxis:
                            mc.setAttr("{}{}{}".format(prxy, attr, v),
                                       lock=True, keyable=False, channelBox=False)
                # Parent to the appropriate group
                mc.parent(prxy, prevPrxy)

            self.proxies.append(prxy)
            prevPrxy = prxy

        # We also want to create a curve whose arclen will create the width of your ribbon
        self.proxieCrv = mc.curve(
            d=1, p=ptPosList, n="{}_prxyCrv".format(name))
        mc.parent(self.proxieCrv, prxyGrp)
        mc.setAttr("{}.inheritsTransform".format(self.proxieCrv))
        for i, prxy in enumerate(self.proxies):
            clstr = mc.cluster("{}.cv[{}]".format(self.proxieCrv, i))[1]
            mc.setAttr("{}.visibility".format(clstr), 0)
            mc.parent(clstr, prxy)
Ejemplo n.º 47
0
def arc_tool(cv_count=30):
    ''' Arc Visualizer Tool

    Args:
        cv_count(int): the number of frames that the user would like to
            visualize.  The curve will show half way forward and backward on a
            curve the arc of the movement
    '''
    global sel
    sel = cmds.ls(selection=True)[0]

    if not sel:
        cmds.warning('Could not find selection!')
        return

    starting_time = cmds.currentTime(query=True)
    backward_timeline = starting_time - (cv_count / 2)
    forward_timeline = starting_time + (cv_count / 2)

    position_list = []

    for i in range(cv_count):
        point = [i, 0, 0]
        position_list.append(point)

    points = tuple(position_list)

    global path_curve, position_frame_values_list, time_slider_max
    path_curve = cmds.curve(point=points, degree=1, name='arc_CRV')
    cmds.setAttr(path_curve + '.dispCV', 1)

    # get list of attributes that are keyed
    # query the all values of the attribute at each frame
    # append all values into a list
    # assign these values based on cmds.currentTime() to cv's on a curve

    position_frame_values_list = []

    time_slider_min = cmds.playbackOptions(query=True, minTime=True)
    time_slider_max = cmds.playbackOptions(query=True, maxTime=True)
    time_slider_range = time_slider_max - time_slider_min + 1

    frame_displacement = 1
    i = 0
    for frame in range(int(time_slider_range)):
        cmds.currentTime(time_slider_min + i)
        trans = cmds.xform(sel, query=True, translation=True, ws=True)
        position_frame_values_list.append(trans)
        frame_displacement = frame_displacement + 1
        i = i + 1

    frame_range = []

    a = (cv_count / 2)
    while backward_timeline <= forward_timeline:
        list_frame = starting_time - a
        frame_range.append(list_frame)
        backward_timeline = backward_timeline + 1
        a = a - 1

    for cv in range(cv_count):
        # in list frame_range, we have the frame number to assign to the cv
        # then pulls from the position_frame_values_list to get the values for
        # the object at that frame
        list_index_value = int(frame_range[cv] + 1)
        if list_index_value >= time_slider_max:
            cv_position = position_frame_values_list[int(time_slider_max - 1)]
        else:
            cv_position = position_frame_values_list[list_index_value]
        cmds.xform(path_curve + '.cv[' + str(cv) + ']',
                   translation=(cv_position[0], cv_position[1],
                                cv_position[2]),
                   worldSpace=True)

    cmds.currentTime(starting_time)

    # setup the refresh condition
    global time_change, new_cv_count
    new_cv_count = cv_count

    time_change = cmds.scriptJob(
        event=['timeChanged', 'cv_refresh(path_curve, new_cv_count)'])
    curve_list.append(path_curve)
Ejemplo n.º 48
0
def createShape(prefix='', scale=1.0):

    List = []
    List.append(
        cmds.curve(n=prefix,
                   p=[(0.5698271508338371, 4.091121663662989e-09,
                       -2.132883735050939e-05),
                      (0.4208952391731131, 0.1488873944517639,
                       -1.5755096100633637e-05),
                      (0.2720931419242101, 4.073556049855043e-05,
                       -1.0184545420344193e-05),
                      (0.4209398007112384, -0.1487613617926744,
                       -1.5755096101521815e-05),
                      (0.5698271508338371, 4.091121663662989e-09,
                       -2.132883735050939e-05),
                      (0.42091194939155674, 6.301549556786412e-05,
                       -0.1488401347819135),
                      (0.2720931419242101, 4.073556049855043e-05,
                       -1.0184545420344193e-05),
                      (0.42092309049279564, 6.301716352297149e-05,
                       0.14880862458971134),
                      (0.5698271508338371, 4.091121663662989e-09,
                       -2.132883735050939e-05),
                      (0.4208952391731131, 0.1488873944517639,
                       -1.5755096100633637e-05),
                      (0.2720931419242101, 4.073556049855043e-05,
                       -1.0184545420344193e-05),
                      (-0.2720931291529265, -0.0001260413294232876,
                       1.0184545417679658e-05),
                      (-0.4209971894939688, -6.30282570215357e-05,
                       0.14884013797247952),
                      (-0.5698271380625544, -8.530986004595675e-05,
                       2.1328837348733032e-05),
                      (-0.4210083305952077, -6.302992497664306e-05,
                       -0.1488086213991462),
                      (-0.2720931291529265, -0.0001260413294232876,
                       1.0184545417679658e-05),
                      (-0.42085456057731463, 0.14876116408473417,
                       1.5751905531047328e-05),
                      (-0.5698271380625544, -8.530986004595675e-05,
                       2.1328837348733032e-05),
                      (-0.4209804792755252, -0.14888740721321847,
                       1.575828666666723e-05),
                      (-0.2720931291529265, -0.0001260413294232876,
                       1.0184545417679658e-05),
                      (-0.2720931291529265, -0.0001260413294232876,
                       1.0184545417679658e-05),
                      (0.0, -1.3322676295501878e-15, 0.0),
                      (-1.1141101238898443e-05, -1.6679564396326896e-09,
                       0.2721144031802565),
                      (0.00014271626145045957, 0.14882419235483146,
                       0.42093877648166433),
                      (0.0, -1.3322676295501878e-15, 0.569763162551884),
                      (1.671021844362741e-05, -0.14882437895619827,
                       0.42093878286606934),
                      (-1.1141101238898443e-05, -1.6679564396326896e-09,
                       0.2721144031802565),
                      (-0.14882987953462568, -2.2281592690021057e-05,
                       0.4209443534141677),
                      (0.0, -1.3322676295501878e-15, 0.569763162551884),
                      (0.14890412937122033, -6.29878057401001e-05,
                       0.42093320912223664),
                      (-1.1141101238898443e-05, -1.6679564396326896e-09,
                       0.2721144031802565),
                      (-3.151178319171777e-05, -4.717688018018862e-09,
                       -0.2721144015837451),
                      (-5.935678879254169e-05, 0.14882437257149927,
                       -0.4209387812697942),
                      (-4.265288443061621e-05, -6.385641793116292e-09,
                       -0.5697631609553717),
                      (-1.4801564748090357e-05, -0.1488243836738845,
                       -0.42093878126955797),
                      (-3.151178319171777e-05, -4.717688018018862e-09,
                       -0.2721144015837451),
                      (-0.1488613913178174, -2.2286310378039076e-05,
                       -0.4209332107214614),
                      (-4.265288443061621e-05, -6.385641793116292e-09,
                       -0.5697631609553717),
                      (0.1488726175880286, -6.299252342767403e-05,
                       -0.42094435501339156),
                      (-3.151178319171777e-05, -4.717688018018862e-09,
                       -0.2721144015837451)],
                   per=False,
                   d=1,
                   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
                   ]))
    for x in range(len(List) - 1):
        cmds.makeIdentity(List[x + 1], apply=True, t=1, r=1, s=1, n=0)
        shapeNode = cmds.ListRelatives(List[x + 1], shapes=True)
        cmds.parent(shapeNode, List[0], add=True, s=True)
        cmds.delete(List[x + 1])
    sel = List[0]
    cmds.setAttr(sel + '.s', scale, scale, scale)
    cmds.makeIdentity(sel, apply=1, t=1, r=1, s=1, n=0)
    return sel
def createShape(prefix='', scale=1.0):
    List = []
    List.append(
        cmds.curve(
            n=prefix + '_ctl',
            p=[(-7.105427357601002e-15, -0.3358735290035888,
                0.7361468691490706),
               (-0.030221345939771993, -0.43042515285533867,
                0.6908148502394227),
               (-0.072472769789524, -0.5107046042608161, 0.6274377144647979),
               (-0.12400997464880703, -0.5684975545498503, 0.5501319071758723),
               (-0.12400997464880703, -0.5684975545498503, 0.5501319071758723),
               (-0.12400997464880703, -0.5684975545498503, 0.5501319071758723),
               (-0.12400997464880703, -0.5819931861859402, 0.5346306603447717),
               (-0.12400997464880703, -0.5819931861859402, 0.5346306603447717),
               (-0.12400997464880703, -0.5819931861859402, 0.5346306603447717),
               (-0.12400997464880703, -0.5819931861859402, 0.5346306603447717),
               (-0.08197748359885537, -0.540253001036092, 0.5946770761304137),
               (-0.04551343522386375, -0.48527382262420815,
                0.6467685738089758),
               (-0.015501246831107096, -0.4192182992656619,
                0.6896431286557706),
               (-0.015501246831107096, -0.4192182992656619,
                0.6896431286557706),
               (-0.015501246831107096, -0.4192182992656619,
                0.6896431286557706),
               (-0.015501246831107096, -0.7077292503941806,
                0.43808875481816606),
               (-0.015501246831107096, -0.80800092168273,
                -0.016811817720621902),
               (-0.015501246831107096, -0.6943482219457593,
                -0.34108941639861884),
               (-0.015501246831107096, -0.5527220271320061,
                -0.5148315398676033),
               (-0.015501246831107096, -0.3348935247151239,
                -0.6771644412642893),
               (-0.015501246831107096, -0.1758560186022855,
                -0.7361468691392242),
               (-0.015501246831107096, -7.844604263429887e-05,
                -0.7361468691392242)],
            per=False,
            d=3,
            k=[
                0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
                17, 18, 19, 19, 19
            ]))
    List.append(
        cmds.curve(p=[
            (3.552713678800501e-15, -0.3358735290035959, 0.7361468691490706),
            (0.03022134593976844, -0.43042515285534577, 0.6908148502394227),
            (0.07247276978952044, -0.5107046042608232, 0.6274377144647979),
            (0.12400997464880348, -0.5684975545498574, 0.5501319071758723),
            (0.12400997464880348, -0.5684975545498574, 0.5501319071758723),
            (0.12400997464880348, -0.5684975545498574, 0.5501319071758723),
            (0.12400997464880348, -0.5819931861859473, 0.5346306603447717),
            (0.12400997464880348, -0.5819931861859473, 0.5346306603447717),
            (0.12400997464880348, -0.5819931861859473, 0.5346306603447717),
            (0.12400997464880348, -0.5819931861859473, 0.5346306603447717),
            (0.08197748359885182, -0.5402530010360991, 0.5946770761304137),
            (0.0455134352238602, -0.48527382262421526, 0.6467685738089758),
            (0.015501246831103543, -0.419218299265669, 0.6896431286557706),
            (0.015501246831103543, -0.419218299265669, 0.6896431286557706),
            (0.015501246831103543, -0.419218299265669, 0.6896431286557706),
            (0.015501246831103543, -0.7077292503941877, 0.43808875481816606),
            (0.015501246831103543, -0.8080009216827371, -0.016811817720621902),
            (0.015501246831103543, -0.6943482219457664, -0.34108941639861884),
            (0.015501246831103543, -0.5527220271320132, -0.5148315398676033),
            (0.015501246831103543, -0.334893524715131, -0.6771644412642893),
            (0.015501246831103543, -0.1758560186022926, -0.7361468691392242),
            (0.015501246831103543, -7.844604263433487e-05, -0.7361468691392242)
        ],
                   per=False,
                   d=3,
                   k=[
                       0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                       15, 16, 17, 18, 19, 19, 19
                   ]))
    List.append(
        cmds.curve(p=[
            (0.0, 0.33587352900359235, 0.7361468691490706),
            (-0.030221345939764888, 0.4304251528553422, 0.6908148502394227),
            (-0.07247276978951689, 0.5107046042608197, 0.6274377144647979),
            (-0.12400997464879993, 0.5684975545498538, 0.5501319071758723),
            (-0.12400997464879993, 0.5684975545498538, 0.5501319071758723),
            (-0.12400997464879993, 0.5684975545498538, 0.5501319071758723),
            (-0.12400997464879993, 0.5819931861859438, 0.5346306603447717),
            (-0.12400997464879993, 0.5819931861859438, 0.5346306603447717),
            (-0.12400997464879993, 0.5819931861859438, 0.5346306603447717),
            (-0.12400997464879993, 0.5819931861859438, 0.5346306603447717),
            (-0.08197748359884827, 0.5402530010360955, 0.5946770761304137),
            (-0.045513435223856646, 0.4852738226242117, 0.6467685738089758),
            (-0.01550124683109999, 0.41921829926566545, 0.6896431286557706),
            (-0.01550124683109999, 0.41921829926566545, 0.6896431286557706),
            (-0.01550124683109999, 0.41921829926566545, 0.6896431286557706),
            (-0.01550124683109999, 0.7077292503941841, 0.43808875481816606),
            (-0.01550124683109999, 0.8080009216827335, -0.016811817720621902),
            (-0.01550124683109999, 0.6943482219457628, -0.34108941639861884),
            (-0.01550124683109999, 0.5527220271320097, -0.5148315398676033),
            (-0.01550124683109999, 0.33489352471512746, -0.6771644412642893),
            (-0.01550124683109999, 0.17585601860228905, -0.7361468691392242),
            (-0.01550124683109999, 7.844604263078215e-05, -0.7361468691392242)
        ],
                   per=False,
                   d=3,
                   k=[
                       0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                       15, 16, 17, 18, 19, 19, 19
                   ]))
    List.append(
        cmds.curve(p=[
            (3.552713678800501e-15, 0.33587352900359235, 0.7361468691490706),
            (0.03022134593976844, 0.4304251528553422, 0.6908148502394227),
            (0.07247276978952044, 0.5107046042608197, 0.6274377144647979),
            (0.12400997464880348, 0.5684975545498538, 0.5501319071758723),
            (0.12400997464880348, 0.5684975545498538, 0.5501319071758723),
            (0.12400997464880348, 0.5684975545498538, 0.5501319071758723),
            (0.12400997464880348, 0.5819931861859438, 0.5346306603447717),
            (0.12400997464880348, 0.5819931861859438, 0.5346306603447717),
            (0.12400997464880348, 0.5819931861859438, 0.5346306603447717),
            (0.12400997464880348, 0.5819931861859438, 0.5346306603447717),
            (0.08197748359885182, 0.5402530010360955, 0.5946770761304137),
            (0.0455134352238602, 0.4852738226242117, 0.6467685738089758),
            (0.015501246831103543, 0.41921829926566545, 0.6896431286557706),
            (0.015501246831103543, 0.41921829926566545, 0.6896431286557706),
            (0.015501246831103543, 0.41921829926566545, 0.6896431286557706),
            (0.015501246831103543, 0.7077292503941841, 0.43808875481816606),
            (0.015501246831103543, 0.8080009216827335, -0.016811817720621902),
            (0.015501246831103543, 0.6943482219457628, -0.34108941639861884),
            (0.015501246831103543, 0.5527220271320097, -0.5148315398676033),
            (0.015501246831103543, 0.33489352471512746, -0.6771644412642893),
            (0.015501246831103543, 0.17585601860228905, -0.7361468691392242),
            (0.015501246831103543, 7.844604263078215e-05, -0.7361468691392242)
        ],
                   per=False,
                   d=3,
                   k=[
                       0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                       15, 16, 17, 18, 19, 19, 19
                   ]))
    for x in range(len(List) - 1):
        cmds.makeIdentity(List[x + 1], apply=True, t=1, r=1, s=1, n=0)
        shapeNode = cmds.listRelatives(List[x + 1], shapes=True)
        cmds.parent(shapeNode, List[0], add=True, s=True)
        cmds.delete(List[x + 1])
    sel = List[0]
    cmds.setAttr(sel + '.s', scale, scale, scale)
    cmds.makeIdentity(sel, apply=1, t=1, r=1, s=1, n=0)
    return sel
Ejemplo n.º 50
0
 def TD12Pyramid(self, name):
     return cmds.curve(d=1,
                       n=name,
                       p=[(-1, 0, 0), (0, 0, 1), (0, 1, 0), (-1, 0, 0),
                          (1, 0, 0), (0, 1, 0), (1, 0, 0), (0, 0, 1),
                          (0, 1, 0)])
Ejemplo n.º 51
0
def createWrapControlShape(
        targetObjects,
        targetGeo=None,
        latheAxis='z',
        aimAxis='y+',
        objectUp='y+',
        points=8,
        curveDegree=1,
        insetMult=None,  #Inset multiplier
        minRotate=None,
        maxRotate=None,
        posOffset=[],
        rootOffset=[],  #offset root before cast
        rootRotate=None,
        joinMode=False,
        extendMode=None,
        closedCurve=True,
        l_specifiedRotates=None,
        maxDistance=1000,
        closestInRange=True,
        vectorOffset=None,
        midMeshCast=False,
        subSize=None,  #For ball on loli for example
        rotateBank=None,
        joinHits=None,  #keys to processed hits to see what to join
        axisToCheck=['x', 'y'],
        **kws):  #'segment,radial,disc'
    """
    This function lathes an axis of an object, shoot rays out the aim axis at the provided mesh and returning hits. 
    it then uses this information to build a curve shape.

    :parameters:
        mesh(string) | Surface to cast at
    mi_obj(string/mObj) | our casting object
    latheAxis(str) | axis of the objec to lathe TODO: add validation
    aimAxis(str) | axis to shoot out of
    points(int) | how many points you want in the curve
    curveDegree(int) | specified degree
    minRotate(float) | let's you specify a valid range to shoot
    maxRotate(float) | let's you specify a valid range to shoot
    posOffset(vector) | transformational offset for the hit from a normalized locator at the hit. Oriented to the surface
    markHits(bool) | whether to keep the hit markers
    returnDict(bool) | whether you want all the infomation from the process.
    rotateBank (float) | let's you add a bank to the rotation object
    l_specifiedRotates(list of values) | specify where to shoot relative to an object. Ignores some other settings
    maxDistance(float) | max distance to cast rays
    closestInRange(bool) | True by default. If True, takes first hit. Else take the furthest away hit in range.

    :returns:
        Dict ------------------------------------------------------------------
    'source'(double3) |  point from which we cast
    'hit'(double3) | world space points | active during single return
    'hits'(list) | world space points | active during multi return
    'uv'(double2) | uv on surface of hit | only works for mesh surfaces

    :raises:
    Exception | if reached

    """
    _str_func = "createWrapControlShape"
    log.debug(">> %s >> " % (_str_func) + "=" * 75)
    _joinModes = []
    _extendMode = []

    if type(targetObjects) not in [list, tuple]:
        targetObjects = [targetObjects]
    targetGeo = VALID.objStringList(targetGeo, calledFrom=_str_func)

    assert type(points) is int, "Points must be int: %s" % points
    assert type(curveDegree) is int, "Points must be int: %s" % points
    assert curveDegree > 0, "Curve degree must be greater than 1: %s" % curveDegree
    if posOffset is not None and len(posOffset) and len(posOffset) != 3:
        raise StandardError, "posOffset must be len(3): %s | len: %s" % (
            posOffset, len(posOffset))
    if rootOffset is not None and len(rootOffset) and len(rootOffset) != 3:
        raise StandardError, "rootOffset must be len(3): %s | len: %s" % (
            rootOffset, len(rootOffset))
    if rootRotate is not None and len(rootRotate) and len(rootRotate) != 3:
        raise StandardError, "rootRotate must be len(3): %s | len: %s" % (
            rootRotate, len(rootRotate))

    if extendMode in ['loliwrap', 'cylinder', 'disc'] and insetMult is None:
        insetMult = 1
    for axis in ['x', 'y', 'z']:
        if axis in latheAxis.lower(): latheAxis = axis

    log.debug("targetObjects: %s" % targetObjects)

    if len(aimAxis) == 2: single_aimAxis = aimAxis[0]
    else: single_aimAxis = aimAxis
    mAxis_aim = VALID.simpleAxis(aimAxis)
    log.debug("Single aim: %s" % single_aimAxis)
    log.debug("createWrapControlShape>> midMeshCast: %s" % midMeshCast)
    log.debug("|{0}| >> extendMode: {1}".format(_str_func, extendMode))
    #>> Info
    l_groupsBuffer = []
    il_curvesToCombine = []
    l_sliceReturns = []
    #Need to do more to get a better size

    #>> Build curves
    #=================================================================
    #> Root curve #
    log.debug("RootRotate: %s" % rootRotate)
    mi_rootLoc = cgmMeta.cgmNode(targetObjects[0]).doLoc()
    if rootOffset:
        log.debug("rootOffset: %s" % rootOffset)
        mc.move(rootOffset[0],
                rootOffset[1],
                rootOffset[2], [mi_rootLoc.mNode],
                r=True,
                rpr=True,
                os=True,
                wd=True)
    if rootRotate is not None and len(rootRotate):
        log.debug("rootRotate: %s" % rootRotate)
        mc.rotate(rootRotate[0],
                  rootRotate[1],
                  rootRotate[2], [mi_rootLoc.mNode],
                  os=True,
                  r=True)

    #>> Root
    mi_rootLoc.doGroup()  #Group to zero
    if extendMode == 'segment':
        log.debug("segment mode. Target len: %s" % len(targetObjects[1:]))
        if len(targetObjects) < 2:
            log.warning(
                "Segment build mode only works with two objects or more")
        else:
            if insetMult is not None:
                rootDistanceToMove = distance.returnDistanceBetweenObjects(
                    targetObjects[0], targetObjects[1])
                log.debug("rootDistanceToMove: %s" % rootDistanceToMove)
                mi_rootLoc.__setattr__('t%s' % latheAxis,
                                       rootDistanceToMove * insetMult)
                #mi_rootLoc.tz = (rootDistanceToMove*insetMult)#Offset it

            #Notes -- may need to play with up object for aim snapping
            #mi_upLoc = cgmMeta.cgmNode(targetObjects[0]).doLoc()
            #mi_upLoc.doGroup()#To zero
            objectUpVector = dictionary.returnStringToVectors(objectUp)
            log.debug("objectUpVector: %s" % objectUpVector)
            #mi_uploc

            for i, obj in enumerate(targetObjects[1:]):
                log.debug("i: %s" % i)
                #> End Curve
                mi_endLoc = cgmMeta.cgmNode(obj).doLoc()
                aimVector = dictionary.returnStringToVectors(latheAxis + '-')
                log.debug("segment aimback: %s" % aimVector)
                #Snap.go(mi_endLoc.mNode,mi_rootLoc.mNode,move=False,aim=True,aimVector=aimVector,upVector=objectUpVector)
                #Snap.go(mi_endLoc.mNode,mi_rootLoc.mNode,move=False,orient=True)
                SNAP.go(mi_endLoc.mNode,
                        mi_rootLoc.mNode,
                        position=False,
                        rotation=True)

                mi_endLoc.doGroup()

                if i == len(targetObjects[1:]) - 1:
                    if insetMult is not None:
                        log.debug("segment insetMult: %s" % insetMult)
                        distanceToMove = distance.returnDistanceBetweenObjects(
                            targetObjects[-1], targetObjects[0])
                        log.debug("distanceToMove: %s" % distanceToMove)
                        #mi_endLoc.tz = -(distanceToMove*insetMult)#Offset it
                        mi_endLoc.__setattr__('t%s' % latheAxis,
                                              -(distanceToMove * insetMult))
                log.debug("segment lathe: %s" % latheAxis)
                log.debug("segment aim: %s" % aimAxis)
                log.debug("segment rotateBank: %s" % rotateBank)
                d_endCastInfo = createMeshSliceCurve(
                    targetGeo,
                    mi_endLoc,
                    midMeshCast=midMeshCast,
                    curveDegree=curveDegree,
                    latheAxis=latheAxis,
                    aimAxis=aimAxis,
                    posOffset=posOffset,
                    points=points,
                    returnDict=True,
                    closedCurve=closedCurve,
                    maxDistance=maxDistance,
                    closestInRange=closestInRange,
                    rotateBank=rotateBank,
                    l_specifiedRotates=l_specifiedRotates,
                    axisToCheck=axisToCheck)
                l_sliceReturns.append(d_endCastInfo)
                mi_end = cgmMeta.cgmObject(d_endCastInfo['curve'])
                il_curvesToCombine.append(mi_end)
                mc.delete(mi_endLoc.parent)  #delete the loc

    elif extendMode == 'radial':
        log.debug("|{0}| >> radial...".format(_str_func))
        d_handleInner = createMeshSliceCurve(
            targetGeo,
            mi_rootLoc,
            midMeshCast=midMeshCast,
            curveDegree=curveDegree,
            latheAxis=latheAxis,
            aimAxis=aimAxis,
            posOffset=0,
            points=points,
            returnDict=True,
            closedCurve=closedCurve,
            maxDistance=maxDistance,
            closestInRange=closestInRange,
            rotateBank=rotateBank,
            l_specifiedRotates=l_specifiedRotates,
            axisToCheck=axisToCheck)
        mi_buffer = cgmMeta.cgmObject(d_handleInner['curve'])  #instance curve
        l_sliceReturns.append(d_handleInner)
        il_curvesToCombine.append(mi_buffer)

    elif extendMode == 'disc':
        log.debug("|{0}| >> disc...".format(_str_func))
        d_size = returnBaseControlSize(mi_rootLoc, targetGeo,
                                       axis=[aimAxis])  #Get size
        #discOffset = d_size[ d_size.keys()[0]]*insetMult
        size = False
        l_absSize = [abs(i) for i in posOffset]
        if l_absSize: size = max(l_absSize)
        if not size:
            d_size = returnBaseControlSize(mi_rootLoc,
                                           targetGeo,
                                           axis=[aimAxis])  #Get size
            log.debug("d_size: %s" % d_size)
            size = d_size[d_size.keys()[0]] * insetMult

        discOffset = size
        log.debug("d_size: %s" % d_size)
        log.debug("discOffset is: %s" % discOffset)

        mi_rootLoc.__setattr__('t%s' % latheAxis, discOffset)
        if posOffset:
            tmp_posOffset = [
                posOffset[0] * .5, posOffset[1] * .5, posOffset[2] * .5
            ]
        d_handleInnerUp = createMeshSliceCurve(
            targetGeo,
            mi_rootLoc,
            curveDegree=curveDegree,
            midMeshCast=midMeshCast,
            latheAxis=latheAxis,
            aimAxis=aimAxis,
            posOffset=tmp_posOffset,
            points=points,
            returnDict=True,
            closedCurve=closedCurve,
            maxDistance=maxDistance,
            closestInRange=closestInRange,
            rotateBank=rotateBank,
            l_specifiedRotates=l_specifiedRotates,
            axisToCheck=axisToCheck)
        mi_buffer = cgmMeta.cgmObject(
            d_handleInnerUp['curve'])  #instance curve
        l_sliceReturns.append(d_handleInnerUp)
        il_curvesToCombine.append(mi_buffer)

        mi_rootLoc.__setattr__('t%s' % latheAxis, -discOffset)
        d_handleInnerDown = createMeshSliceCurve(
            targetGeo,
            mi_rootLoc,
            curveDegree=curveDegree,
            midMeshCast=midMeshCast,
            latheAxis=latheAxis,
            aimAxis=aimAxis,
            posOffset=tmp_posOffset,
            points=points,
            returnDict=True,
            closedCurve=closedCurve,
            maxDistance=maxDistance,
            closestInRange=closestInRange,
            rotateBank=rotateBank,
            l_specifiedRotates=l_specifiedRotates,
            axisToCheck=axisToCheck)
        mi_buffer = cgmMeta.cgmObject(
            d_handleInnerDown['curve'])  #instance curve
        l_sliceReturns.append(d_handleInnerDown)
        il_curvesToCombine.append(mi_buffer)

        mi_rootLoc.tz = 0

    elif extendMode == 'cylinder':
        log.debug("|{0}| >> cylinder...".format(_str_func))
        d_size = returnBaseControlSize(mi_rootLoc, targetGeo,
                                       axis=[aimAxis])  #Get size
        discOffset = d_size[d_size.keys()[0]] * insetMult
        log.debug("d_size: %s" % d_size)
        log.debug("discOffset is: %s" % discOffset)

        mi_rootLoc.__setattr__('t%s' % latheAxis, discOffset)
        d_handleInnerUp = createMeshSliceCurve(
            targetGeo,
            mi_rootLoc,
            curveDegree=curveDegree,
            midMeshCast=midMeshCast,
            latheAxis=latheAxis,
            aimAxis=aimAxis,
            posOffset=posOffset,
            points=points,
            returnDict=True,
            closedCurve=closedCurve,
            maxDistance=maxDistance,
            closestInRange=closestInRange,
            rotateBank=rotateBank,
            l_specifiedRotates=l_specifiedRotates,
            axisToCheck=axisToCheck)
        mi_buffer = cgmMeta.cgmObject(
            d_handleInnerUp['curve'])  #instance curve
        l_sliceReturns.append(d_handleInnerUp)
        il_curvesToCombine.append(mi_buffer)

        mi_rootLoc.__setattr__('t%s' % latheAxis, 0)

    elif extendMode == 'loliwrap':
        log.debug("|{0}| >> lolipop...".format(_str_func))
        #l_absSize = [abs(i) for i in posOffset]
        size = False
        #if l_absSize:
        #log.debug("l_absSize: %s"%l_absSize)
        #size = max(l_absSize)*1.25
        if subSize is not None:
            size = subSize
        if not size:
            d_size = returnBaseControlSize(mi_rootLoc,
                                           targetGeo,
                                           axis=[aimAxis])  #Get size
            log.info("d_size: %s" % d_size)
            l_size = d_size[single_aimAxis]
            size = l_size / 3
        log.info("loli size: %s" % size)
        i_ball = cgmMeta.cgmObject(
            curves.createControlCurve('sphere', size=size))

    elif extendMode == 'endCap':
        log.debug("|{0}| >> endCap...".format(_str_func))
        returnBuffer1 = createMeshSliceCurve(
            targetGeo,
            mi_rootLoc.mNode,
            aimAxis='{0}+'.format(latheAxis),
            latheAxis=objectUp[0],
            curveDegree=curveDegree,
            maxDistance=maxDistance,
            closestInRange=closestInRange,
            closedCurve=False,
            l_specifiedRotates=[-90, -60, -30, 0, 30, 60, 90],
            posOffset=posOffset)
        mi_rootLoc.rotate = [0, 0, 0]
        mi_rootLoc.__setattr__('r%s' % latheAxis, 90)
        returnBuffer2 = createMeshSliceCurve(
            targetGeo,
            mi_rootLoc.mNode,
            aimAxis='{0}+'.format(latheAxis),
            latheAxis=objectUp[0],
            curveDegree=curveDegree,
            maxDistance=maxDistance,
            closedCurve=False,
            closestInRange=closestInRange,
            l_specifiedRotates=[-90, -60, -30, 0, 30, 60, 90],
            posOffset=posOffset)
        l_sliceReturns.extend([returnBuffer1, returnBuffer2])
        il_curvesToCombine.append(cgmMeta.cgmObject(returnBuffer1))
        il_curvesToCombine.append(cgmMeta.cgmObject(returnBuffer2))
        mi_rootLoc.rotate = [0, 0, 0]

    #Now cast our root since we needed to move it with segment mode before casting
    if extendMode == 'cylinder':
        log.debug("|{0}| >> cylinder move...".format(_str_func))
        mi_rootLoc.__setattr__('t%s' % latheAxis, -discOffset)

    log.debug("|{0}| >> Rootcast...".format(_str_func))

    d_rootCastInfo = createMeshSliceCurve(
        targetGeo,
        mi_rootLoc,
        curveDegree=curveDegree,
        minRotate=minRotate,
        maxRotate=maxRotate,
        latheAxis=latheAxis,
        midMeshCast=midMeshCast,
        aimAxis=aimAxis,
        posOffset=posOffset,
        points=points,
        vectorOffset=vectorOffset,
        returnDict=True,
        closedCurve=closedCurve,
        maxDistance=maxDistance,
        closestInRange=closestInRange,
        rotateBank=rotateBank,
        l_specifiedRotates=l_specifiedRotates,
        axisToCheck=axisToCheck)
    #d_rootCastInfo = createMeshSliceCurve(targetGeo,mi_rootLoc,**kws)
    log.debug("|{0}| >> Rootcast done".format(_str_func) + cgmGEN._str_subLine)

    if extendMode == 'disc':
        l_sliceReturns.insert(1, d_rootCastInfo)
    else:
        l_sliceReturns.insert(0, d_rootCastInfo)

    #Special loli stuff
    if extendMode == 'loliwrap':
        SNAP.go(i_ball.mNode, mi_rootLoc.mNode, True,
                True)  #Snap to main object

        #log.debug("hitReturns: %s"%d_rootCastInfo['hitReturns'])
        #cgmGEN.walk_dat(d_rootCastInfo['hitReturns'],'hitReturns')

        mi_crv = cgmMeta.cgmObject(d_rootCastInfo['curve'])
        """
        d_return = RayCast.findMeshIntersectionFromObjectAxis(targetGeo,mi_rootLoc.mNode,mAxis_aim.p_string) or {}
        if not d_return.get('hit'):
            log.info(d_return)
            raise ValueError,"No hit on loli check"
        pos = d_return.get('hit')
        dist = distance.returnDistanceBetweenPoints(i_ball.getPosition(),pos) * 2"""

        if vectorOffset is not None:
            dist = vectorOffset + subSize * 4
        else:
            dist = max(posOffset) + subSize * 4

        if '-' in aimAxis:
            distM = -dist
        else:
            distM = dist
        log.debug("distM: %s" % distM)

        #Move the ball
        pBuffer = i_ball.doGroup()
        i_ball.__setattr__('t%s' % single_aimAxis, distM)
        i_ball.parent = False
        mc.delete(pBuffer)

        uPos = distance.returnClosestUPosition(i_ball.mNode, mi_crv.mNode)

        SNAP.aim(i_ball.mNode, mi_rootLoc.mNode, aimAxis='z-')
        #if posOffset:
        #mc.move(posOffset[0]*3,posOffset[1]*3,posOffset[2]*3, [i_ball.mNode], r = True, rpr = True, os = True, wd = True)
        #Make the curve between the two
        mi_traceCrv = cgmMeta.cgmObject(
            mc.curve(degree=1, ep=[uPos, i_ball.getPosition()]))

        #Combine
        il_curvesToCombine.extend([i_ball, mi_traceCrv])

    mi_root = cgmMeta.cgmObject(d_rootCastInfo['curve'])  #instance curve
    il_curvesToCombine.append(mi_root)

    mc.delete(mi_rootLoc.parent)  #delete the loc

    l_curvesToCombine = [mi_obj.mNode for mi_obj in il_curvesToCombine
                         ]  #Build our combine list before adding connectors
    log.debug("|{0}| >> processed: {1}".format(
        _str_func, d_rootCastInfo['processedHits']))

    if joinMode and extendMode not in ['loliwrap', 'endCap'
                                       ] and len(l_sliceReturns) > 1:
        if joinHits:
            keys = d_rootCastInfo['processedHits'].keys()
            keys.sort()
            #goodDegrees = []
            #for i,key in enumerate(keys):
            #if i in joinHits:
            #goodDegrees.append(key)
            goodDegrees = [key for i, key in enumerate(keys) if i in joinHits]
            log.debug("joinHits: %s" % joinHits)
            log.debug("goodDegrees: %s" % goodDegrees)
        else:
            goodDegrees = [
                key for key in d_rootCastInfo['processedHits'].keys()
            ]
        #> Side Curves
        for degree in goodDegrees:
            l_pos = []
            for d in l_sliceReturns:
                l_pos.append(d['processedHits'].get(degree) or False)
            while False in l_pos:
                l_pos.remove(False)
            log.debug("l_pos: %s" % l_pos)
            if len(l_pos) >= 2:
                try:
                    l_curvesToCombine.append(
                        mc.curve(d=curveDegree, ep=l_pos,
                                 os=True))  #Make the curve
                except:
                    log.debug(
                        "createWrapControlShape>>> skipping curve fail: %s" %
                        (degree))

    #>>Combine the curves
    newCurve = curves.combineCurves(l_curvesToCombine)
    mi_crv = cgmMeta.cgmObject(rigging.groupMeObject(targetObjects[0], False))
    curves.parentShapeInPlace(mi_crv.mNode, newCurve)  #Parent shape
    mc.delete(newCurve)

    #>>Copy tags and name
    mi_crv.doCopyNameTagsFromObject(targetObjects[0],
                                    ignore=['cgmType', 'cgmTypeModifier'])
    mi_crv.addAttr('cgmType',
                   attrType='string',
                   value='controlCurve',
                   lock=True)
    mi_crv.doName()

    #Store for return
    return {'curve': mi_crv.mNode, 'instance': mi_crv}
Ejemplo n.º 52
0
 def TDDirSingleThin(self, name):
     return cmds.curve(d=1,
                       n=name,
                       p=[(0, 0, 1), (0, 0, -1), (-1, 0, 0), (0, 0, -1),
                          (1, 0, 0)])
Ejemplo n.º 53
0
 def TDAngle(self, name):
     return cmds.curve(d=1,
                       n=name,
                       p=[(-1, 0, -3), (1, 0, -3), (1, 0, 1), (-3, 0, 1),
                          (-3, 0, -1), (-1, 0, -1), (-1, 0, -3)])
Ejemplo n.º 54
0
    def pathCurveSet(self,plusLength):
        self.nearParam_list = list()
        self.getLength_list = list()
        self.pathCrv_attLoc_list = list()
        self.upPathLoc_list = list()

        cmds.addAttr('root_CON' , ln='run' , at='double' , dv=0)
        cmds.setAttr('root_CON.run' , e=True , k=True)
        cmds.createNode('transform' , n = 'pathSet_GRP' , p='noneTransform_GRP')
        cvStartPos = self.customBodyJointsPos[0]
        setLength = self.disDMS + plusLength
        curvePos = [0,cvStartPos[1],setLength]
        pathSet_crv = cmds.curve(p=[cvStartPos,curvePos],d=1)

        cmds.rebuildCurve(pathSet_crv,d=3,s=10)
        self.pathSet_crv = cmds.rename(pathSet_crv ,'pathSet_CRV')
        self.pathSet_crvShp = cmds.listRelatives(self.pathSet_crv, s=1)[0]
        pathSet_CIF = cmds.createNode('curveInfo', n = 'pathSet_CIF')

        for i in self.FKNull:
            nearDCM = cmds.createNode('decomposeMatrix')
            nearestNode = cmds.createNode('nearestPointOnCurve')
            arcLengthDMS = cmds.arcLengthDimension('%s.u[0]' %self.pathSet_crv)
            curveShape = cmds.listRelatives(self.pathSet_crv,s=1)[0]
            cmds.connectAttr('%s.worldMatrix[0]' %i , '%s.inputMatrix' %nearDCM)
            cmds.connectAttr('%s.worldSpace[0]' %curveShape , '%s.inputCurve' %nearestNode)
            cmds.connectAttr('%s.outputTranslate' %nearDCM , '%s.inPosition' %nearestNode)
            nearParam = cmds.getAttr('%s.parameter' %nearestNode)
            self.nearParam_list.append(nearParam)
            cmds.setAttr('%s.uParamValue' %arcLengthDMS , nearParam)
            getLength = cmds.getAttr('%s.arcLength' %arcLengthDMS)
            self.getLength_list.append(getLength)
            cmds.delete(nearDCM,nearestNode,arcLengthDMS)
            #return getLength
            print '%s.param = "%s"' %(i,nearParam)
            print '%s.length = "%s"' %(i,getLength)
            #return getLength,nearParam
            pathCrv_attLoc = cmds.spaceLocator(n = self.FKNull[self.FKNull.index(i)]+'_attatch_LOC')[0]
            self.pathCrv_attLoc_list.append(pathCrv_attLoc)
            cmds.setAttr('%s.template' % pathCrv_attLoc, 1)
            cmds.hide(pathCrv_attLoc)
            adl = cmds.createNode('addDoubleLinear' , n = pathCrv_attLoc.replace(pathCrv_attLoc.split('_')[-1],'ADL'))
            clp = cmds.createNode('curveLength2ParamU' , n = pathCrv_attLoc.replace(pathCrv_attLoc.split('_')[-1],'CLP'))
            poci = cmds.createNode('pointOnCurveInfo' ,  n = pathCrv_attLoc.replace(pathCrv_attLoc.split('_')[-1],'POCI'))
            cmds.connectAttr('root_CON.run' , '%s.input2' %adl)
            cmds.setAttr('%s.input1' %adl , getLength)
            cmds.connectAttr('%s.output' %adl , '%s.inputLength' %clp)
            cmds.connectAttr('%s.worldSpace[0]' %self.pathSet_crvShp, '%s.inputCurve' %clp)
            cmds.connectAttr('%s.worldSpace[0]' %self.pathSet_crvShp, '%s.inputCurve' %poci)
            cmds.connectAttr('%s.outputParamU' %clp , '%s.parameter' %poci)
            cmds.connectAttr('%s.position' %poci , '%s.translate' %pathCrv_attLoc)

        # reverse variable
        pathCrv_attLoc_list_rev_range = list()
        self.pathCrv_attLoc_list_rev = list() # pathCurve attatch Locator list reverse variable
        FKNull_rev_range = list()
        self.FKNull_rev = list() # fk null reverse variable
        for j in self.pathCrv_attLoc_list:
            pathCrv_attLoc_list_rev_range.append(self.pathCrv_attLoc_list.index(j))
        pathCrv_attLoc_list_rev_range.reverse()
        for i in pathCrv_attLoc_list_rev_range:
            self.pathCrv_attLoc_list_rev.append(self.pathCrv_attLoc_list[i])
        for j in self.FKNull:
            FKNull_rev_range.append(self.FKNull.index(j))
        FKNull_rev_range.reverse()
        for i in FKNull_rev_range:
            self.FKNull_rev.append(self.FKNull[i])

        for k in self.pathCrv_attLoc_list_rev: # controller upVec set and < pathCrv_attLoc connect to FKNull >
            locXform = cmds.xform(k , ws=True, q=True, t=True)
            upPathLoc = cmds.spaceLocator(n = k.replace(k.split('_')[-1], 'upVec_LOC') , p =(locXform[0],locXform[1],locXform[2]))[0]
            self.upPathLoc_list.append(upPathLoc)
            cmds.CenterPivot(upPathLoc)
            cmds.setAttr('%s.template' % upPathLoc, 1)
            cmds.setAttr('%s.ty' %upPathLoc , 20)
            temp_MMX = cmds.createNode('multMatrix' , n = k.replace(k.split('_')[-1],'MMX'))
            temp_DCM = cmds.createNode('decomposeMatrix' , n = k.replace(k.split('_')[-1],'DCM'))
            if self.pathCrv_attLoc_list_rev.index(k) is 0:
                cmds.connectAttr('%s.worldMatrix[0]' %k,'%s.matrixIn[0]' %temp_MMX)
                cmds.connectAttr('root_CON.worldInverseMatrix[0]','%s.matrixIn[1]' %temp_MMX)
                cmds.connectAttr('%s.matrixSum' %temp_MMX,'%s.inputMatrix' %temp_DCM)
                cmds.connectAttr('%s.outputTranslate' %temp_DCM , '%s.translate' %self.FKNull_rev[self.pathCrv_attLoc_list_rev.index(k)])
                cmds.connectAttr('%s.outputRotate' %temp_DCM , '%s.rotate' %self.FKNull_rev[self.pathCrv_attLoc_list_rev.index(k)])
            elif self.pathCrv_attLoc_list_rev.index(k) is not 0:
                cmds.connectAttr('%s.worldMatrix[0]' %k,'%s.matrixIn[0]' %temp_MMX)
                cmds.connectAttr('%s.worldInverseMatrix[0]'  %self.pathCrv_attLoc_list_rev[self.pathCrv_attLoc_list_rev.index(k)-1] ,'%s.matrixIn[1]' %temp_MMX)
                cmds.connectAttr('%s.matrixSum' %temp_MMX,'%s.inputMatrix' %temp_DCM)
                cmds.connectAttr('%s.outputTranslate' %temp_DCM , '%s.translate' %self.FKNull_rev[self.pathCrv_attLoc_list_rev.index(k)])
                cmds.connectAttr('%s.outputRotate' %temp_DCM , '%s.rotate' %self.FKNull_rev[self.pathCrv_attLoc_list_rev.index(k)])
        # IKSub_loc_list , for curveVis locator
        self.IKSub_loc_list = list()
        for i in self.IKSubCon:
            IKSub_loc = cmds.spaceLocator(n = i.replace(i.split('_')[-1],'LOC'))[0]
            cmds.parentConstraint(i,IKSub_loc,mo=0)
            self.IKSub_loc_list.append(IKSub_loc)
            cmds.parent(IKSub_loc,'upVecVisCurve_GRP')
            cmds.toggle(IKSub_loc,template=True)
            cmds.hide(IKSub_loc)
        self.IKSub_loc_list.reverse()
        # set upvec con
        self.upVecPathLocControlSet()
        # tangent constraint
        for i in self.pathCrv_attLoc_list:
            cmds.tangentConstraint(self.pathSet_crv , i , aim=[0.0,0.0,1.0] , u=[0.0,1.0,0.0], wut='object',wuo='%s' %self.upPathLoc_list[self.pathCrv_attLoc_list_rev.index(i)])
        # set root matrix
        self.addRootMatrix()
        # set node hierachy structure
        self.setNodeHierachy_second()
Ejemplo n.º 55
0
 def TD12Spear(self, name):
     return cmds.curve(d=1,
                       n=name,
                       p=[(0, 2, 0), (0, 0, 2), (0, 0, -2), (0, 2, 0),
                          (-2, 0, 0), (2, 0, 0), (0, 2, 0)])
Ejemplo n.º 56
0
    def TDdial1(self, name):
        self.temp1 = cmds.curve(d=1,
                                n=name,
                                p=[[0.364972, 0, -2.473302],
                                   [-0.323287, 0, -2.473302],
                                   [-0.477698, 0, -1.961019],
                                   [-0.671003, 0, -1.912512],
                                   [-0.853523, 0, -1.83603],
                                   [-1.020817, 0, -1.736603],
                                   [-1.486974, 0, -1.9923],
                                   [-1.977452, 0, -1.50523],
                                   [-1.726133, 0, -1.036491],
                                   [-1.826798, 0, -0.869888],
                                   [-1.904727, 0, -0.687918],
                                   [-1.95492, 0, -0.494751],
                                   [-2.467584, 0, -0.344098],
                                   [-2.473302, 0, 0.344405],
                                   [-1.963327, 0, 0.495231],
                                   [-1.91592, 0, 0.68819],
                                   [-1.841198, 0, 0.870093],
                                   [-1.743355, 0, 1.036558],
                                   [-2.002876, 0, 1.505576],
                                   [-1.520597, 0, 1.992572],
                                   [-1.050066, 0, 1.736639],
                                   [-0.884391, 0, 1.836305],
                                   [-0.703282, 0, 1.912784],
                                   [-0.510771, 0, 1.961534],
                                   [-0.364527, 0, 2.473302],
                                   [0.323323, 0, 2.473302],
                                   [0.477765, 0, 1.961534],
                                   [0.671274, 0, 1.912784],
                                   [0.853488, 0, 1.836305],
                                   [1.020711, 0, 1.736639],
                                   [1.487041, 0, 1.992572],
                                   [1.977416, 0, 1.505576],
                                   [1.725717, 0, 1.036766],
                                   [1.8269, 0, 0.870093],
                                   [1.904794, 0, 0.68819],
                                   [1.954712, 0, 0.495231],
                                   [2.467481, 0, 0.344405],
                                   [2.473302, 0, -0.344098],
                                   [1.963016, 0, -0.494751],
                                   [1.916231, 0, -0.687918],
                                   [1.841368, 0, -0.869888],
                                   [1.743528, 0, -1.036491],
                                   [2.002841, 0, -1.50523],
                                   [1.520594, 0, -1.9923],
                                   [1.050133, 0, -1.736603],
                                   [0.88456, 0, -1.83603],
                                   [0.703419, 0, -1.912512],
                                   [0.510905, 0, -1.961019],
                                   [0.364972, 0, -2.473302]],
                                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, 45,
                                    46, 47, 48
                                ])
        self.temp2 = cmds.curve(
            d=1,
            n=name,
            p=[[0, 0, -1.593544], [-0.609823, 0, -1.472242],
               [-1.126805, 0, -1.126805], [-1.472242, 0, -0.609823],
               [-1.593544, 0, 0], [-1.472242, 0, 0.609823],
               [-1.126805, 0, 1.126805], [-0.609823, 0, 1.472242],
               [0, 0, 1.593544], [0.609823, 0, 1.472242],
               [1.126805, 0, 1.126805], [1.472242,
                                         0, 0.609823], [1.593544, 0, 0],
               [1.472242, 0, -0.609823], [1.126805, 0,
                                          -1.126805], [0.609823, 0, -1.472242],
               [0, 0, -1.593544]],
            k=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])

        self.tempShape = cmds.listRelatives(self.temp2, s=True)
        cmds.parent(self.tempShape, self.temp1, r=True, s=True)
        cmds.delete(self.temp2)
        cmds.select(self.temp1)
        return self.temp1
Ejemplo n.º 57
0
            particleDictionary[currentFrame] = particlesPosition
            allParticleDictionary[str(particleName[0])] = particleDictionary

for curveParticleId in allParticleDictionary.keys():
    #print sorted(allParticleDictionary[curveParticleId].keys())
    #print curveParticleId
    pointList = []

    sortedKeyFrameList = sorted(allParticleDictionary[curveParticleId].keys())
    if len(sortedKeyFrameList) > 1:

        for keyFrame in sortedKeyFrameList:
            pointList.append(allParticleDictionary[curveParticleId][keyFrame])

        curveName = "partiCurve" + str(curveParticleId)
        curveObj = mc.curve(name=curveName, p=pointList)

        #For every locator we create, make a bubble and attach that to the locator in worldspace and parent in underneath
    getCurvLen = mc.arclen(curveObj)
    makeCvrLenInt = math.ceil(
        getCurvLen * .5
    )  #reduces the amount of spans the curve has, this is useful on very long extrusions

    makeCircle = mc.circle(n="newCircle", d=1, s=12)
    aCircle = mc.planarSrf(makeCircle[0],
                           n="extruTube",
                           ch=1,
                           d=1,
                           ko=0,
                           rn=0,
                           po=1,
Ejemplo n.º 58
0
 def TDDirDoubleThin(self, name):
     return cmds.curve(d=1,
                       n=name,
                       p=[(1, 0, 1), (0, 0, 2), (-1, 0, 1), (0, 0, 2),
                          (0, 0, -2), (-1, 0, -1), (0, 0, -2), (1, 0, -1)])
Ejemplo n.º 59
0
	def onDrag(self):
	
		# modifier
		self.mod = cmds.getModifiers()
		
		# positions
		currentPos = cmds.draggerContext(self.dragCtx, query=True, dragPoint=True)
		
		# camera far clip
		currentView = omui.M3dView().active3dView()
		camDP = om.MDagPath()
		
		currentView.getCamera(camDP)
		camFn = om.MFnCamera(camDP)
		farclip = camFn.farClippingPlane()
		
		# screen to world conversion
		worldPos, worldDir = utils().viewToWorld(currentPos[0],currentPos[1])
		
		
		closestHit = None
		closestObj = None
		for obj in self.targetObj:
			state, hit, fnMesh, facePtr, triPtr = utils().intersect(obj, worldPos, worldDir, farclip)
				
			if state is True:
				dif = [hit.x - worldPos[0],hit.y - worldPos[1],hit.z - worldPos[2]]
				distToCam = math.sqrt(math.pow(float(dif[0]),2) + math.pow(float(dif[1]),2) + math.pow(float(dif[2]),2))
				if closestHit == None:
					closestHit = distToCam
					closestObj = [state, hit, fnMesh, facePtr, triPtr]
				elif distToCam < closestHit:
					closestHit = distToCam
					closestObj = [state, hit, fnMesh, facePtr, triPtr]
		if closestObj is not None:
			state, hit, fnMesh, facePtr, triPtr = closestObj
			
			mHit = om.MPoint(hit)
			# get smooth normal
			normal = om.MVector()
			fnMesh.getClosestNormal(mHit, normal, om.MSpace.kWorld, None)
			
			tangent = utils().crossProduct(normal,self.worldUp)
			
			
			
			upAxis = utils().crossProduct(normal,tangent)
			
			# define transformation matrix
			matrix = [tangent.x,tangent.y,tangent.z,0,upAxis.x,upAxis.y,upAxis.z,0,normal.x,normal.y,normal.z,0,hit.x,hit.y,hit.z,0]
			
			# apply matrix
			dist = om.MVector( (hit.x - self.prevHit.x),(hit.y - self.prevHit.y),(hit.z - self.prevHit.z) )
			if utils().magnitude(dist) > self.step:
				if self.mod == 0:
					cmds.curve(self.loc,append=True,p=(hit.x,hit.y,hit.z))
			else:
				hit = self.prevHit
			
			
			if self.mesh is True:
					v1 = cmds.pointPosition(self.loc + '.cv[0]',w=True)
					v2 = cmds.pointPosition(self.loc + '.cv[1]',w=True)
					v = om.MVector(v2[0] - v1[0],v2[1] - v1[1],v2[2] - v1[2])
					v.normalize()
					cmds.setAttr(self.circle[1] + '.normalX',v.x)
					cmds.setAttr(self.circle[1] + '.normalY',v.y)
					cmds.setAttr(self.circle[1] + '.normalZ',v.z)
					
					
					if self.mod == 1:
						mag = utils().magnitude(dist) * self.bMult
						if dist.y < 0:
							mag = -mag
						currentValue = cmds.getAttr(self.circle[1] + '.radius')
						compVal = sorted((0.0001,currentValue + mag))[1]
						self.bRad = compVal
						cmds.setAttr(self.circle[1] + '.radius',compVal)
					
					if self.mod == 4:
						mag = utils().magnitude(dist) * self.bMult
						if dist.y < 0:
							mag = -mag
						currentValue = cmds.getAttr(self.extrude[1] + '.scale')
						compVal = sorted((0.0001,currentValue + mag))[1]
						self.taper = compVal
						cmds.setAttr(self.extrude[1] + '.scale',compVal)
			
			self.prevHit = hit
			# print cmds.timerX(st=self.timer)
			
			# refresh viewport
			currentView.refresh(False,True,False)
Ejemplo n.º 60
0
	def onPress(self):
		"""
		execute on press
		"""
		# modifier
		self.mod = cmds.getModifiers()
		
		# button
		self.btn = cmds.draggerContext(self.dragCtx, query=True, button=True)
		
		# timer
		self.timer = cmds.timerX()
		initPos = cmds.draggerContext(self.dragCtx, query=True, anchorPoint=True)
		
		# camera far clip
		currentView = omui.M3dView().active3dView()
		camDP = om.MDagPath()
		
		currentView.getCamera(camDP)
		camFn = om.MFnCamera(camDP)
		farclip = camFn.farClippingPlane()
		
		# screen to world conversion
		worldPos, worldDir = utils().viewToWorld(initPos[0],initPos[1])
		
		if self.btn is not 2:
			closestHit = None
			closestObj = None
			for obj in self.targetObj:
				if cmds.objExists(obj):
					state, hit, fnMesh, facePtr, triPtr = utils().intersect(obj, worldPos, worldDir, farclip)
					
					if state is True:
						dif = [hit.x - worldPos[0],hit.y - worldPos[1],hit.z - worldPos[2]]
						distToCam = math.sqrt(math.pow(float(dif[0]),2) + math.pow(float(dif[1]),2) + math.pow(float(dif[2]),2))
						if closestHit == None:
							closestHit = distToCam
							closestObj = [state, hit, fnMesh, facePtr, triPtr]
						elif distToCam < closestHit:
							closestHit = distToCam
							closestObj = [state, hit, fnMesh, facePtr, triPtr]
				else:
					self.targetObj.remove(obj)
			if closestObj is not None:
				state, hit, fnMesh, facePtr, triPtr = closestObj
				
				mHit = om.MPoint(hit)
				# get smooth normal
				normal = om.MVector()
				fnMesh.getClosestNormal(mHit, normal, om.MSpace.kWorld, None)
				
				# get smooth normal
				normal = om.MVector()
				fnMesh.getClosestNormal(mHit, normal, om.MSpace.kWorld, None)
				
				tangent = utils().crossProduct(normal,self.worldUp)
				
				upAxis = utils().crossProduct(normal,tangent)
				
				# define transformation matrix
				matrix = [tangent.x,tangent.y,tangent.z,0,upAxis.x,upAxis.y,upAxis.z,0,normal.x,normal.y,normal.z,0,hit.x,hit.y,hit.z,0]
				
				# create object
				if self.mod == 0:
					self.loc = cmds.curve(p = (hit.x,hit.y,hit.z))
				# cmds.toggle(self.loc, localAxis=True)
				
				# store values
				self.prevHit = hit
				print self.prevHit
				
				self.screenPoint = initPos
				
				self.angle = 0
				
				# draw Mesh
				if self.mesh is True and self.mod == 0:
					self.circle = cmds.circle(center = (hit.x,hit.y,hit.z),radius = self.bRad,d=3)
					self.extrude = cmds.extrude(self.circle[0],self.loc,po=1, ch=True,rn=False,et=2,ucp=0,fpt=0,upn=0,rotation=0,scale=1,rsp=1)
					self.nbTes = cmds.listConnections(self.extrude[1] + '.outputSurface')[0]
					
					cmds.setAttr(self.nbTes + '.polygonType',1)
					cmds.setAttr(self.nbTes + '.format',2)
					cmds.setAttr(self.nbTes + '.polygonCount',200)
					cmds.setAttr(self.nbTes + '.uType',3)
					cmds.setAttr(self.nbTes + '.uNumber',1)
					cmds.setAttr(self.nbTes + '.vType',3)
					cmds.setAttr(self.nbTes + '.vNumber',1)
					cmds.setAttr(self.extrude[1] + '.scale',self.taper)
					
					if self.autoAdd is True and self.extrude[0] not in self.targetObj:
							self.targetObj.append(self.extrude[0])
						
		# refresh viewport
		cmds.refresh(cv=True)