VR Tracking for Trinus PSVR - Trinus Virtual Reality

VR Tracking for Trinus PSVR

Trinus PSVR supports several methods to emulate VR Controllers. You can play plenty of games without them (games with gamepad or keyboard/mouse support, see the list on Steam), but many do require the VR controllers. In order to play those, Trinus offers a few low cost solutions that emulate the controllers, even though there are some limitations inherent to the hardware used for emulation.

Just to clarify, 3dof means 3 degrees of freedom (rotation tracking) while 6dof is 6 degrees of freedom, that is, you can rotate and move in space (rotation + position tracking).

In the Trinus Tracking tab, you will see 3 selectors, for head, left and right hands. You can assign different control methods for each. Leaving one of the hand selectors empty, will duplicate the other hand selector so same control method will take care of both controllers (eg. assigning one mouse, its movement will be replicated on both hands).

As for the head selector, you will have options to enable position tracking, rotation tracking (overriding default sensors) or both.

Trinus Hand

Trinus Hand is an Android app that connects to PC via bluetooth and lets you use your phone as a VR Controller. The app presents all the necessary VR buttons, even with the option to display separate buttons for each controller. Just like with the other options, you can use one smartphone to control both hands, or two phones for separate control. Trinus Hand should work even on old phones, as long as they have gyroscope sensor.

Before using Trinus Hand, you will need to pair your phone with Windows. This only needs to be done once. You can find instructions on how to do that here. Once paired, your bluetooth device will show in the Trinus selectors. You can set it, start Trinus and start the Trinus Hand app on Android. 

You can install Trinus Hand for free on Google Play.


Trinus will convert mouse movements into controller rotation. Since the mouse moves on a 2D plane (eg. your table surface), it actually only has 2 degrees of freedom (yaw and pitch, no roll) but that's enough for certain games, like some first person shooters where the controllers are used to aim.

Mouse buttons are mapped as follows: left button as Trigger, right button as Grip, middle button as App Menu and wheel as Touch pad up&down. If mouse wheel is set to move forward&back (in Main tab, 'Use Mouse Wheel' checkbox), then the wheel will move the controllers back and forth instead of doing Touch pad up&down.

You can use a single mouse (to move both controllers in sync) or 2 mice to have separate hand controls.


A single gamepad can be used to emulate both VR Controllers. The thumbsticks are used to aim the controllers, similar to the Mouse method, with rotations constrained to yaw and pitch (2 degrees of freedom). But the gamepad has plenty of buttons allowing more options. For example, the directional pad is used to change the controllers position in space, allowing better interaction with the game's VR world.

See below the mappings:

FreePie Bridge

PSMoveService is a tool that allows headset and PS Move controllers tracking on PC. This tracking data is sent directly to SteamVR, except for the head position data, that needs to be sent to Trinus, to be combined with the head orientation data.

PSMoveService FreePie Bridge is another tool, which takes care of feeding that position data from PSMoveService into Trinus. In order to tell Trinus to grab this position data, you can choose the FreePieHead Bridge Position option in Trinus Tracking tab.


This is for advanced users!

FreePie is a very handy software that can integrate different controllers and customise their behaviour to match your preference. It supports many different inputs, like Wiimotes, joysticks, keyboard, etc. and, thanks to Python scripting, you have a powerful way to tweak controllers (and head movement).

You will find download link and all the information on how to use FreePie at http://andersmalmgren.github.io/FreePIE

FreePie generates an output that Trinus can read through its FreePieIO[] array, which contains 4 blocks (FreePieIO[0] to FreePieIO[3]), that include Yaw, Pitch, Roll, X, Y and Z information. Trinus will read those blocks expecting a specific format, as described below. You can download this reference script that shows how the encoding is done, sampling keyboard input to act as controllers or headset.

- FreePieIO[0] is decoded into SteamVR controller buttons. As stated, a FreePieIO block contains Yaw, Pitch, Roll, X, Y and Z data as floats (floating point numbers that use 4 bytes of memory). This is not suitable for button information, so such data is encoded in the bytes of the float: YawByte[0]= Left Trigger, YawByte[1]= Right Trigger, YawByte[2]= Left System Button, YawByte[3]= Right System Button, PitchByte[0]= Left App Menu, PitchByte[1]= Right App Menu, PitchByte[2]= Left Grip, PitchByte[3]= Right Grip, RollByte[0]= Left Touch Pad Enable, RollByte[1]= Right Touch Pad Enable, RollByte[2] and RollByte[3] are not used, XByte[0]=Left Touch Pad X, XByte[1]= Right Touch Pad X, XByte[2]= Left Touch Pad Y, XByte[3]= Right Touch Y, Y and Z are not used.

Note that Triggers and TouchXY values range from 0 to 255, while all the other inputs are 0 or 1.

- FreePieIO[1] is for head tracking data. You can choose whether Trinus will use rotation (Yaw, Pitch, Roll, overriding default sensors), position (X, Y, Z) or both

- FreePieIO[2] is for left controller tracking data

- FreePieIO[3] is for right controller tracking data