How to create a responsive but realistic locomotion for animals?

I start this topic because seems impossible to find any kind of tutorial, guide or topic about animal locomotion (apart from rootmotion).

  • I’ve tested rootmotion and isn’t at all what i need (no flexibility for movement speed, turn or pivots, hard to replicate, etc).
  • I’ve tried distance matching, but all the tutorials, guides or plugins are focused on humanoid characters, usually 8 direction movement (i don’t want strafing) and aren’t even complete, so i find myself on a dead end at some point far from the result i want.
  • After watching some videos and demos about motion matching it feels like the best way to achieve it but it isn’t that flexible since it uses a pose library and the animation play rate can’t be changed in runtime.

To put it in perspective, i take as example the game i’ve seen with the best locomotion for animals (for me), The Isle Evrima. Anyone has any idea of how they did it or how to achieve something similar that feels natural and also responsive? It looks like distance matching for me but i can’t even get to the point where my character turns, stops and changes direction like that.

was wondering the same, did you find any answer yet?

Well i made it so that if the animal gets to -37 or 37 direction it activates a function in character blueprint. That function slows character down. And the other function when turning is inactive, it makes a finterp to node to get back to normal speed SMOOTHLY. (Turning anims are in the base blendspace.).For braking its really similar. i play evrima too its really amazing

That activation function happens in anim bp*

also mess with deceleration speed in movement component and acceleration speed, they affect rhe turning a lot

More or less… Isn’t as good as i would like but decent enough for now.

CharacterMovement:
Max Acceleration 512
Braking Deceleration Walking to 1512
Rotation Rate Z=180

For the logic:
I call that function on tick to calculate Z rotation (after checking if movement input is >0).


This is the curve to set MaxYaw:

That DIrection variable is the one called in the AnimBP for the blendspaces along the speed.
The function called afterwards to set movement input:

As doplerwastaken said all animations are in the same blendspace. Horizontal Axis is -180 to 180.
Vertical is the usual idle at 0, 0 to sprint at max and whatever speeds in between.
Animations forward left and forward right at -45/45, all speeds except 0.
Turn in place 90 from -60/60 to -90/90, all speeds.
And turn in place 180 at -120/120, all speeds.

That’s the logic, the values work for me (for my only character as of right now at least) but needs a lot of test and repeat depending on the desired turn rate, which would need different values on the curve, different interpolation speed to calculate the direction, play rates for the animations, smoothing times for the blendspace, etc.

And for sure I’m open to any idea to improve it.

1 Like

Ive made it amazing like literally amazing, still isnt exactly same as evrima but its close. First off ofc there has to be different values to turn/brake when running or trotting. Turns should be a blendspace 1d and 2 blendspaces left and right. -180 to zero for left, and 0 to 180 for right. 90 degree should be in 5 something, then again 90 degree turn in like 106.something value in blendspace, then immediately 180 degree anim right after the 90 degree, which islike 112 value. Then, everything should be with an interpolation. for me btw turn rot speed walk rot trot rot run rot is compeletely different but they arent interpolated. And, the most important part, turning should take in place if you are REALLY turning.Basically when you are going tooo left (or right) it should first smoothly go to walk, then turn. if you are running the same should happen with interpolation lol.
But then i ran into an issue Evrima has, dino snaps between turn and walk a little when you are in the border of it.

Anim Graph is like this btw, I DONT have the idle anim in the blendspace, i have a locomotion machine state and a cache pose of it, that state machine has the idle and the transisiton to the blendspace. so that it can reset time of blendspace and restart when it actually had to. I made 2 turn blendspaces so that each blendspace can change between without stripping the other turn anim’s frames and making it “smooth”. The transition rules are like get the bp class of char , if turning and blabla.
Btw turn brake turn stop functions are no longer in anim bp coz its so much of a code now, its in the dino bp. Yea im making a dino game and allllll these values changes with growth lmfao

Im not at home right now iyw i can show some code of turn functions and the calculation of turn limit direction n stuff, ots a messy code tho lmao

I have made a system (not released) to create realistic quadruped animations. It is mostly procedural and need only 1-2 animations to function. I plan to expand it to have a fully procedural capability with artistic control

I recommend a plugin called MoveIt, it had a turning radius and sliding animations similar to the isle. It’s decently easy to implement them using it.

not worth 40 dollars at all. its a system relatively easy to code. use anim notifys or timeline clamps and def dont use turns in your main blendspace. slides the are easiest thing to do. learn to start and stop montages according to logics and learn to use if statements lol

FINALLY, finalized the system.
It sadly works waay too similar to evrima, but it works.

Your main movement should be based on “circling” turning method (The Isle Legacy", and based on your direction it should turn in place or not. Get every variable that changes your velocity (Walk,Sprint, etc.) and set them to connect to Map Range Clamped. Value will be that variable, In Range A will be 0, or the value you desire for the slowdown angle start of turn in place, In Range B will be the *angle that you turn in place. Out Range A is your (I dont quite remember but its one of these) Max Walk Speed from Character Movement, (or the movement component you use to get the desired velocity), or (low chance) GetVelocity node, Out Range B is 2 but its the speed you want WHILE turning in place, so it should not be 0, to rotate.

This way your speed is ranged accordingly to your angles and supports turning in place. **(FOR THE ISLE EVRIMA ASSETS → ) Also, if you use the “circling” method (which you should), it will be restarting to move after turn in place is finished, without sliding.

Animation part, I dont recommend it for now since im working on a better system, but I am using

> TWO 1D Blendspaces

for both left and right turning for both 90 and 180 degrees.
For example left blendspace:
Horizontal Axis: Turn Angle (Direction)
Minimum Value: 0
Maximum Value: -180
Anim Keys: -180, TurnL180. -105, TurnL180. -104, TurnL90. -2.5 (to not mess with the other blendspace), TurnL90.

I should take a look on this post more often lol but well haven’t paid attention to locomotion for quite a while. But i’m quite interested on your approach, i doubt i could replicate it cause i get kinda lost reading it like that tho so if you don’t mind sharing screens, or let me know if you prefer to contact privately (i’m also making a dino game or trying to lol)

me too. just need this locomotion right :frowning_face:
can’t find a solid lead or tutorial on how this good realistic animal movement is done