Controller and Hand Tracking#
The CloudXR Runtime receives controller input, stylus 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 and styli are supported, how binding profile fallbacks work, and how to set up your application for broad compatibility.
Supported Controllers and Styli#
The following controllers and styli are supported. The runtime automatically selects the correct profile based on the connected client’s hardware.
Device |
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 |
|
|
Xbox Controller |
|
|
Logitech Muse stylus |
|
|
Binding Profile Fallbacks#
Each supported device 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 or stylus. You can suggest bindings for a common profile and the runtime translates them automatically.
Physical Device |
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) |
Xbox Controller |
Microsoft Xbox Controller |
(no additional fallbacks) |
Logitech Muse stylus |
Logitech MX Ink stylus |
Generic Controller, Simple Controller |
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.
For a Logitech Muse stylus, if your application suggests bindings for
/interaction_profiles/khr/generic_controller or
/interaction_profiles/khr/simple_controller, the runtime maps common pose,
button, pressure, and vibration paths to the Logitech stylus interaction
profile.
Logitech Muse Stylus#
The CloudXR Runtime supports the Logitech Muse stylus through the Logitech MX
Ink stylus interaction profile. Compatible clients register the stylus as a
non-handed controller profile, and equip the same controller instance into
/user/hand/left or /user/hand/right based on the hand that is currently
holding the stylus.
The runtime supports stylus pose input, tip and button pressure, button clicks, docking state, and haptic feedback. A connected client may advertise only the inputs that it exposes. CloudXR Framework for visionOS currently registers tip force, middle-button force, front-button click, grip pose, aim pose, and tip pose for Logitech Muse.
Controller Haptics#
The runtime supports controller haptic feedback for clients that advertise controller haptics support. Applications can use standard OpenXR haptic actions and suggested bindings. When the connected client and physical controller or stylus expose haptics, the runtime forwards haptic events to the client device.
The supported controller profiles expose vibration output paths, including
haptic/vibration for motion controller and stylus profiles, and Xbox
controller haptic outputs for gamepad vibration. If a client or device does
not support haptics, haptic output requests are ignored without preventing
input from working.
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 and stylus input.
Other Considerations#
Because the CloudXR Runtime streams input over the network, keep the following in mind:
Controller availability is dynamic. Controllers and styli are registered when a client connects and unregistered when the client disconnects. Applications must handle interaction profile change events gracefully.
Input latency. Controller and stylus 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 devices.
Haptics. Haptic feedback is delivered only when both the client SDK and the connected controller or stylus advertise haptics support. Applications should treat haptics as optional and continue to work when the client ignores a haptic request.
Both hand slots are supported. Handed controllers are registered for left and right hands through the standard
/user/hand/leftand/user/hand/righttop-level user paths. Non-handed accessories, such as a Logitech Muse stylus, can move the same controller instance between those hand slots when the client reports the current held hand.
Known Issues#
Noisy hand tracking with controllers or styli on Apple Vision Pro. When both hand tracking and controller or stylus 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 or styli are in use.