What is Best Practice for HMD Tracking Predictions?


With both CloudXR and most headsets capable of predicting the future position of the headset, what gives the best results? Specifically, in the GetTrackingState callback function, should I return the current position of the headset, or a position which is a few milliseconds into the future as predicted by the headset SDK? (WaveVR in my case). And how does this interact (if at all) with the params->predOffset (as passed in to the cxrCreateReceiver function)? I was unable to determine what this does from the docs or examples.

Kind Regards,


Hi Brendan,

The headpose prediction performed by the CloudXR server is actually performed by the underlying SteamVR software library. The pose predictor in SteamVR should be used instead of the predictor from the client platform SDK, for a few reasons:

  • latency is variable, so the time offset parameter used for prediction may be incorrect. For example the client requests a headpose 100ms in the future, but the total network latency to get a frame back is only 50ms.

  • some clients (iOS) do not have a pose prediction API available, therefore the pose predictor in SteamVR is the only option available.

I suggest you query for the headpose using a time offset of zero like this:

WVR_GetPoseState(WVR_DeviceType_HMD, WVR_PoseOriginModel_OriginOnGround, 0, &mHmdPose);