VR Input System
The VR input system allows managing user input from VR controllers, head-mounted displays (HMDs), base stations, and trackers. It supports a wide range of VR devices, enabling you to utilize several devices from various vendors and process input from them.
The InputVRDevice class provides access to properties and settings common for all VR devices (for example, a device name).
VR Controllers#
Controllers serve as a primary interface for VR input. There are three types of VR controllers: left-hand, right-hand controllers, and a treadmill. You can get the controller's type and check whether it is a hand controller by using the corresponding methods of the InputVRController class.
The VR input system supports a range of controller models compatible with OpenVR, Varjo, and OpenXR devices. In this article, we will consider the following:
- General approach to processing inputs on VR controllers.
- Examples of inputs on some models of OpenVR-compatible devices (HTC Vive, Oculus Touch, and Valve Knuckles).
UNIGINE API provides access to the VR controller inputs — axes and buttons.
- Buttons are mapped to the controller's buttons that can be pressed, touched, or released.
- Axes detect 1-dimensional movement of the control and have more complex behavior.
Depending on the type of the VR controller, the number of axes differs. UNIGINE supports several axes. But usually, a controller has 3 or 4.
In UNIGINE, an axis can be mapped to a control of one of the supported types, also referred to as an axis type.
You cannot know in advance which type of controller is connected, so UNIGINE API allows you to identify the number of supported axes, check their types, find the axis index by its type via findAxisByType(), or get a state value for the axis via getAxisByType().
General Approach to VR Controller Inputs#
Some VR controllers have unique button layouts. For example, Vive Wand has only one button, typically used as the Menu button. Others may have more buttons and may even include a trackpad in addition to a thumbstick.
To account for such differences, you can use InputVRController::getSupportedButtonMask() and InputVRController::findAxisByType() methods to determine which button to use for specific actions.
For example, you can decide which button to use as the teleport button as follows:
bool isTeleportButtonPressed(InputVRControllerPtr device)
{
if (!device || device->isAvailable() == false || device->isTransformValid() == false)
return false;
// check if there is the X button on the controller
if (device->getSupportedButtonsMask() & (1ull << uint64_t(Input::VR_BUTTON_X)))
// consider the X button as the teleport button and check if it is pressed
return device->isButtonPressed(Input::VR_BUTTON_X);
// if there is no X button on the controller, try to use the Trackpad, Trigger, or Grip button as the teleport button
VectorStack<InputVRController::AXIS_TYPE> axis_types = { InputVRController::AXIS_TYPE_TRACKPAD_X, InputVRController::AXIS_TYPE_TRIGGER_VALUE, InputVRController::AXIS_TYPE_GRIP_VALUE };
for (int i = 0; i < axis_types.size(); i++)
{
// find the axis index by the axis type
int axis_index = device->findAxisByType(axis_types[i]);
if (axis_index == -1)
continue;
Input::VR_BUTTON button = Input::VR_BUTTON(Input::VR_BUTTON_AXIS_0 + axis_index);
if (device->getSupportedButtonsMask() & (1ull << uint64_t(button)))
return device->isButtonPressed(button);
}
return false;
}
Inputs for OpenVR Controllers#
This chapter showcases examples of inputs on different types of OpenVR-supported controllers — HTC Vive, Oculus Touch, and Valve Knuckles controllers — and provides information on how these inputs are mapped to the buttons and axes within the UNIGINE input system.
HTC Vive Controller Inputs#
Button/ Axis |
Description | Interaction Type | UNIGINE Button/ Axis |
UNIGINE Axis Number | Axis Range |
---|---|---|---|---|---|
1 | Menu Button | Press |
|
||
2 | Trackpad | Press / Touch |
|
||
2 | Trackpad | Horizontal / Vertical Movement |
|
[-1;1]
|
|
3 | System button | Press |
|
||
7 | Trigger | Press / Touch |
|
||
7 | Trigger | Squeeze | 2 for the Trigger axis | [0;1] | |
8 | Grip button | Press |
|
Oculus Touch Controller Inputs#
Button/ Axis |
Interaction Type | UNIGINE Button/ Axis |
UNIGINE Axis Number | Axis Range |
---|---|---|---|---|
|
Press |
|
||
|
Press |
|
||
|
Press / Touch |
|
||
|
Horizontal / Vertical Movement |
|
[-1;1]
|
|
|
Press / Touch |
|
||
|
Squeeze | 2 for the Trigger axis | [0;1] | |
|
Squeeze |
|
Valve Knuckles Controller Inputs#
Button/ Axis |
Interaction Type | UNIGINE Button/ Axis |
UNIGINE Axis Number | Axis Range |
---|---|---|---|---|
A Button | Press |
|
||
B Button | Press |
|
||
System Button | Press |
|
||
Trigger | Press / Touch |
|
||
Trigger | Squeeze | 2 for the Trigger axis | [0;1] | |
Track Button (Trackpad) | Press / Touch |
|
||
Track Button (Trackpad) | Horizontal / Vertical Movement |
|
[-1;1]
|
|
Thumbstick | Press / Touch |
|
||
Thumbstick | Horizontal / Vertical Movement |
|
[-1;1]
|
|
Grip | Press / Touch |
|
Head-Mounted Displays#
The VR system allows you to process input from head-mounted displays (HMDs) via the InputVRHead class.
Base Stations#
A VR base station helps the HMD and controllers to track their exact positions, enhancing the immersion of room-scale virtual reality experience.
The InputVRDevice and InputVRBaseStation classes is used to handle base station input.
VR Trackers#
A VR tracker allows embedding real-world objects into the VR environment. You can attach it to a real thing that needs to be tracked. In Mixed Reality, you can install the VR tracker on a camera or player to track its position in the virtual world.
The InputVRDevice and InputVRTracker classes is used to manage tracker input.