blender animation preview vs in-engine playback: why does it never feel the same

488 views 12 replies

The disconnect between Blender's animation preview and what you actually see after importing into Unity or Godot is one of those things that never fully goes away no matter how long you've been doing this. You get the timing right in the viewport, export the FBX, and something feels just slightly off on the other side.

The most common culprit in my experience is interpolation. Blender's F-curves default to Bezier with auto-handles, which creates smooth ease-in/ease-out on everything. Unity's Animator imports curves and tries to preserve the Bezier tangents, but the reconstruction isn't perfect, especially on curves with tight timing or extreme handle angles. Godot is even more aggressive: depending on your import settings, it can snap curves to linear, and if you haven't explicitly enabled import as Bezier you're suddenly getting hard steps between keys and wondering why everything feels robotic.

The frame rate mismatch is real too, and people don't talk about it enough. If Blender is set to 24fps and your engine runs at 60fps, the engine interpolates between keyframes at a much finer resolution than you timed for. A snappy smear you built around hitting on a specific frame doesn't land the same way. My workaround has been to just work at 60fps in Blender, controversial maybe, but it's the only thing that's actually kept timing consistent for me.

Root motion is its own category of pain. Blender doesn't have a native root motion extraction system the way Unity does. You animate movement in world space, then you're either baking it into a dedicated root bone before export or relying on Unity's Animator to extract it, and both approaches can introduce subtle timing drift if your root bone has any sub-frame offsets or the extraction settings don't match your intent.

I've been thinking about writing a small preflight checker, a Blender script that validates keyframe timing against a target frame rate and flags keys that fall between engine frames. Something to catch the obvious mismatches before export rather than after. Has anyone built something like this, or found a cleaner way to keep Blender preview and in-engine playback genuinely aligned?

Replying to PixelTide: one thing that doesn't get mentioned enough: playback framerate. blender default...

the framerate mismatch thing catches so many people. had a project where blender was stuck at 24fps preview and the game ran at 60, and the animation felt sluggish in-engine even though it looked completely fine during playback. keyframe density just wasn't right for the target rate. baking to 60fps before export fixed it but it's the kind of thing you shouldn't have to remember manually every time. current workflow is just "don't forget this step" which is not a workflow. groundhog day alarm clock repeat

biggest culprit for me is always curve interpolation. blender defaults to bezier basically everywhere, but FBX export to unity or godot doesn't preserve the bezier handles. the engine samples curves at whatever bake rate you set and reconstructs from those positions. so all that nice eased-in shoulder rotation that reads beautifully in the viewport gets flattened to linearly interpolated samples in-engine.

the fix is either baking to euler + linear in blender before export (predictable, but you lose the feel) or internalizing that you have to block with the engine's curve interpretation in mind rather than blender's. neither is satisfying. i've mostly landed on linear in blender and accepting that i do more in-engine polish than i used to.

the frame rate mismatch problem is real too but at least that one has a clean answer: match your blender scene fps to your engine target before you start animating, not after.

Replying to BlazeLeap: yeah this bit me so hard on my first real project. armature had a -90 X rotation...

The -90 X rotation thing is genuinely a Blender rite of passage. What finally killed it in my pipeline: a small export check script that throws a visible error if any selected armature has a non-identity object transform. Forces whoever's exporting to apply transforms before anything leaves Blender. Ctrl+A > All Transforms takes five seconds, but the problem is always remembering to do it, so making it a hard blocker solved it. If you're solo it's easier to just add it to your export checklist and be ruthlessly consistent, but the script is better if anyone else touches the files.

Replying to VelvetReef: one thing i haven't seen mentioned: lighting. in Blender you're usually previewi...

yeah and it's weirdly hard to explain to non-animators why lighting affects perceived timing specifically. a weight shift that reads fine under flat blender lighting can feel sluggish in-engine because the specular highlight on the shoulder is lagging behind your eye's read of where the motion ends. you end up tracking the brightest point, not the bone position.

hit this hard on a character with metal armor. animation was fine in blender, but in-engine the specular blob was dragging and the whole take suddenly felt floaty. ended up having to push the anticipation earlier just to compensate for how the shading was reading. never thought i'd be retiming animation to account for specularity but here we are.

one thing i haven't seen mentioned: lighting. in Blender you're usually previewing under a flat HDRI or a matcap with basically uniform illumination. in-engine the character is lit by actual scene lights, strong directionals, shadow maps, whatever your level is doing. and lighting direction changes how you read silhouette and perceived weight. an arm swing that reads clearly under neutral studio lighting can feel completely muddy when there's a strong backrim eating the edge of the limb, or a harsh side key that flattens the silhouette mid-arc.

technically the animation data is identical. but your brain interprets motion differently based on what information it can extract from the image. not something you can fix in Blender preview. it's just a fundamental context mismatch. worth keeping in mind when something feels off after import and you can't figure out why.

Replying to PulseLynx: biggest culprit for me is always curve interpolation. blender defaults to bezier...

yeah and the fix is tedious but predictable: add extra keyframes manually at the midpoint of transitions that feel mushy after import. blender evaluates those bezier handles correctly, the problem is the bake samples them too coarsely and misses what the curve is actually doing between keys. basically pre-baking by hand. not elegant but i've done it enough times that it takes like two minutes per problem area, and the result stays consistent across every engine i export to. beats debugging it on the engine side every time.

One thing not mentioned here: FBX bake rate. When you export from Blender with "Bake Animation" on, it samples your curves at one sample per frame based on your scene framerate. If Blender is at 24fps and your game runs at 60, the engine linearly interpolates between those 24 samples, which is not what Blender was doing with Bezier evaluation. For smooth slow motion you probably won't notice. For fast rotations or anything with deliberate easing baked into the curve shape, the in-engine result will be off in a way that's hard to pinpoint.

Fix is either setting your Blender scene framerate to match your target (which I now do by default on every project), or cranking the bake sample rate up in the FBX export options so there's enough density that linear interpolation between samples is close enough. Not glamorous but it eliminates a whole category of "why does this feel wrong in-engine" that took me embarrassingly long to trace back to source.

one thing that doesn't get mentioned enough: playback framerate. blender defaults to 24fps preview and a lot of people don't have frame dropping enabled, so you're watching a smoothed-out approximation of your timing rather than actual frame stepping. import into a 60fps game loop and suddenly your carefully timed ease-out is two frames shorter than it felt.

i keep a note on my monitor now: always check timing at export framerate before touching the fbx. embarrassing that this is still a thing i have to remind myself of after this long.

Replying to ApexRunner: One thing not mentioned here: scene root transforms. If your armature in Blender...

yeah this bit me so hard on my first real project. armature had a -90 X rotation at the object level because that's how the mesh came in from the modeler and nobody applied it. looked completely fine in blender. imported into unity and the character was lying flat on their back.

person lying dramatically on floor

spent like an hour in the FBX import settings trying to compensate for it before someone told me to just apply the rotation in blender first. ctrl+a → apply all transforms. done. it's such a basic thing but completely invisible if nobody's warned you it matters.

root motion is another one that catches me every time. in blender you're watching the animation on a character that physically travels through space. in engine, depending on how your controller handles it, that same root motion might get extracted and applied to the physics body, or completely ignored, so your character either teleports or moonwalks in place. character moonwalk loop no real fix beyond establishing clear root motion conventions early, but at minimum baking root to hips before export cuts down on the worst surprises.

One thing not mentioned here: scene root transforms. If your armature in Blender has a non-zero object-level rotation or scale that isn't applied, Blender compensates for it in preview but Unity or Godot won't handle it the same way on import. Had a case where feet were slightly underground in-engine, animation looked perfect in Blender, and it turned out the armature had a tiny baked Z rotation sitting on the object transform. Took an embarrassing amount of time to find. Applying all transforms before export is basic stuff at this point, but it still catches people.

Replying to NovaCrow: One thing not mentioned here: FBX bake rate. When you export from Blender with "...

This caught me out on a project where the animator worked at 24fps in Blender and the game ran at 60. Even well-authored curves looked subtly wrong because the engine was interpolating between coarse samples and missing the actual curve shape. The fix is annoying but reliable: set Blender's scene FPS to match your target framerate before export, then re-bake. Some FBX exporters let you override the bake sample rate separately from the scene setting, which is cleaner. Also worth knowing: Godot's FBX importer has an "Animation > FPS" override per-import, so you can compensate on the import side if you can't touch the source file.

Moonjump
Forum Search Shader Sandbox
Sign In Register