Controller and Hand Tracking#
The CloudXR Runtime receives controller input and hand tracking data from connected CloudXR client devices over the network and presents them to your OpenXR application through the standard OpenXR action system.
This page covers which controllers are supported, how binding profile fallbacks work, and how to set up your application for broad compatibility.
Supported Controllers#
The following controllers are natively supported. The runtime automatically selects the correct profile based on the connected client’s hardware.
Controller |
Client Profile ID |
OpenXR Interaction Profile |
|---|---|---|
Meta Quest Touch Plus |
|
|
Sony PlayStation Sense |
|
(no native profile — works through fallbacks) |
PICO 4 Ultra |
|
|
Khronos Generic Controller |
|
|
Khronos Simple Controller |
|
|
Binding Profile Fallbacks#
Each supported controller provides automatic binding profile fallbacks that map its inputs to common OpenXR interaction profiles. This means your application does not need to explicitly support every controller. You can suggest bindings for a common profile and the runtime translates them automatically.
Physical Controller |
Native Profile |
Also Accepts Bindings For |
|---|---|---|
Meta Quest Touch Plus |
Meta Touch Plus |
Generic Controller, Oculus Touch, Simple Controller |
Sony PlayStation Sense |
(none) |
Generic Controller, Oculus Touch, Simple Controller |
PICO 4 Ultra |
PICO 4 |
Generic Controller, Oculus Touch, Simple Controller |
Khronos Generic Controller |
Generic Controller |
Oculus Touch, Simple Controller |
Khronos Simple Controller |
Simple Controller |
(no additional fallbacks) |
In practice, if your application suggests bindings for /interaction_profiles/oculus/touch_controller, it will work with Quest Touch Plus, PS Sense, PICO 4 Ultra, and the Generic Controller through automatic binding translation.
Hand Tracking#
The runtime supports the XR_EXT_hand_tracking extension, which provides full 26-joint hand skeletal tracking when the connected client device supports it. Hand tracking data flows from the client device through the CloudXR streaming protocol, just like controller input.
Other Considerations#
Because the CloudXR Runtime streams input over the network, keep the following in mind:
Controller availability is dynamic. Controllers are registered when a client connects and unregistered when the client disconnects. Applications must handle interaction profile change events gracefully.
Input latency. Controller input is transmitted over the network from the client to the server. While CloudXR minimizes this latency, it will be higher than input from locally connected controllers.
Haptics. Haptic output paths are defined in the supported interaction profiles, but haptic feedback is not fully supported yet. Applications can suggest haptic bindings without error, but haptic events may not be delivered to the client device.
Both hands are supported. Each controller type is registered for both left and right hands through the standard
/user/hand/leftand/user/hand/righttop-level user paths.
Known Issues#
Noisy hand tracking with controllers on Apple Vision Pro. When both hand tracking and controller input are enabled simultaneously on Apple Vision Pro, the hand tracking data may become noisy. If your application does not require both inputs at the same time, consider disabling hand tracking when controllers are in use.