Example #1
0
def joints_along_curve(**kwargs):
    number_of_joints = kwargs.get("number_of_joints", 2)
    bind_curve = kwargs.get("bind_curve_to_joint", False)
    curve = kwargs.get("curve", None)

    if not isinstance(curve, pm.PyNode):
        curve = pm.PyNode(bind_curve)
    crv_len = curve.length()
    parts = number_of_joints - 1
    div = float(crv_len) / float(parts)
    len_lst = [0]
    inc = 0
    for i in range(1, parts + 1):
        inc += div
        len_lst.append(inc)
    joint_lst = []
    for val in len_lst:
        pm.select(clear=True)
        param = curve.findParamFromLength(val)
        point = curve.getPointAtParam(param)
        jnt = pm.joint(position=point, radius=3)
        joint_lst.append(jnt)
    if bind_curve:
        pm.skinCluster(joint_lst, curve)
    return joint_lst
Example #2
0
 def skin(self, **kwargs):
     obj = kwargs.get("cur_obj", None)
     ctr = kwargs.get("ctr", None)
     pm.select(clear=True)
     shp = obj.getShape()
     if not shp:
         shp = pm.ls(obj, dag=True, type=["mesh", "nurbsCurve"])
     else:
         shp = [shp]
     if shp:
         for item in shp:
             try:
                 pm.skinCluster(ctr, item)
             except Exception, e:
                 pm.displayWarning(str(e) + " Skipping skin bind operation")
def bind_card( source_mesh, target_mesh, combine=True ) :

	hasskin = True
	try :
		source_skin_cluster = pm.PyNode( pm.mel.eval( 'findRelatedSkinCluster %s' % ( source_mesh ) ) )
		joints = source_skin_cluster.getWeightedInfluence()	
	except :
		hasskin = False
			
	if( combine ) :
		p = target_mesh.getParent()
		dup_source_mesh = source_mesh.duplicate()[0]
		dup_target_mesh = target_mesh.duplicate()[0]
				
		bind_mesh = pm.polyUnite( dup_source_mesh, dup_target_mesh )[0]
		bind_mesh.rename( target_mesh.name() )
		pm.delete( bind_mesh, ch=True )
		try :
			pm.delete( dup_source_mesh )
		except : pass
	else :
		bind_mesh = target_mesh

	if hasskin :
		target_skin_cluster = pm.skinCluster( bind_mesh, joints )	
		pm.copySkinWeights( source_mesh, bind_mesh, ia='oneToOne', sa='closestPoint' )

		pm.select( bind_mesh )
		th_skinClusterMerge.reduce_influences()
	pm.select(None)
 def skin(self, **kwargs):
     skip = kwargs.get("skip", 0)
     jnt_lst = kwargs.get("joints", [])
     vert_lst = kwargs.get("vert_lst", [])
     skin_cluster = self.get_skin_cluster(node=self.shape_node)
     pm.select(clear=True)
     if not skin_cluster:
         skin_cluster = pm.skinCluster(jnt_lst[0],
                                       self.shape_node,
                                       toSelectedBones=True)
         self.add_influence(skin_cls=skin_cluster, inf_lst=jnt_lst[1:])
     else:
         self.add_influence(skin_cls=skin_cluster, inf_lst=jnt_lst)
         """
         influence_objects = skin_cluster.getInfluence()
         for inf_obj in influence_objects:
             pm.skinCluster(skin_cluster, edit=True, influence=str(inf_obj), lockWeights=True)
         skin_cluster.addInfluence(jnt_lst)
         for inf_obj in influence_objects:
             pm.skinCluster(skin_cluster, edit=True, influence=str(inf_obj), lockWeights=False)
         """
     if skin_cluster.getMaximumInfluences() < 2:
         skin_cluster.setMaximumInfluences(2)
     jnt_index = 0
     jnt = str(jnt_lst[jnt_index])
     for verts in vert_lst:
         if (vert_lst.index(verts) > 0) and (vert_lst.index(verts) %
                                             (skip + 1) == 0):
             if skip < (len(jnt_lst)):
                 jnt_index += 1
                 jnt = str(jnt_lst[jnt_index])
         for vert in verts:
             pm.skinPercent(skin_cluster, vert, transformValue=(jnt, 1.0))
     return None
Example #5
0
def bind_card(source_mesh, target_mesh, combine=True):

    hasskin = True
    try:
        source_skin_cluster = pm.PyNode(
            pm.mel.eval('findRelatedSkinCluster %s' % (source_mesh)))
        joints = source_skin_cluster.getWeightedInfluence()
    except:
        hasskin = False

    if (combine):
        p = target_mesh.getParent()
        dup_source_mesh = source_mesh.duplicate()[0]
        dup_target_mesh = target_mesh.duplicate()[0]

        bind_mesh = pm.polyUnite(dup_source_mesh, dup_target_mesh)[0]
        bind_mesh.rename(target_mesh.name())
        pm.delete(bind_mesh, ch=True)
        try:
            pm.delete(dup_source_mesh)
        except:
            pass
    else:
        bind_mesh = target_mesh

    if hasskin:
        target_skin_cluster = pm.skinCluster(bind_mesh, joints)
        pm.copySkinWeights(source_mesh,
                           bind_mesh,
                           ia='oneToOne',
                           sa='closestPoint')

        pm.select(bind_mesh)
        th_skinClusterMerge.reduce_influences()
    pm.select(None)
 def add_influence(self, **kwargs):
     skn_cls = kwargs.get("skin_cls", None)
     jnt_lst = kwargs.get("inf_lst", [])
     #skin_cluster = self.get_skin_cluster(node = self.shape_node)
     influence_objects = skn_cls.getInfluence()
     for inf_obj in influence_objects:
         pm.skinCluster(skn_cls,
                        edit=True,
                        influence=str(inf_obj),
                        lockWeights=True)
     skn_cls.addInfluence(jnt_lst)
     for inf_obj in influence_objects:
         pm.skinCluster(skn_cls,
                        edit=True,
                        influence=str(inf_obj),
                        lockWeights=False)
     return None
Example #7
0
	def create( self, _jointchain=None ) :		
		super( SplineIkRig, self ).create( _jointchain )
		
		jointchain = self.tree_children( 'jointchain' )[0]

		# get start and end joints
		rigjoints = jointchain.rigjoints		
		
		# # create controls and store start/end controls/rigjoints
		controlsdriverslist = []
		for i, rigjoint in enumerate( [ rigjoints[0], rigjoints[-1] ] ) :		

			# create control
			control = RigControl( n=rigjoint.name() )
			control.setRotationOrder(
				utils.aim_axis_to_rotate_order( settings.rotationorder ),
				False
			)
			control.position_to_object( rigjoint )
			self.add_child( control )

			# create driver joint and store it with it's corresponding control
			driverrigjoint = rigjoint.duplicate(
				n=utils.name_from_tags( rigjoint, 'spline', 'driver' )
			)[0]
			self.add_child( driverrigjoint )
			controlsdriverslist.append( ( control, driverrigjoint ) )

		startjoint = jointchain.rigjoints[0]
		startdriver = controlsdriverslist[0][1]
		endjoint = jointchain.rigjoints[-1]
		enddriver = controlsdriverslist[-1][1]

		# create ik spline between them
		ikhandlename = utils.name_from_tags( startjoint, 'ikhandle' )
		ikhandle, ikeffector, ikcurve = pm.ikHandle( 
			startJoint=startjoint, 
			endEffector=endjoint,
			solver='ikSplineSolver',
			numSpans=len( jointchain.rigjoints ) - 1,
			name=ikhandlename
		)
		ikeffector.rename( utils.name_from_tags( endjoint, 'ikeffector' ) )
		ikcurve.rename( utils.name_from_tags( startjoint, 'curve' ) )
		self.add_child( ikhandle )
		self.add_child( ikcurve )

		# bind curve to driver joints
		tobind = [ ikcurve ] + [ i[1] for i in controlsdriverslist ]
		pm.skinCluster( 
			tobind,
			bindMethod=0,
			maximumInfluences=len( tobind ) - 1,
		)

		# set twist control
		ikhandle.dTwistControlEnable.set( True )
		ikhandle.dWorldUpType.set( 4 )
		startdriver.worldMatrix[0] >> ikhandle.dWorldUpMatrix
		enddriver.worldMatrix[0] >> ikhandle.dWorldUpMatrixEnd

		# parent drivers to controls
		for control, driver in controlsdriverslist :
			pm.parentConstraint(
				[ control, driver ],
				mo=False
			)