TLDR:
Exporting deformer weights using cmds.deformerWeights
only works for deformers influencing one object.
Except with a regular expression in the skip argument to skip anything except the imported deformer name.
Set up the example scene: Two poly cubes being 100% influenced by one cluster. The cluster moves up and down to visualize the influence.
cmds.file(f=True, new=True) # create 2 cubes cube1 = cmds.polyCube(ch=False)[0] cmds.move(-2, 0, 0) cmds.rotate(0, -90, 0) cube2 = cmds.polyCube(ch=False)[0] cmds.move(2, 0, 0) cmds.rotate(0, -90, 0) # create a cluster that affects both cubes cmds.select(cube1, cube2) clu, cluHandle = cmds.cluster() cmds.setKeyframe(cluHandle, at='ty', time=0, value=0) cmds.setKeyframe(cluHandle, at='ty', time=24, value=0.5) cmds.setKeyframe(cluHandle, at='ty', time=48, value=0)
Let’s set some weights we can export.
# weights the verts 0-3 on cube1 and 4-7 on cube2 to 0 for vertexNo in range(4): cmds.percent(clu, '%s.vtx[%s]' % (cube1, vertexNo), value=0) cmds.percent(clu, '%s.vtx[%s]' % (cube2, 7-vertexNo), value=0)
Now the inner parts of cube1 and parts of cube2 move with the cluster.
If we export these weights the regular way we only get the weights for cube1
cmds.deformerWeights('weightsRegular_%s.xml' % clu, path='/tmp', deformer=clu, ex=True) # Let's test the export: with open('/tmp/weightsRegular_%s.xml' % clu, 'r') as fh: for line in fh: print line,
Only the weights for cube1, sadly
What happens if we import this?
# set all weights to 0 before importing for vertexNo in range(7): cmds.percent(clu, '%s.vtx[%s]' % (cube1, vertexNo), value=0) cmds.percent(clu, '%s.vtx[%s]' % (cube2, vertexNo), value=0) cmds.deformerWeights('weightsRegular_%s.xml' %clu, path='/tmp', deformer=clu, im=True)
The same weights were imported onto cube1 and cube2 because only cube1 was exported
How do we fix this? We use a regular expression with the skip argument to skip anything except the exported deformer name:
# restore all weights to before exporting again for vertexNo in range(7): cmds.percent(clu, '%s.vtx[%s]' % (cube1, vertexNo), value=1) cmds.percent(clu, '%s.vtx[%s]' % (cube2, vertexNo), value=1) for vertexNo in range(4): cmds.percent(clu, '%s.vtx[%s]' % (cube1, vertexNo), value=0) cmds.percent(clu, '%s.vtx[%s]' % (cube2, 7-vertexNo), value=0) # export weights for clu on cube1 AND cube2 # we use a regular expression with the skip argument to skip anything except the exported deformer name cmds.deformerWeights('weightsSkip_%s.xml' %clu, path='/tmp', deformer=clu, ex=True, skip=('?!%s' % clu))
Let’s test the export:
with open('/tmp/weightsSkip_%s.xml' % clu, 'r') as fh: for line in fh: print line,
Now we’ve got the weights for cube1 AND cube2
Let’s test by importing the weights. Again we use a regular expression with the skip argument to skip anything except the imported deformer name.
# set all weights to 0 before importing for vertexNo in range(7): cmds.percent(clu, '%s.vtx[%s]' % (cube1, vertexNo), value=0) cmds.percent(clu, '%s.vtx[%s]' % (cube2, vertexNo), value=0) # import weights for clu back on cube1 AND cube2 # again we use a regular expression with the skip argument to skip anything except the imported deformer name cmds.deformerWeights('weightsSkip_%s.xml' % clu, path='/tmp', deformer=clu, im=True, skip=('?!%s' % clu))
And that’s how it’s supposed to look. Exactly like what we exported.
Comments are closed.