Elite Dangerous key bindings for Oculus Touch

controllerselite-dangerouselite-dangerous-horizonsoculus-riftoculus-touch

I'm having trouble understanding the Oculus Touch controller bindings in Elite Dangerous.

Ignoring the Oculus and Hamburger (Menu/Pause) buttons and the analogue Hat, there are 8 buttons in total between the two controllers (A, B, X, Y, plus left and right versions of both trigger and grip), but there are 12 different values used in the original Elite Touch controller .binds files.

When I capture my own bindings, I only see the eight binding values for the eight buttons:

Buttons I can capture               Buttons only seen in .binds file
---------------------------------   ---------------------------------
Pos_OculusTouch_IndexTriggerLeft    OculusTouch_IndexTriggerLeft
Pos_OculusTouch_IndexTriggerRight   OculusTouch_IndexTriggerRight
Pos_OculusTouch_HandTriggerLeft     OculusTouch_LThumb
Pos_OculusTouch_HandTriggerRight    OculusTouch_RThumb
OculusTouch_A       OculusTouch_B
OculusTouch_X       OculusTouch_Y

I now have custom bindings which work for me, but I want to understand how I was supposed to be using the Oculus Touch controllers, and how I might use those binding values myself.

  1. On the controller, how do I activate functions bound to OculusTouch_LThumb and OculusTouch_RThumb?
  2. On the controller, how do I activate functions bound to OculusTouch_IndexTriggerLeft and OculusTouch_IndexTriggerRight?
  3. What is the difference between Pos_OculusTouch_IndexTriggerLeft and OculusTouch_IndexTriggerLeft?
  4. What is the difference between Pos_OculusTouch_IndexTriggerRight and OculusTouch_IndexTriggerRight?

Examples

In original Oculus Touch bindings, the Pos_ versions are used for

---------------------------------   ---------------------------------
Pos_OculusTouch_IndexTriggerLeft    Pos_OculusTouch_HandTriggerRight
---------------------------------   ---------------------------------
SecondaryFire                       PrimaryFire
CyclePreviousPage                   CycleNextPage
CamZoomOut                          CamZoomIn
MultiCrewSecondaryFire              MultiCrewPrimaryFire
                                    StoreCamZoomIn & StoreCamZoomOut !                  
ExplorationFSSZoomOut               ExplorationFSSZoomIn

while the non Pos_ versions are used for

OculusTouch_IndexTriggerLeft        OculusTouch_HandTriggerRight
---------------------------------   ---------------------------------
DecreaseSpeedButtonPartial          IncreaseSpeedButtonPartial
MoveFreeCamDownAxis                 MoveFreeCamUpAxis

and the Thumb keys are bound to

OculusTouch_LThumb                  OculusTouch_RThumb
---------------------------------   ---------------------------------
UseAlternateFlightValuesToggle      ToggleFreeCam
ToggleBuggyTurretButton             FixCameraRelativeToggle
MultiCrewToggleMode
FixCameraWorldToggle

Incidentally, it looks like StoreCamZoomOut on Pos_OculusTouch_HandTriggerRight is a mistake.


Note, checking suggestions in comments, I can confirm that Elite Dangerous doesn't use any position or orientation information (6DOF) from the Oculus Touch controllers at all. You can use vJoy with elite-vr-cockpit to create a virtual HOTAS, but it's very fiddly (launch vJoy, then elite-vr-cockpit, then Elite in Windows 7 compatibility mode, to force it to run in Steam VR, plus having to reboot after every vJoy configuration change) and it really didn't work well for me.

I also verified that Elite doesn't register a trigger or grip until those buttons are actually pressed – just touching them isn't enough. Nor does Elite have any binding for 'thumb in it's rest position'.

Best Answer

Thumb bindings

The OculusTouch_LThumb and OculusTouch_RThumb bindings are triggered when you push down on the hat rather than rocking it in X and/or Y, so there was a 'button' that I'd missed on each controller.

Sadly, although it appears physically capable or it, the Thumb button doesn't work as a modifier, so you can't bind to something to pushdown and move in a hat direction either through analogue or digital bindings (i.e. OculusTouch_RThumb + OculusTouch_RStickY or OculusTouch_LThumb + Neg_OculusTouch_LStickX etc.). This is a real shame, as it could double the number of functions you could bind to the hat.

Trigger bindings

Having read through some Oculus developer documentation, I suspect that the Pos_OculusTouch_IndexTrigger* and OculusTouch_IndexTrigger* bindings are related to the different ways Trigger (and Grip/Hand controls) can be used. They are all 'analogue' axes, but the API allows you to use them as 'analogue' positional inputs or as digital inputs, switching at 50% of travel.

This is what I suspect the two bindings are. I would guess that originally the digital version was used, but later the game switched to using the analogue binding, presumably so they could fine tune response time - trigger at 25% for faster response, or trigger at 75% to prevent accidental triggering etc.

I suspect that I can't generate OculusTouch_IndexTrigger* triggers myself because Pos_OculusTouch_IndexTrigger* is always triggered first - it will be registered at less than 50% pull, so ED never sees the 50% trigger.

So, why are the non Pos_ bindings still in the .binds file?

I suspect that this is a throwback to the days before the Pos_ bindings were added and that practically the Pos_ and non Pos_ bindings are the same, you just can't capture the non Pos_ bindings in-game any longer.

I will have to investigate whether the trigger can be bound to analogue axes in game and have an analogue response to them, or whether you can set different trigger levels by pulling the triggers at different speeds.