This project aims to provide a Free and Open Source API and drivers for immersive technology, such as head mounted displays with built in head tracking.
This repository is primarily for development of support for Oculus Rift CV1 and Rift S headsets.
2021-01-19 - Positional tracking support is ongoing in this repo
Development toward full positional tracking is happening here in the https://github.com/thaytan/OpenHMD/tree/rift-kalman-filter branch. This branch has the latest code for acquiring device positions from LED matching and tracking over time.
My current focus is on improving the computer vision to:
- Improve device acquisition and matching using IMU orientation data, particularly for controllers
- Reduce jitter in tracking
- Improve tracking under difficult conditions - when device LEDs are heavily occluded or start to merge into one tracking blob at a distance or sharp angles to the camera.
- More testing of multiple camera setups.
There are also various issues to resolve - spurious startup errors with USB transactions, and occasional watchdog timeouts that lead to a black screen.
Joey made a demo video of current tracking status with a DK2 at https://www.youtube.com/watch?v=3AdmS3vy7ZE
2021-01-19 - For Rift S, upstream OpenHMD has a working 3DOF driver. I plan to work on positional support after CV1 tracking is in a functional state, unless someone else tackles it first.
OpenHMD is released under the permissive Boost Software License (see LICENSE for more information), to make sure it can be linked and distributed with both free and non-free software. While it doesn't require contribution from the users, it is still very appreciated.
For a full list of supported devices please check https://github.com/OpenHMD/OpenHMD/wiki/Support-List
- Linux
- Windows
- OS X
- Android
- FreeBSD
- Option 1: Meson + Ninja
- Option 2: GNU Autotools (if you're building from the git repository)
- Option 3: CMake
- HIDAPI
- GO bindings by Marko (Apfel)
- Java bindings by Joey Ferwerda and Koen Mertens
- .NET bindings by Jurrien Fakkeldij
- Perl bindings by CandyAngel
- Python bindings by Lubosz Sarnecki
- Rust bindings by The_HellBox
- libvr - http://hg.sitedethib.com/libvr
Using Meson:
With Meson, you can enable and disable drivers to compile OpenHMD with. Current available drivers are: rift, deepon, psvr, vive, nolo, wmr, xgvr, vrtek, external, and android. These can be enabled or disabled by adding -Ddrivers=... with a comma separated list after the meson command (or using meson configure ./build -Ddrivers=...). By default all drivers except android are enabled.
meson ./build [-Dexamples=simple,opengl]
ninja -C ./build
sudo ninja -C ./build install
Using CMake:
With CMake, you can enable and disable drivers to compile OpenHMD with. Current Available drivers are: OPENHMD_DRIVER_OCULUS_RIFT, OPENHMD_DRIVER_DEEPOON, OPENHMD_DRIVER_PSVR, OPENHMD_DRIVER_HTC_VIVE, OPENHMD_DRIVER_NOLO, OPENHMD_DRIVER_WMR, OPENHMD_DRIVER_XGVR, OPENHMD_DRIVER_VRTEK, OPENHMD_DRIVER_EXTERNAL and OPENHMD_DRIVER_ANDROID. These can be enabled or disabled adding -DDRIVER_OF_CHOICE=ON after the cmake command (or using cmake-gui).
mkdir build
cd build
cmake ..
make
sudo make install
To avoid having to run your applications as root to access USB devices you have to add a udev rule (this will be included in .deb packages, etc).
A full list of known usb devices and instructions on how to add them can be found on: https://github.com/OpenHMD/OpenHMD/wiki/Udev-rules-list
After this you have to unplug your device and plug it back in. You should now be able to access the HMD as a normal user.
CMake has a lot of generators available for IDE's and build systems. The easiest way to find one that fits your system is by checking the supported generators for you CMake version online. Example using VC2013.
cmake . -G "Visual Studio 12 2013 Win64"
This will generate a project file for Visual Studio 2013 for 64 bit systems. Open the project file and compile as you usually would do.
Using CMake:
For MinGW cross compiling, toolchain files tend to be the best solution. Please check the CMake documentation on how to do this. A starting point might be the CMake wiki: http://www.vtk.org/Wiki/CmakeMingw
If you're linking statically with OpenHMD using windows/mingw you have to make sure the macro OHMD_STATIC is set before including openhmd.h. In GCC this can be done by adding the compiler flag -DOHMD_STATIC, and with msvc it can be done using /DOHMD_STATIC.
Note that this is only if you're linking statically! If you're using the DLL then you must not define OHMD_STATIC. (If you're not sure then you're probably linking dynamically and won't have to worry about this).
A list of pre-built backages can be found on http://www.openhmd.net/index.php/download/
See the examples/ subdirectory for usage examples. The OpenGL example is not built by default, to build it use the --enable-openglexample option for the configure script. It requires SDL2, glew and OpenGL.
An API reference can be generated using doxygen and is also available here: http://openhmd.net/doxygen/0.1.0/openhmd_8h.html