Hardware-independent controller positions for VR

Currently on Roblox, it’s too hard to make VR games using motion-tracked controllers, as the developer has to account for physical differences between different VR controller hardware.

Full disclaimer: this post is more to get the idea out there and to collect feedback on it; I don’t expect new VR features to come any time soon. Roblox engineers themselves have said they can’t currently justify investing time into new VR features because it’s too niche.
Also, this is just a random idea I’ve come up with independently - it’s probably not perfect. I don’t know if things work like this in other engines or frameworks, or if it’s even been considered by other people at all.

The Index controllers perfectly demonstrate the problems with the current implementation which prevent it from being properly hardware-independent.

Compared to the Oculus Touch and Vive Wand controllers Roblox was designed for, the Index controllers position the ‘handle’ at a slight angle (relative to the tip of the controller, where your selection laser normally comes from). Your hands are also positioned differently relative to the controller itself, since the Index controllers use a ‘hands-free’ design unlike other controllers which need to be held at all times.

To be properly hardware-independent, I think there shouldn’t be only one definition of ‘controller position’. I believe there’s at least three relevant definitions, all of which are useful for different things:

  • ‘laser’ position - used for pointing at UI elements and selecting things, the CFrame of the part of the controller where a pointing ‘laser’ might come from
  • ‘grab’ position - used for equipped tools and holding objects, the CFrame of the part of the controller designed to be grabbed like a handle
  • ‘hand’ position - used for displaying the player’s hands virtually, the CFrame representing where the palm of the player’s hand is most likely to be when in a ‘neutral’ position

Here’s an annotated picture of my controller to illustrate the differences between these positions:

Providing these three different positions would help future-proof the API when it comes to dealing with future hardware too. Because we don’t know what the shape of future controller hardware will be like, those three positions could completely change relative to each other. The current VR API in Roblox wouldn’t support this at all - games would have to be tweaked specifically to add support for that new hardware shape.

By instead offering different positions for these well established use cases, games would work much more smoothly by default, because they don’t have to make assumptions about the shape of the controller hardware. The Roblox engine can deal with calculating these different positions internally.

What do you guys think? I haven’t fully fleshed out this idea personally, so I’d like to know if there’s anything I’ve missed or should reconsider :slightly_smiling_face:


Update: It turns out OpenXR has a pose API very similar to this suggestion:

There is an extension for palm position:

This should be feasible to expose now that Roblox uses an OpenXR runtime.