1
$\begingroup$

I have worked out a way to combine two CMU animations where the final and start local locations and rotations around the same world position is different.

To clarify, if I import the bvh for 2 different animations, A & B, the end position of the armature will be facing a different direction and in a different location around the origin point. To join the animations, I copy and paste the keyframes from one bvh armature to the other. The armature jumps from one position (the end of animation A) to another (the start of animation B) at the join between the 2 animations.

Combined CMU animations

To fix the jump, I parent the armature to an empty with the exact rotation and location as the hips (I call position offset). (TIP: I do this actually by parenting the empty to the armature/hips (the root bone) FIRST and the removing parent but keeping transformation). Then I repeat the process for the target location. I then use an object constraint (copy transforms) for the empty the armature is parented to and set the influence to change from 0 to 1 at the exact frame of the switch between the 2 animations....when the armature jumps to a new position.

The armature then inherits the exact position of the first animation, the hips having the exact same world loc/rot as the end of animation A. It works perfectly. Then, making sure not to include the hips in this, you can smooth using option-O all the jumps of the other bones and the 2 animations blend seamlessly together. It actually works really really well.

N.B. You have to transform the hips/armature at object level - ie object constriants, it won't work with bone constraints.

N.B. Be sure not to smooth the hips keyframes! They have to be exact, the last position for the first animation and the first position for the second. Then your empty will move them to the exact right position and you'll get a seamless transition.

However:

I would ideally like to be able to export this as a new animation. It isn't possible unless you attach empties to each of the bones and export those as a bvh, but that's too fiddly. If you simply export the animation, the new loc/rot position isn't carried over. Baking doesn't work.

But if I could lock the NLA strip of the Object Constraint to the armature animation, then I could move the NLA strip around without worrying about the position of the animation of the object constraint.

To do this, according to the manual, I can group them and turn them into a "Meta-Strip" and they should theoretically move together. However it does not work. As soon as you select the armature (to select the NLA strip) and move the strip, the object constraint animation does not move together with the animation strip.

Does anyone 1) know of a way to lock the NLA strips, 2) a way to bake the entire animation into 1 strip 3) a better more efficient way of combining animations like this?

$\endgroup$

1 Answer 1

1
$\begingroup$

It sounds to me like the problem is mostly one of, how to get this animation exported conveniently, without the animation depending on inheriting from a bunch of empties.

There is a pretty simple way to do this, starting from the file that you have:

  1. On first frame, unparent the armature object.

  2. Go to first frame of "second" action (looks like you've already merged them.) Disable the copy transforms constraint on your marker for the second root, "Empty - X-bot Position Offset". Give your root bone a child-of bone constraint targeting this empty. (Blender should set the inverse automatically.)

  3. Re-enable the copy transforms constraint on the empty. Play your animation and check.

Now, the animation no longer depends directly on inheriting the transforms of any empties, so those empties are not necessary to the animation once your export bakes visual transforms.

If exporting is not the issue, and you want to move this action around on the timeline, you can simply bake the root bone ("bake action": selected only, visual keying, clear constraints, replace action) to write the the child-of into the action.

I'm not sure that this is the best technique for dealing with this on a more general, long-term basis, but for what you already have and for your immediate needs, it seems like the simplest solution.

$\endgroup$
4
  • $\begingroup$ I am looking forward to trying this, but can you point to a better technique for combining 2 CMU animations (or simply 2 animations that have different local positions finishing and ending around the same origin point)? I tried adjusting the keyframes for the hips to match the start and end, but it completely messed up the animation. $\endgroup$ Feb 21 at 22:23
  • $\begingroup$ Oh I re-read your reply. I have already tried a child of bone constraint in the manner you suggest and it does NOT work. What will happen is the hips will be pinned to that location and not move. I will double check tomorrow but I am 95% sure this will not work. Did you try it? $\endgroup$ Feb 21 at 22:24
  • 1
    $\begingroup$ @DrignatiusCole I tried it. I'm describing what I did. Tested on a fresh copy of your file. Hips will move because the empty they are a child of will move. $\endgroup$
    – Nathan
    Feb 21 at 23:07
  • $\begingroup$ Thanks, but thanks to your post it gave me another idea to try which I think works better. Using the same technique of passing on the correct rotation and position via parenting, I set a key frame for the armature at object level for the last frame of the 1st animation, I then set object KFs. That means all KFs are associated with the armature rather than mixed. I could then bake the animation....on baking in the NLA editor, you have to select pose AND (shift-click) object and visual keying. I then had a complete action I could append. $\endgroup$ Feb 22 at 9:56

You must log in to answer this question.

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