2 minutes
Copy Vertex Weights
So I wrote this way back in 2015 and I had a lot of people ask about it coming from a YouTube video. This is the old version of the script, I’ll rewrite it to be a bit more streamlined some time soon.
def copy_vertex_weights():
#TODO: make a ui for this so whoever's using it can set the minimum distance between verts that need
# to share vertex weights
# Any vertices closer together than this distance will share the same vertex weight
copyDistance = 0.7
# Make sure that the selection is converted to vertices
cmds.select(cmds.polyListComponentConversion(cmds.ls(selection = True, flatten = True), toVertex = True))
selection = cmds.ls(selection = True, flatten = True)
# Two lists to store the vertices of both the head and the body edges
first_object_vertices = []
second_object_vertices = []
for i in xrange(0, len(selection) / 2):
vertex = Vertex(selection[i])
first_object_vertices.append(vertex)
for i in xrange(len(selection) / 2, len(selection)):
vertex = Vertex(selection[i])
second_object_vertices.append(vertex)
# Iterate over both lists to find vertices that are close enough together to share weights
for first_vertex in first_object_vertices:
for second_vertex in second_object_vertices:
if get_distance_between_vertices(first_vertex, second_vertex) < copyDistance:
cmds.select(first_vertex.name)
mel.eval('artAttrSkinWeightCopy;')
cmds.select(second_vertex.name)
mel.eval('artAttrSkinWeightPaste;')
def get_distance_between_vertices(vertexA, vertexB):
# distance between 2 points in 3D is
#
# squareRoot[ <(point1.x - point2.x)^2> + <(point1.y - point2.y)^2> + <(point1.z - point2.z)^2> ]
#
vertexAx, vertexAy, vertexAz = vertexA.get_world_position()
vertexBx, vertexBy, vertexBz = vertexB.get_world_position()
distance = ((vertexAx - vertexBx) ** 2 + (vertexAy - vertexBy) ** 2 + (vertexAz - vertexBz) ** 2) ** 0.5
return distance
class Vertex:
"""
Tiny little class to treat the vertices as objects
"""
def __init__(self, name):
self.name = name
def get_object_name(self):
return self.name.split('.')[0]
def get_world_position(self):
return cmds.pointPosition(self.name, world = True)
def print_debug_info(self):
print "Name: " + self.name
print "Object Name: " + self.get_object_name()
print "World Position: " + str(self.get_world_position())
copy_vertex_weights()
Read other posts