Develop

Use Fast Motion Mode

Updated: Jun 2, 2026
Fast Motion Mode (FMM), previously known as “High Frequency Hand Tracking”, provides improved tracking of fast movements common in fitness and rhythm apps. It is highly recommended to first test out your title without FMM enabled, and then enable it only if you observe high tracking loss due to fast hand motion. The default hand tracking mode provides the right balance between accuracy and speed for most apps.

Benefits of FMM

  • Improved tracking of fast movements common in fitness and rhythm apps.

Known limitations

  • FMM optimizations may increase jitter, impacting high accuracy interactions like direct touch or typing.
  • Tracking quality regresses in low lighting conditions because fast motion relies on short exposure time. Remind users to play in a well-lit environment.

Compatibility

Hardware compatibility

  • FMM is supported on Quest 2, Quest Pro, Quest 3, and all future devices.
  • On Quest 1, enabling FMM increases hand tracking frequency, but does not provide further optimizations.

Software compatibility

Feature compatibility

  • You cannot enable FMM with Multimodal.
  • When used in combination with passthrough, virtual hands may appear more responsive than passthrough hands. Take this into consideration when designing an experience that combines FMM with passthrough.
  • Inside-Out Body Tracking (IOBT)/Wide Motion Mode (WMM) will not run when passthrough and full-body (FBS) are running alongside FMM. To use FMM together with IOBT/WMM in passthrough, turn off FBS.
  • On Quest Pro, FMM cannot be enabled together with face tracking, eye tracking, lip sync, or foveated rendering.
  • FMM is incompatible with the Dynamic Object Tracker, which backs MRUK keyboard tracking and other xrCreateDynamicObjectTrackerMETA-based features. While FMM is active, the system disables the Dynamic Object Tracker and xrCreateDynamicObjectTrackerMETA calls will succeed but never produce anchors. If your app needs MRUK keyboard tracking, leave Hand Tracking Frequency set to Low (Default). Note that system-level keyboard passthrough (the shell cut-out) is unaffected because it does not go through the Dynamic Object Tracker.

Setup

To enable FMM in Unity, follow these steps.
  1. Open your Unity scene.
  2. From the Project tab, search for OVRCameraRig and drag it in the scene. Skip this step if OVRCameraRig already exists in the scene.
  3. Under Hierarchy, select OVRCameraRig.
  4. Under Inspector, under Quest Features, in the Hand Tracking Frequency list, select High. There is no difference between High and Max values as both track hands at high frequency.

Toggle FMM at runtime

You can enable or disable FMM at runtime without changing the build-time Hand Tracking Frequency setting described in Setup. The build-time and runtime configurations work independently, so you can use either or both.
Two approaches are available: call OVRPlugin.RequestFastMotionMode() for direct control, or set OVRManager.fastMotionModeHandPosesEnabled to integrate with the OVRManager component lifecycle.

Using OVRPlugin directly

Call OVRPlugin.RequestFastMotionMode() to toggle FMM at runtime. Pass true to enable or false to disable. This is a static method call that does not require OVRManager or OVRCameraRig in your scene.
// In your MonoBehaviour script (e.g., in a toggle handler):
var result = OVRPlugin.RequestFastMotionMode(true);
if (result != OVRPlugin.Result.Success)
    Debug.LogError($"FMM request failed: {result}");

Using OVRManager

You can also toggle FMM through the OVRManager instance field. OVRManager detects changes to this field during Update() and calls OVRPlugin.RequestFastMotionMode() automatically. This approach requires OVRCameraRig with OVRManager in your scene.
// For example, in a toggle handler or Start():
OVRManager.instance.fastMotionModeHandPosesEnabled = true;
Note: The fastMotionModeHandPosesEnabled field is marked as experimental.

Runtime toggle behavior

  • Both approaches treat the toggle as a hint. The system may ignore it based on user preferences, system constraints, or power policies.
  • The toggle affects both hands simultaneously.
  • There is no getter API to query the current FMM state. If your app needs to check whether FMM is active, maintain a local boolean that you update alongside each toggle call.

Troubleshooting

  • What should I do if RequestFastMotionMode() returns a non-Success result?
    Verify that the feature is compatible with your current configuration. FMM cannot be used with Multimodal, and on Quest Pro it cannot be used with face tracking, eye tracking, lip sync, or foveated rendering. Check the Feature compatibility section for the full list. You can also confirm FMM status on device by running adb logcat -e FMM.
  • How can I confirm FMM is running on my headset?
    1. To verify your device has FMM enabled, run adb logcat -e FMM on a terminal when hand tracking is running on device.
      The output should be HandTrackingService: FMM: enabled: true; active:....
  • FMM isn’t running on my headset. What should I do?
    1. If enabled is false, restart your headset a couple of times for the client to fetch data from the server.
    2. To verify your FMM is actively running in your app:
      1. Ensure that your app is running on the foreground.
      2. Run adb logcat -e FMM.
        The expected output is HandTrackingService: FMM: enabled: true; active: true.
      3. Run adb logcat -e "Camera FPS" to verify the camera frequency is around 60 Hz. “Around 60 Hz” means plus or minus about 3Hz. However, the acceptable frequency also varies based on the voltage and frequency in your country. While North America and some of South America are at 120V 60Hz, most other countries are at 240V 50Hz, so they will see 50Hz in FMM.
        The expected output is HandTrackingService: Hand Tracking Processed FPS = 58.5 Hz / Camera FPS = 60.1.
  • Can I evaluate the feature on my headset without changing my code?
Yes, you can manually toggle FMM via your headset. Under Settings > System > Advanced > Developer to toggle on Enable custom setting, set Hand Tracking Frequency Override to either High (to force FMM on) or Low (to force FMM off). None will use the value from your app manifest.