This is amazing!!
Maybe you can use animation blending with a coroutine to smooth the character animation.
Here is a piece of code that may help you:
function* animationBlending(fromAnim, fromAnimSpeedRatio, toAnim, toAnimSpeedRatio, repeat)
{
let currentWeight = 1;
let newWeight = 0;
toAnim.play(repeat);
fromAnim.speedRatio = fromAnimSpeedRatio;
toAnim.speedRatio = toAnimSpeedRatio;
while(newWeight < 1)
{
newWeight += 0.01;
currentWeight -= 0.01;
toAnim.setWeightForAllAnimatables(newWeight);
fromAnim.setWeightForAllAnimatables(currentWeight);
yield;
}
}
// Run Coroutine //
//scene.onBeforeRenderObservable.runCoroutineAsync(animationBlending(fromAnim, 1.0, toAnim, 1.0, true));