0
$\begingroup$

I'm looking for your input/experiences/suggestions using armature actions built for one rig on a different rig.

I have characters -- and related armature actions -- built from various techniques such as:

  • maximo (walk & jog cycles, for example)
  • DAZ imports (some custom-built actions like an arm_stand)
  • MB_Lab (some custom-built actions like riding a bicycle)

I now want to somehow mix and match in a scene that uses some of these characters, for example when an MB_lab and maximo character walk together side-by-side, mixed in the NLA editor.

enter image description here

I can think of several strategies that could send me down the worm-hole:

  1. Add additional/dual armatures as parents to a given character with Automated weights for when I need to apply an action that uses an given armature.
  2. use python to convert action bone references from a foreign rig reference to the characters rig reference.

TWO ARMATURES:

If I have more than one armature as parents to a given character,

enter image description here

I'd be sure that there are no duplicate bone names, so the Vertex Groups are unique for Automated weights. Armature1 would have "foreArm.fk.L" while Armature2 might have "L.foreArm.fk".

enter image description here

When I need to apply an action that uses an given armature, I might have to disable one or other armature modifiers during a range of frames, or might have to temporarily change VGs vertex weights (ouch!)

enter image description here

PYTHON ACTION CONVERSION:

The python-conversion approaches would convert Action bone-references from one armature type to another, with bone-to-bone mappings. This would be complicated by converting actions that use IK in one armature to an armature with no IK, or perhaps easier to add IK to an FK-only armature (maximo). There might be other side-effects or poor animations where one armature has twist and other auxiliary bones.

### set up replacement patterns
def initrep( rep, baseName='' ):
    rep = [ [baseName, "", 0 ] ]    # get rid of basename
    rep.append( ['Pelvis', 'torso', 0 ] )
    rep.append( ['Head', 'head', 0 ] )
    rep.append( ['L Thigh', 'thigh_fk.L', 0 ] )
    rep.append( ['R Thigh', 'thigh_fk.R', 0 ] )
    rep.append( ['L Calf', 'shin_fk.L', 0 ] )
    rep.append( ['L Foot', 'foot_fk.L', 0 ] )
    rep.append( ['R Calf', 'shin_fk.R', 0 ] )
    rep.append( ['R Foot', 'foot_fk.R', 0 ] )
    rep.append( ['Toe01', 'DELETE', 2 ] )
    rep.append( ['Toe11', 'DELETE', 2 ] )
    ... etc ...
$\endgroup$

1 Answer 1

2
$\begingroup$

The usual way is to perform a "Retarget" operation, so that an animation built over an armature is transferred to another armature; changing names of bones and armature modifier is not enough, because also differences in rest pose of the 2 armatures have to be taken into account, expecially rotations.

There are many ways to perform a retarget, both manually or using addons, the most popular is probably AutoRigPro.

$\endgroup$
1
  • $\begingroup$ Looks like an affordable winner. $\endgroup$
    – james_t
    Commented Dec 8, 2022 at 21:23

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .