Anim Transaction Curve Blend problem

Hello guys,
Recently been trying to make an Animation System which working with some Animation Curves (Distance, Pivot etc…)
And my problem is the next:
Let’s say I want to move from Moving(start state) to the Stop(desination state) state with a 0.2 transition time.
The Stop state’s animation will have a Curve called: Distance (which will start from -400 and goes to 0)
The problem with this solution is the 0.2 transition time, as its will try to Blend the Curve values by their own weight.
ex.:
[Moving] state do not have a Curve called Distance (so basicaly it’s value is ZERO (0);;; The [Stop] state’s distance Curve however will start from -400 and will go to 0 (like when you stop, you want step a few more steps, and ‘push’ your character). BUT the problem is starting from here. The state machine will try to blend these curves at the transition by their own weight: So when you already left the [Move] state, you want to transmit to [Stop] at first the weight of the [Stop] will be zero and just after the transmition’s time will be 100%. This will cause the curves to be blended together when I don’t want them to be blended.

Left [Move]: (sec 0):

Move weight: 100%
Stop weight: 0%

So my curves will be ZERO here

Left [Move]: (sec 0.1)

Move weight: 50%
Stop weight: 50%

My curves at 100% is 400, so at 50% its will be 200, and WILL just this much in an instant, which will cause stupid things.

So somehow I just want use the destination state’s anim curve, and do not want them to be blended together with the start(from) state.

Hullo! I’m guessing you’re recreating the Reverse Root Motion concept described by the Paragon animation guys–me too!

Ran into that problem as well and the solution is slightly unfortunate…

Those metadata curves you’re using that exist in the anim asset–try copying them into Float Curve Assets and read the data from there. The copying-over is a bit of a hassle, but it’s a clean solution and I don’t see it being significantly more expensive than the metadata setup. (Best of all, no blends to worry about here!)

If that’s the way you want to go, I saw a useful tool on the marketplace for extracting root motion data that might speed up the process:

Best of luck!

Hi Jin_VE,

  1. How would one drive the curve so it matches the animation?

So in my case (using Reverse Root Motion), I was not using the animation to drive my curve. Instead, I was using a third element (a float value) to drive my curve–which in turn drives my animation.

Imagine we’re trying to drive an Idle-To-Run animation such that the feet never slide on the ground. Steps:

  • When the character collision capsule moves out of rest position, start keeping a counter that accumulates the change in position between frames. This is your Distance Traveled value. This accumulated counter value will also be your driver value–that third float we spoke of earlier.
  • Now plug your float driver into your Curve. The Curve’s axes are thus: X represents distance traveled, Y represents playback position of animation. When you plug in your float driver (Distance Traveled) into the Curve, it will spit out the proper playback position of your animation.
  • You can use this playback position to drive your animation explicitly. Just in case you’re not sure how, you can convert an Anim Node in your Anim Graph to be driven by a float like so: Right click on the Anim Node, click “Convert To Single Frame Animation”. This should give the Anim Node a float pin you can plug into.

Back to the original question: if you wanted the curve to match the animation, there SHOULD be a way to read an animation’s current playback position (which would be used to drive your curve)… but if my memory serves me correctly, I ended up getting stumped by that too… Not sure if this helps, but I remember there’s a way to drive state-machine transitions with a node that tracked the current animation’s playback percentage–might be a dead end though…

  1. It’s ridiculous that we can’t get the actual curve without weighting!!

I agree… I tried by hook, I tried by crook… Nothing. But that was a few months ago, maybe there’s a workaround now??? (Wouldn’t bet on that…)

If the curve is outside the animation then how would one drive the curve so it matches the animation? And it seems pretty ridiculous to me that we can’t get the actual curve without weighting.