import pymel.core as pm ignore_below = 0.0001 meshes = pm.selected() if len(meshes) > 0: for mesh in meshes: #use a quickie MEL command to get the skincluster skin = pm.mel.eval('findRelatedSkinCluster %s' % mesh) #get the max allowed influenced for the current skinCluster max_influences = pm.PyNode(skin).getMaximumInfluences() #empty list to hold a pair for transform value transform_value =  #get the total number of vertices in the selected mesh total_verts = pm.polyEvaluate(vertex=True) for i in xrange(0, total_verts): transform_value =  vertex = "%s.vtx[%s]" % (mesh, i) trans = "%s %s" % (skin, vertex) influences = pm.skinPercent(skin, vertex, ignoreBelow = ignore_below, query = True, transform = None) values = pm.skinPercent(skin, vertex, ignoreBelow = ignore_below, query = True, value = True) # if there are more entries in the transform values list than we have allowed influences # we know we're going to have to delete some if len(transform_value) > max_influences: #sort the transform value list from small to big, based on the second entry of the pair (value) transform_value.sort(key = lambda list: list) #add a transform value pair to our list for j in xrange(0, len(influences)): tv = [influences[j], values[j]] transform_value.append(tv) #figure out how many extra influences there are extra_influences = len(transform_value) - max_influences print "Found %s influences too many on %s" % (extra_influences, vertex) #loop through all these extra influences for k in xrange(0, extra_influences): joint_name = str(transform_value[k]) value = transform_value[k] #and set their influence to 0 print "Removing: %s, value: %s" % (joint_name, value) pm.skinPercent(skin, vertex, transformValue = [joint_name, 0], normalize = True) pm.select(None)
I adapted a script that was written in MEL to remove extra influences on particular vertices on a skinned mesh. Mostly because it didn’t always work on my machine and I didn’t want to try and figure out why… I don’t like having to edit MEL code and avoid it where I can 🙂
When you set up your skinCluster and very carefully tell Maya to not go over your maximum allowed influences per vert, Maya doesn’t always listen. Most likely floating point rounding errors creep in when painting skin weights and normalizing the skinCluster. Most times you don’t know really care about these extra influences because their values are usually extremely small ( < 0.001). However, if for whatever reason you need to get rid of these extremely small values and don't want to prune weights, you can use something like this to remove only the smallest influences depending on how many influences are allowed for your skinCluster.