VRManager : Immersive Virtual Reality Abstraction Framework
[Under Construction]
See our I3D 2005 poster
Introduction
VRManager is an abstraction framework designed to simplify the process of integrating single or multiple tracking
systems and displays into virtual reality applications. It uses a simple and flexible XML configuration format
to define the relationships between tracking systems and the real world, and provides a very simple API for
accessing tracking information. VRManager allows the end programmer to draw objects in real world coordinates
without having to worry about the location of either user or viewport.
Motivation
There is an abundance of custom-built virtual reality applications, with each reinventing the algorithms involved
in interpreting tracking information and displaying accurate projections. VR programming should be focused on the creation
and presentation of content, rather than the management of tracking and projection information. VRManager is designed to be
flexible enough to fit into any application and assume the task of integrating tracking information and configuring projection
matrices. It also greatly simplifies the process of configuring a VR system by automating input of coordinates and transformations
for VR elements. ...allows multiple users and applications to share common information such as screen locations and tracker systems, while
Downloads
Download source code here
Debian-style linux binaries are available for i386 and amd64 by adding the following line to your /etc/apt/sources.list file:
deb http://thunderlab.mines.edu/packages current main
Related work
- OpenTracker (http://studierstube.org/opentracker/) is also an XML based framework for integrating multiple tracking systems
(and is much more ambitious at that), but has no notion of the display half of the VR system. Integration of tracking data
is only a small part of VRManager's scope.
- FreeVR (www.freevr.org) is a similar framework for developing VR applications, with some subtle differences. VRManager is
designed to operate independently of the realm of VR and has a less invasive programming model.
Features
- Allows objects to be drawn and interacted with in real world coordinates VRManager handles transformations between
all of the various coordinate systems (tracker, application, world) and also automatically generates the correct projection
matrix for any combination of viewport and viewpoint.
- VR hardware calibration such as tracker and screen locations are kept in global XML configuration files so the end
programmer does not have to worry when the hardware calibration has changed.
- Low-profile implementation makes porting easy
Since VRManager handles all of its operations in its own threaded environment, there is no need to hand program control
over to it. This means that VRManager integrates easily into existing graphics programming environments (such as GLUT or SDL);
the only code that needs to change is the code which sets the projection matrix.
- Open source C++ framework is easy to extend
VRManager is written in object-oriented C++, making it easy to add new types of trackers and viewports. Currently
only VRPN tracking systems are supported, and all displays must be rectangular.
- Automatic projector distortion and blending VRManager automatically corrects for non-rectangular displays (such as
off-angle projections) and will soon have the ability to blend between overlapping projections to make seamless projector tiling
as painless as possible.
- Handles multiple distributed viewports, allowing for immersive VR
VRManager can create projection matrices for any number of viewports, allowing distributed rendering over large areas
- Dynamic viewports--this means you can track the location of a screen (such as a tablet or projector) and render accordingly
Viewports are defined by the points at their corners, and since all points can be defined as relative to a tracker,
viewports can also be defined this way. This allows the application to treat a tracked display as a dynamic "window" into
the virtual world.
- Configuration is dynamic at runtime
VRManager polls its configuration files for changes at runtime, allowing easy tuning of the configuration. For example,
you can change the location and orientation of a running program just by altering its configuration; no extra programming
is needed.
- Graphical configuration utility allowing easy manipulation of configuration files
VRManager includes a GLUT based configuration utility designed to simplify the process of locating points in space
such as the corners of a screen or a user's eyes relative to their tracker.
- XML configuration format; easy to read and write
VRManager uses a distributed XML format, meaning a single application can make use of configuration information
from many different XML files. The configuration format also allows VRManager to dynamically select different
configurations based on location, user, and application.
- Uses intuitive vector/matrix math library, simplifying common application tasks
The included vector math library supports most common vector/matrix operations, which is crucial to any interactive VR
- 3D user interface library in progress
Our experimental UI library is designed to mimic real-world controls, such as moving an object from one place to another,
turning a knob, or pushing a button.
API
VRmanager's API is quite simple:
// Create a VRManager object given an XML configuration file
VRManager("config_file.xml") vrm;
// Request the location of a pointer by name
Vector pointerPosition = vrm.getPointerLocation("pointerName");
// Or, request the transformation matrix of the pointer instead
Matrix pointerTransform = vrm.getPointerTransform("pointerName");
// Head-tracked rendering is simple too
// all you need to do is set up your projection matrix and begin drawing
glLoadMatrixf( vrm.getGlProjectionMatrix( "eyeName", "viewportName", nearClipPlane, farClipPlane );
There are many other useful API calls, but these are the most important.
Configuration:
VRManager's XML configuration is easy and flexible:
<vrmanager>
<!-- All programs tend to use a different coordinate system,
this feature allows you to define the reationship between
the program's coordinate system and the real world -->
<coordSystem>
<translate vector="2.7, 5.4, 1.3"/>
<scale vector="1, 1, 1"/>
<rotate angle="270" axis="0, 0, 1"/>
</coordSystem>
<!-- Currently only VRPN tracking systems are supported -->
<trackerSystem type="vrpn_tracker" name="Tracker0@hiball">
<!-- Each tracking system has its own coordinate system -->
<coordSystem>
<translate vector="0, 0, 0"/>
</coordSystem>
<!-- Multiple trackers are allowed, and any number of points relative to the tracker
can be defined and referenced by name -->
<tracker id="0">
<pointer name="eye_left" vector="-0.020, 0.08, -0.17"/>
<pointer name="eye_right" vector=" 0.047, 0.08, -0.17"/>
<pointer name="eye_center" vector=" 0, 0.08, -0.17"/>
</tracker>
</trackerSystem>
<!-- Static points can also be defined, such as the corners of a screen -->
<!-- Screens are defined by a set of four points and a reference name. -->
<viewport name="rumble_screen0">
<pointer name="ul" vector="1.2250, 1.1076, 1.2293"/>
<pointer name="ur" vector="1.5765, 1.2521, 1.2369"/>
<pointer name="bl" vector="1.2344, 1.1050, 0.9278"/>
<pointer name="br" vector="1.5791, 1.2588, 0.9342"/>
</viewport>
</vrmanager>