Animation Techniques used in Paragon and January Game Jam Theme Announcement - Live From Epic HQ

Thank you.

One more question then, because I don’t think it was asked on stream.

Is the animation prediction also going to be added into main branch ? IT’s really brilliant how it get rid of root motion for movement, and would also be super usefull.

Will there be some example content for doing the capsule-marking? Using this as a pseudo-root-motion looks amazing.

I second this. Watching this stream was the worst tease.

Incredible techniques for working with animations. With Paragon we can play and learn, excellent!. Thanks again!

Hahah I know right! :stuck_out_tongue:

Hey guys,

You said that you use the distance curve in your animation to do a kind of inverse root motion, where the curve dictates the animation frame. That being said, how do you find the proper spot on the curve? You take the distance from your dropped pivot and… iterate over the entire curve until you find the right spot?

Hi guys,

I also have the same doubt, how do you find the proper spot on the curve? I mean, how do you calculate the Explicit Time that you use to Evaluate the animation sequences ??

Thanks again for sharing those with us !

We do a binary search on the distance curve. We have several assumptions:

  1. a key per frame of animation.
  2. linear interpolation in between keys, just like animation.
  3. distance curve values are in increasing order.
  4. we don’t have duplicate values, except for the stop transition when it reaches zero.

Thanks for the info! Of course, this brings up the question if there is some function not currently available in the public engine that allows getting arbitrary values in the curve? In my engine all I can is get the value at the current frame.

Hi @LDelayen,

Thanks again for sharing those with us !

Help me to clarify things a little bit please.

So, You loop from 0 to animation-time-length and using float Value = FRichCurve::Eval(float Time) to evaluate the curve and get the value. When Value is equal to your current capsule rotation (for example, assuming that we are doing this for the turn animation) then you finish the search and evaluate the anim sequence using that Time.

This is the idea ? and you do this inside the Tick ? is not a problem in term of consuming CPU or the binary search algorithm is enough to find very quickly the value ?

Please, help me to clarify this.

PD: Sorry for my english

Thanks so mush !!

ncn2cc - that seems to be the case. Binary search would find the correct value in 4-5 steps at most…

I read the key frames directly. Since we assume linear interpolation in between keys, we can easily derive intermediate positions in between keys.

Look at FRichCurve::GetCopyOfKeys() or FRichCurve::GetConstRefOfKeys()

>> So, You loop from 0 to animation-time-length and using float Value = FRichCurve::Eval(float Time) to evaluate the curve and get the value.

no, I do a binary search on the keys directly. Evaluating the curve is slow, and we assume linear interpolation in between keys. So I just need to find the bounding keys, and do a lerp.
We don’t have that many keys in these animations, so the binary search is pretty fast. It hasn’t shown up on our profiles as something significant.

The basic idea is my distance to the marker is 12 units, I want to find the position in the animation where the distance curve is 12.
I do a binary search for the bounding keys around that value. Let’s say I find Key3 (9) and Key4(13). I then do a lerp to find the correct time in the animation,

Here’s the code for that function, it’s fairly straight forward:

This is invaluable! Thank you so much!

Hi @LDelayen,

Again, thanks you so so sooo much for sharing this !! as @DamirH said, this is invaluable !! :slight_smile:

Thanks you so much !!

Cheers for the talk and the help @LDelayen some really great stuff you doing for Paragon.

I was wondering if you had multiple out transition animations based on what foot you leave the loop locomotion animation or does the blend between the two animations cover any problems?


Hi Laurent Delayen,

Today I joined to the Early Access because I could not wait to “touch and feel” Paragon, mainly the animations part. And, first of all: Great work guys !!

One thing that blows my mind and I can’t figure out how do it, is the attack animation when you are walking.

For example, Steel has a Melee Attack Animation in place. If you are in Idle, and you press the attack button, the animation is played in place, I think that basically is a montage played on all the full body, isn’t ?

But … the awesome part is when you start moving and attack, I’m completely sure that is not a simple Layered blend per bone :). I think that you do some Addictive because you can see a kind of blend between attack animation and walk animation on the legs and the full attack animation on the upper body, against man, it look AWESOME !!

Can you explain a little bit how you implement that part, please ??

I was watching again and again the “Animation Techniques used in Paragon” video, trying to find where you do it, but I can’t see it, I think that probably is where you “Take out legs” with some UpperBodyMeshSpaceAdditive StateMachine plus Layered Blend per bone plus more Additive and a bunch of other stuffs XD … Please, I will appreciate so much if you can explain us a little bit deeper how you get that wonderfull blend when you attack and walk.

Sorry for my english.

Thanks so much

Best regards.

ok Epic. Please for the humankind love, show me how did you do those turn animations logic!!! PLEASE!!!

This is amazing techniques, want to see some tools for operations like this in engine!

I wonder if there is some detailed resource to follow in order to make real use of this techniques.
The concepts are awesome, but is really hard to implement.