Download

Working With Low Latency Update On Motion Controllers

Hello everyone,

So I’ve been running into trouble with the “Low Latency Update” functionality of the motion controllers in VR. Obviously I want my controllers to have low latency updates because there is a very noticeable controller lag introduced without it (this is especially unacceptable when asking players to do anything with precision, like aim a gun). However, as the Low Latency Update option states “render transforms within the motion controller hierarchy will be updated a second time immediately before rendering” and this seems to cause a couple significant problems when using this feature.

Firstly, I’ve been trying to add a laser sight to my gun and no matter what I do, any sort of beam-based particle system lags behind the gun it is attached to. Secondly, it seems like it is impossible (at least for me) to update the IK of a character’s hands to the motion controller’s positions without this same lag being introduced. Because the skeletal mesh is not a child component of the motion controllers it will not be updated with low latency (like when you attach a static mesh as a child component to the controller). To me it wouldn’t make sense to try and hack around this by having the character’s skeletal mesh be a child of the motion controller, and I see no other way of getting it to update with low latency. I have already tried changing the actor tick group to try and capture the low latency position to no avail. Is there any way to grab this second (low latency) update position or update other components at low latency?

P.S. Low latency updating for controllers seems to have a poorly thought out execution and is a hassle to work with. Epic, can we please get some major quality-of-life changes to VR features like this?

Thanks for the help!

There is nothing wrong with their implementation, the execution is fine, it is just missing a function or two to include additional components.

In the mean time you can derive from the motion controllers and include additional components that you want in the late transform of the controller to the “GatherLateUpdateComponents” function in c++ (it is what I am doing). They may add it in as a standard feature eventually but it is pretty simple to do yourself if you have any coding experience.

Keep in mind though that things like IK won’t be perfect as it will shift the entire component with the controller instead of solving the IK in the late update, you won’t get hand float anymore but you will have shoulders that don’t stay rigid as they will also be shifted. Also arms would either have to be separated into one mesh for each controller or you would have to have different transform logic for them in the late update using both controllers positions.

Also CPU particles likely will never work perfectly, you would be better off using a billboard style or double plane mesh for beams attached to held items instead. I could see GPU particles being able to work but for how little it would be used I wouldn’t expect it to be a huge priority.

If you notice most of the high end featured shooting games for VR so far don’t have late updates on their guns (HH&H comes to mind) and accept the motion delay, or they don’t use hands and only show the weapons so that the lag isn’t as noticeable.

Thank you for the thorough reply. This seems to be mostly bad news (especially when it comes to particles), but hopefully Epic will make improvements to these systems some day. Anyway, I’ll take a crack at the solution you provided and keep experimenting.

Thanks again!

@mordentral: This may be a stupid question, but since GatherLateUpdatePrimitives is not a virtual function, how are you adding additional components to that function?

I needed access to some of the other private members of the motion controllers anyway, so I literally remade them as a new class.

In source builds it would obviously be a lot easier by just modifying them directly.

Oh, yeah I forgot about the good old copy-paste derived class :smiley:

Thanks for the help.