Use Wide Motion Mode
Updated: Apr 24, 2026
Wide Motion Mode (WMM) allows you to track hands and display plausible hand poses even when the hands are outside the headset’s field of view, improving social presence and wide motion tracking. This is achieved by running Inside Out Body Tracking (IOBT) under the hood and using the estimated hand position when hand tracking is lost.
- Improved social and self presence by providing plausible hand poses even when your hands are outside your FOV.
- More reliable wide motion interactions (arm swings, backpacks, throws, etc.)
- Reduced gesture and interaction failures due to tracking loss when the user turns their head.
- Arm swing based locomotion, where users use their arms to move around the game, such as Echo VR.
- While the system will always provide a hand pose, it will not be accurate when hand tracking is lost- the system uses body tracking data for approximate position and last hand pose as the pose itself.
- You may also see a slight regression in position accuracy due to smoothing when transitioning from body tracking based hand pose to hand tracking based hand pose as hand tracking is reestablished.
- WMM can be less robust in extremely low light. In case of low light conditions, the system will revert to standard hand tracking.
- Supported devices: Quest 3 and all future devices.
- Unity 2022.3.15f1+ (Unity 6+ is recommended)
- Meta XR Core SDK v62+
- IOBT/ WMM will not run when passthrough and full body (FBS) are running along with FMM or Multimodal. To use FMM together with IOBT/ WMM in passthrough, turn off FBS.
- When using Inside Out Body Tracking, the hands pose exposed via MSDK already includes WMM like fused hands. If you plan to use MSDK and consume hands from ISDK/ hands API, turn on WMM to reduce hand pose mismatch between MSDK and hands API.
The OpenXR API for WMM is called XR_META_hand_tracking_wide_motion_mode. The API declares a new structure type of XrHandTrackingWideMotionModeInfoMETA. That struct contains an enum value named XrHandTrackingWideMotionModeMETA, which currently only has one available value: XR_HAND_TRACKING_WIDE_MOTION_MODE_HIGH_FIDELITY_BODY_TRACKING_META.
To enable WMM, create a XrHandTrackingWideMotionModeInfoMETA struct.
Assign the next pointer argument of xrCreateHandTrackerEXT to that struct.
In the AndroidManifest.xml file, set the body tracking manifest values as follows.
<!-- Body extension requirements -->
<uses-feature android:name="com.oculus.software.body_tracking" />
<uses-permission android:name="com.oculus.permission.BODY_TRACKING" />
The steps above enable WMM1. For applications that also need to detect when wide motion mode inference is active, use the WMM2 extension described below.
Wide Motion Mode 2: Source detection
The XR_META_hand_tracking_wide_motion_mode extension (WMM1) enables wide motion mode but provides no way to detect when hand tracking poses originate from WMM inference rather than direct camera observation. The XR_META_hand_tracking_wide_motion_mode2 extension (WMM2) addresses this. It extends the XrHandTrackingDataSourceEXT enum with a new value, XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_WIDE_MOTION_META, allowing applications to both request WMM and detect at runtime whether poses are being inferred from body tracking.
WMM2 depends on XR_EXT_hand_tracking and XR_EXT_hand_tracking_data_source. It requires a Quest 3 class device or newer. The same body tracking manifest entries from step 3 above also apply to WMM2.
Request the WMM2 data source
To request WMM2, chain an XrHandTrackingDataSourceInfoEXT struct into XrHandTrackerCreateInfoEXT.next. Include both XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_EXT (standard tracking) and XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_WIDE_MOTION_META (wide motion mode) in the requestedDataSources array so the runtime can fall back to standard tracking when WMM is unavailable:
XrHandTrackerCreateInfoEXT createInfo{XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT};
createInfo.handJointSet = XR_HAND_JOINT_SET_DEFAULT_EXT;
createInfo.hand = XR_HAND_LEFT_EXT;
std::array<XrHandTrackingDataSourceEXT, 2> dataSourcesWMM = {
XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_EXT,
XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_WIDE_MOTION_META,
};
XrHandTrackingDataSourceInfoEXT usageInfo{XR_TYPE_HAND_TRACKING_DATA_SOURCE_INFO_EXT};
usageInfo.requestedDataSourceCount = dataSourcesWMM.size();
usageInfo.requestedDataSources = dataSourcesWMM.data();
createInfo.next = &usageInfo;
CHK_XR(pfnCreateHandTracker(session, &createInfo, &handTracker));
Detect the WMM2 data source at runtime
To check whether poses came from WMM inference, chain an XrHandTrackingDataSourceStateEXT struct into XrHandJointLocationsEXT.next before calling xrLocateHandJointsEXT. After the call, inspect dataSourceState.dataSource:
XrHandJointLocationsEXT locations{XR_TYPE_HAND_JOINT_LOCATIONS_EXT};
XrHandJointLocationEXT jointLocations[XR_HAND_JOINT_COUNT_EXT];
locations.jointCount = XR_HAND_JOINT_COUNT_EXT;
locations.jointLocations = jointLocations;
XrHandTrackingDataSourceStateEXT dataSourceState{XR_TYPE_HAND_TRACKING_DATA_SOURCE_STATE_EXT};
locations.next = &dataSourceState;
CHK_XR(pfnLocateHandJoints(handTracker, &locateInfo, &locations));
if (dataSourceState.dataSource == XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_WIDE_MOTION_META) {
// Poses were generated using wide motion mode inference
}
You can use this information to provide visual feedback indicating lower confidence when WMM is active. For example, reduce hand rendering opacity:
// Application-specific: adjust hand rendering based on tracking source
if (dataSourceState.dataSource == XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_WIDE_MOTION_META) {
handRenderer.Solidity = 0.25f;
} else {
handRenderer.Solidity = 1.0f;
}
How can I confirm WMM is running on my headset?
In your headset, you should see improved tracking of hands outside of your headset’s field of view.
Can I evaluate the feature on my headset without changing my code?
Yes, you can test WMM via adb commands to try the feature without changing your code.