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
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
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
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 )