Develop

Use Unextrapolated Hand Poses

Updated: Apr 24, 2026
The standard hand tracking API (OVRPlugin.GetHandState) returns extrapolated hand pose data, which is predicted ahead to reduce perceived latency. For use cases that require the actual tracked hand position at the time of capture, OVRPlugin.GetUnextrapolatedHandState returns raw hand pose data without any prediction applied. This API provides access to the underlying tracking data along with real capture timestamps.

When to use unextrapolated poses

  • Motion analysis: Recording actual tracked hand positions for gesture recognition or fitness tracking.
  • Replay systems: Capturing hand data with real timestamps for accurate playback.
  • Custom prediction: Implementing your own extrapolation or smoothing on top of raw tracking data.

Compatibility

  • Meta XR Core SDK with OVRPlugin version 1.116.0 or later
  • OpenXR backend required
  • OpenXR hand skeleton version required
  • OpenXR extension: XR_META_hand_tracking_unextrapolated_poses

Usage

Call OVRPlugin.GetUnextrapolatedHandState to retrieve the latest raw hand pose data for a given hand. The method populates an OVRPlugin.HandState struct containing the root pose, bone rotations, pinch state, and tracking confidence:
OVRPlugin.HandState handState = new OVRPlugin.HandState();
if (OVRPlugin.GetUnextrapolatedHandState(OVRPlugin.Hand.HandLeft, ref handState))
{
    double sampleTime = handState.SampleTimeStamp;
    OVRPlugin.Posef rootPose = handState.RootPose;
}
The method returns true on success and false on failure. Unlike GetHandState, this method does not take a Step parameter and always returns the latest available unextrapolated data.

Record motion samples

The SampleTimeStamp field on the returned HandState represents the actual capture time of the tracking data, rather than a predicted display time. Use this timestamp when recording hand motion for replay or analysis:
OVRPlugin.HandState rawHandState = new OVRPlugin.HandState();
if (OVRPlugin.GetUnextrapolatedHandState(OVRPlugin.Hand.HandLeft, ref rawHandState))
{
    var rawPoseTime = rawHandState.SampleTimeStamp;
    var ovrPose = rawHandState.RootPose.ToOVRPose();
    handTracker.AddMotionSample(ovrPose.position, ovrPose.orientation, rawPoseTime); // Your recording logic
}
Note: GetUnextrapolatedHandState requires the OpenXR backend, the OpenXR hand skeleton version, and OVRPlugin version 1.116.0 or later. If any of these requirements are not met, the method returns false.