openvr-customhmd
DIY attempt for building OpenVR compatible HMD and controllers, and drivers (Windows only).
I started my VR experience with a custom built HMD by using parts of a disassembled Sony HMZ-T2, an Arduino based Head Tracker, and OpenTrack software. But only few games were supporting FreeTrack-like protocols. So I decided to write a complete OpenVR driver which hopefully will support newer games, and I hope I will be able to play some VR games with friends who cannot afford ridiculously expensive hardware.
Some features:
- Tracking and controller hardware is based on STM32F103.
- Supporting fake framepacked 3D signal for HMD's with two monitors or 3D TV's. (double horizontal resolution :+1:)
- IVRVirtualDisplay supporting driver for Android phone based orientation tracking and display. (in progress...)
- Working IVRDirectModeComponent implementation, just for reference.
- Lighthouse-like positional tracking, (or ultrasound TimeOfFlight based, still experimenting, also in progress...)
- Expose any USB WebCam (YUY, YUV or RGB) to OpenVR (for Room-View or other camera functions).
- Autodetect monitor position and size in Extended mode for placing the HeadSet Window.
- Minimal electronics in trackers/controllers. (eg. no button debouncing filters, all done in code. 72Mhz can handle it.)
- Controllers communicate wireless with the HeadSet, which is connected via USB cable to the computer.
- PSVR support
- ...
Dependencies:
ffmpeg from NuGet, for compiling the driver AMD AMF libraries.
- dotNet 4.6.2, for the HMD monitor program.
- LibUsbDotNet
- http://zadig.akeo.ie/ Zadig to install usb driver for handling PSVR
- VC2015 Runtime, for using the driver
ToDo:
- Positional tracking. (Already done some experiments with 2 DIY laser lighthouses, servo and stepper. Servo is too noisy and slow, stepper needs extra controllers. cheapest solution may be tracking by ultrasound...)
Fix/flip quaternion from RotationVector sensor for Android tracking. Using GoogleVR
Hardware encoding instead of ffmpeg?
- Use OpenGL mesh for distortion correction on Android display?
Remove magnetic sensor input from trackers.
- Find a friendlier way to calibrate tracker sensors.
- Lower latency in encoding -> network -> decoding -> display pipeline. (1920x1080@60 FPS encoding already less than 10 ms, no framedrops on network, MediaCodec decoding @60 FPS, but seems a bit delayed)
- ...
After long resisting to buy one of the expensive but ready VR solutions, I finally bought a Vive (for twice of the actual price :sob: ).
Unlike my older Sony headset's and unlike both my phones screens (G5, Z3), the ones in this expensive HMD are crap; the screen-door effect is annoying, the lenses generate too much flare when there are bright areas in corners etc. Text is unreadable even when doing 2x oversampling. Seems positional tracking is the only thing I paid for :angry:. Shame on me, for buying such an immature product for such a price. I'm going to sacrifice some FOV, FPS, accuracy and latency for readability, and use my phone as output display for playing games like Elite Dangerous or DCS, which are uncomfortable to play on the Vive because it gives me eye pains. I used to play ED for hours with the orientation-only DIY'ed Sony ...