SkeletalMesh has Rotation Precision Issues

Rather than duplicate what I’ve already posted, you can see the issue here (with a video and code):

This appears to be a bug whereby the visual mesh of a Skeletal Mesh doesn’t update when the change in it’s transform is very small. I’m sure this is probably an optimization, but I desperately need to turn it off!

Hello TheJamsh,

Have you tried what neo suggested in your forum thread, about using EMeshComponentUpdateFlag::AlwaysTickPoseAndRefreshBones?

If so and that didn’t help, please let me know. That was my first thing to think of to suggest as well.

Hi Matthew,

This made no difference. I have noticed however than when the object simulates physics, this problem goes away - so I think this is a rotational movement issue in the engine.

Looking deeper, this issue might be caused by

SCENECOMPONENT_ROTATOR_TOLERANCE
and
SCENECOMPONENT_QUAT_TOLERANCE

Both of these defines are in USceneComponent.cpp and are used everywhere when moving the component. If the movement is lower than the tolerance, no move takes place. In my case I really need this exposed so I can lower / remove the tolerance altogether!

Thank you for that information. I’ve placed a feature request in to have these exposed to be freely editable, but I’m unsure of if the request will be fulfilled. If you are up to the task, I would suggest making these edits yourself with a source version of the engine in the meantime. For reference, the request’s number is UE-33715.

Have a nice day!

Hey Matthew, thanks!

I could still be wrong though and very well might be. I’d appreciatte getting some engine team feedback on the issue! Cheers!

Have you made any headway on this issue? I’d be surprised if the tolerances you mention are the issue, since in your forum post you mention that the transforms are actually changing.

Hey Zak, nothing unfortunately!

The only thing I’ve so far been able to find is that simulating physics on the object stops this from happening, but I can’t really understand why.

Hello TheJamsh,

Could you provide a test project that reproduces this problem? Also, have you tried changing these tolerance values in a source build to see if they were indeed the issue? We’re considering making these values available but need to ensure that it is what is causing this issue before doing so.

Hi Matthew, I can but it’ll be a few days before I can upload it and reproduce the conditions. I’ll see what I can do!

Okay so some further investigation on this issue. If I drag the mouse slowly enough, I can actually massively modify the rotation of the object without getting a ‘full update’ of the mesh (and camera). I don’t understand why the aim location works just fine (which is determined from bone rotation on the mesh), but the mesh doesn’t follow when the transform updates are so small. Again when PhysX is used on the mesh, this isn’t a problem.

The only other possible problem area is here: USceneComponent::UpdateComponentToWorldWithParent (Lines 424 > 435).

I’m going to try and call ‘PropagateTransformUpdate(true)’ on tick, and see if this resolves the precision issue.

I have also updated the forum thread with more information.

Okay and looking into it even more, PropagateTransformUpdate appears to be there to prevent unneccesary bounds calculations and render transform updates for objects that don’t move. I’m assuming this is done so that static objects don’t needlessly have this recalculated every frame, resulting in hundreds if not thousands of extra calculations.

For the most part that’s a needed optimization, but in my case this causes a problem. It would nice to have this exposed on a per-component basis, so that objects that need high-fidelity updates can do so at the developers discretion.

Hello TheJamsh,

This Feature Request is still open and we would like to look into fixing this issue for you but we still don’t have a reproduction case. Could you provide an example project that reproduces this issue so that we can take a look?