Not sure that I missed something in the video but found that the example script doesn’t have a part that transform the joints according to the adjusted mesh.
So I inserted these snippets to the script, hope it helps.
def get_closest_vertex(mesh: str, pos: List[float]):
pnt = om.MPoint(*pos)
sel = om.MSelectionList()
sel.add(mesh)
mdagpath = om.MDagPath()
sel.getDagPath(0, mdagpath)
fn_mesh = om.MFnMesh(mdagpath)
closest_pnt = om.MPoint()
util = om.MScriptUtil()
util.createFromInt(0)
id_ptr = util.asIntPtr()
fn_mesh.getClosestPoint(pnt, closest_pnt, om.MSpace.kWorld, id_ptr)
id = om.MScriptUtil(id_ptr).asInt()
vtx_ids = om.MIntArray()
fn_mesh.getPolygonVertices(id, vtx_ids)
vertex_distances = []
for vtx_id in vtx_ids:
vtxpnt = om.MPoint()
fn_mesh.getPoint(vtx_id, vtxpnt, om.MSpace.kWorld)
dist = vtxpnt.distanceTo(pnt)
delta = om.MVector(pnt) - om.MVector(vtxpnt)
vertex_distances.append([vtx_id, [delta.x, delta.y, delta.z], dist])
return min(vertex_distances, key=lambda x: x[2])
# Collect current joint to vertex position deltas
mesh = dna.meshes.names[0]
reader = load_dna_reader(CHARACTER_DNA)
joints_to_vertices = []
for i in range(reader.getJointCount()):
joint_name = reader.getJointName(i)
pos = cmds.xform(joint_name, q=True, t=True, ws=True)
vid, delta, _ = get_closest_vertex(mesh, pos)
joints_to_vertices.append([joint_name, f"{mesh}.vtx[{vid}]", delta])
# Loaded data - end of 3rd step
##################################
##################################
# Modify rig in maya, 4th step
##################################
# Update joint positions
for jnt, vtx, delta in joints_to_vertices:
vpos_as_vec = om.MVector(
*mc.xform(vtx, q=True, t=True, ws=True)
)
delta_as_vec = om.MVector(*delta)
jpos = vpos_as_vec + delta_as_vec
mc.xform(jnt, t=[jpos.x, jpos.y, jpos.z], ws=True)