Use Capsense
Updated: Apr 14, 2026
Capsense generates realistic hand animations from controller input. When a user holds a Meta Quest controller, Capsense reads the controller’s capacitive touch sensors and button states to determine finger positions, then produces matching hand poses. These are the same hand visuals you see in the Horizon Home environment.
Capsense supports two styles of hand rendering:
- Natural hand poses: The hand is rendered without a visible controller, as if the user is interacting bare-handed. Finger positions are inferred from the controller’s touch sensors.
- Controller hand poses: The hand is rendered alongside a visible controller model. Capsense adjusts the hand shape to match each controller type. Supported controllers include Quest 2, Quest 3, Quest Pro, and all future device controllers.
- Benefit from best in class logical hand implementation and future improvements instead of investing in a custom implementation.
- When using Link on PC, pose data for controllers is unavailable when you’re not actively using them (such as when they’re lying on a table).
- Supported devices: Quest 2, Quest Pro, Quest 3 and all future devices.
- Fully compatible with Wide Motion Mode (WMM).
- Using Capsense for hands with body tracking through MSDK will both work simultaneously, but they have a different implementation of converting controller data to hands, so the position and orientation of joints will be slightly different.
To configure Capsense in Unreal Engine, use the SetControllerDrivenHandPoses and GetControllerDrivenHandPoses functions from UOculusXRInputFunctionLibrary.
1. Enable hand tracking support
In Unreal Editor, go to Project Settings → OculusXR → Mobile and set Hand Tracking Support to Controllers And Hands.
2. Set the hand pose type at runtime
Call SetControllerDrivenHandPoses during BeginPlay or equivalent initialization to choose how hands render when the user holds a controller.
Pose types:
| Value | Behavior |
|---|
None
| Controllers do not generate any hand poses |
Natural
| Controller button inputs generate a natural hand pose (hand rendered without a visible controller) |
Controller
| Controller button inputs generate a hand pose that appears to hold a controller |
C++:
#include "OculusXRInputFunctionLibrary.h"
// Enable natural hand poses driven by controller input
UOculusXRInputFunctionLibrary::SetControllerDrivenHandPoses(
EOculusXRControllerDrivenHandPoseTypes::Natural);
// Query the current pose type
EOculusXRControllerDrivenHandPoseTypes CurrentType =
UOculusXRInputFunctionLibrary::GetControllerDrivenHandPoses();
Blueprints:
Both functions are available in the **OculusLibrary | Controller** category: |
- Set Controller Driven Hand Poses: Sets the active pose type.
- Get Controller Driven Hand Poses: Returns the current pose type.
3. Show a controller model alongside the hand (optional)
When the pose type is set to Controller, you can display a controller mesh alongside the hand by using UOculusXRControllerComponent. This component is added and configured in the Blueprint editor, not in C++.
To add the controller component:
- Open your Pawn or Character Blueprint.
- In the Components panel, select Add, then search for OculusXR Controller.
- Select the new component in the hierarchy. In the Details panel, find
RenderWhenUsingControllerDrivenHands and enable it.
This keeps the controller model visible while controller-driven hand poses are active.
Note: UOculusXRControllerComponent hides itself when hand tracking is enabled, unless RenderWhenUsingControllerDrivenHands is true and the pose type is Controller.
With Natural, the hand mesh reflects natural finger positions driven by controller touch sensor and button state. With Controller, the hand mesh shows fingers wrapped around a virtual controller shape. To disable controller-driven hand poses entirely, set the type to None as described in step 2.
Note: The
multimodal input page documents these same APIs in the context of simultaneous hands and controllers. Use Capsense when you want controller-driven hand poses without full multimodal input.
How can I confirm Capsense is running on my headset?
In your headset, you should see either hands instead of controllers or hands holding controllers. Also, hand pose data should be provided while the hands are active with the controllers.
Can I evaluate the feature on my headset without changing my code?
No, using Capsense requires some code changes.