Camera Bob in VR. (Quest 2)

Using Oculus Link or Air Link, the default VR template in UE4.27 (OpenXR) sometimes has a slight latency issue with the HMD head orientation. So far, it doesn’t always seem affected by FPS since you can simulate 45FPS with spacewarp on other VR games using the Oculus Debug Tool and there’s no head bob there.

Anyway, it happens quite often in Unreal and it results in HORRIBLE motion sickness. Packaging the game seems to make it go away. I tried using Vulkan, and the camera latency is like 100x worse.

Is this a bug? Why does it feel like VR in UE4 hasn’t been battle-tested? Is it really production-ready or should I downgrade to a more stable version?

Ue4 also occasionally crashes with either a D3D12 device lost message or an OpenXR one. Here’s my latest OpenXR crash:

Assertion failed: PipelineState.FrameState.predictedDisplayTime [File:D:/Build/++UE4/Sync/Engine/Plugins/Runtime/OpenXR/Source/OpenXRHMD/Private/OpenXRHMD.cpp] [Line: 2514]

UE4Editor_Core!AssertFailedImplV() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Private\Misc\AssertionMacros.cpp:104]
UE4Editor_Core!FDebug::CheckVerifyFailedImpl() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Private\Misc\AssertionMacros.cpp:461]
UE4Editor_OpenXRHMD!FOpenXRHMD::LocateViews() [D:\Build\++UE4\Sync\Engine\Plugins\Runtime\OpenXR\Source\OpenXRHMD\Private\OpenXRHMD.cpp:2514]
UE4Editor_OpenXRHMD!FOpenXRHMD::OnBeginRendering_RenderThread() [D:\Build\++UE4\Sync\Engine\Plugins\Runtime\OpenXR\Source\OpenXRHMD\Private\OpenXRHMD.cpp:2484]
UE4Editor_HeadMountedDisplay!FDefaultXRCamera::PreRenderViewFamily_RenderThread() [D:\Build\++UE4\Sync\Engine\Source\Runtime\HeadMountedDisplay\Private\DefaultXRCamera.cpp:170]
UE4Editor_Renderer!ViewExtensionPreRender_RenderThread() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Renderer\Private\SceneRendering.cpp:3671]
UE4Editor_Renderer!TEnqueueUniqueRenderCommandType<`FRendererModule::BeginRenderingViewFamily'::`43'::FViewExtensionPreDrawCommandName,<lambda_3fb800d5d9ce9451adb62ece8eaff9a3> >::DoTask() [D:\Build\++UE4\Sync\Engine\Source\Runtime\RenderCore\Public\RenderingThread.h:183]
UE4Editor_Renderer!TGraphTask<TEnqueueUniqueRenderCommandType<`FRendererModule::BeginRenderingViewFamily'::`43'::FViewExtensionPreDrawCommandName,<lambda_3fb800d5d9ce9451adb62ece8eaff9a3> > >::ExecuteTask() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Public\Async\TaskGraphInterfaces.h:886]
UE4Editor_Core!FNamedTaskThread::ProcessTasksNamedThread() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:710]
UE4Editor_Core!FNamedTaskThread::ProcessTasksUntilQuit() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:602]
UE4Editor_RenderCore!RenderingThreadMain() [D:\Build\++UE4\Sync\Engine\Source\Runtime\RenderCore\Private\RenderingThread.cpp:373]
UE4Editor_RenderCore!FRenderingThread::Run() [D:\Build\++UE4\Sync\Engine\Source\Runtime\RenderCore\Private\RenderingThread.cpp:509]
UE4Editor_Core!FRunnableThreadWin::Run() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Private\Windows\WindowsRunnableThread.cpp:86]

Did you resolved this issue or could able to find the cause of it?
I’m also facing the similar issue.

I’ve run into this. The fix, as far as I can tell, is to disable all VR backends (SteamVR, Oculus, etc) except for OpenXR or to disable OpenXR and enable only your desired backend. If I’m right, only one VR plugin should be running otherwise it causes issues.

It doesn’t matter how many of them are enabled, only one will be active. You can see at the top of the VR Preview window which Runtime and Plugin is being used

Thanks for the clarification! I’ve had the same issue as OP, where there’s camera lag in PIE but not in packaged builds. Is it good practice to only have one VR plugin enabled at a time?

It is but not for the reason you might think. Like I said, there’s a priority list and native SteamVR/OculusVR takes priority over OpenXR. OpenXR is the way forward as the other plugins will be deprecated soon, so unless there’s a specific feature that’s required for your project that OpenXR doesn’t support yet, go with OpenXR (and OculusVR’s XR API set to “Native”). This is all default in the VR Template, and other recommended settings that you don’t get in a default UE project.