Our Immersadesk is connected to the display of nighthawk.cc, a 16 processor Once the desk is on, it should show the current display of nighthawk. In order to ultilize stereo video on the Immersadesk, the display resolution Once you are logged on to nighthawk, you can try out some demos. The The general form of a CAVElib program is: #include <cave.h> void app_shared_init(); main(int argc,char Error: this should not happenargv) CAVEConfigure reads a configuration file which contains information app_shared_init is a the place where the programmer should initialize
display unit produced by Fakespace Systems with a cpu on board to handle
its stereo video capabilities. The one we have in the systems lab room
201 is the ImmersaDesk
R2. This howto will describe the basic operations of the Immersadesk
and how to use its virtual reality facilities. A sample application written
by me will be provided, in addition to the pointers to many more sample
In order to experience the stereo effect, the user of the Immersadesk must
wear the goggles provided. These goggles along with the "wand" or the joystick
are usually kept in the drawer attached to the desk. When stereo display
is rendered on the desk, the effective images for the left and right eyes
swap back and forth constantly while the left and right polarized eye pieces
of the goggle shut and open at the same frequency as the swap so that the
left eye piece lets in only the left eye frames and the right eye piece
lets in only the right eye frames. In addition, the Immersadesk has a tracker
of built in which allows the programs using the desk to know the positions
of the user's head (from the sensor attached to the goggle) and the positions
of the user's wand. The wand is a controller with a joystick and three
buttons. It is ususally used by programs to navigate through the virtual
reality worlds and manipulate the various objects in them.
Silicon Graphics machine. To turn on the device, find the Immersadesk's
remote control and push the "stby" or standby button. Do this again to
put the desk back on standby mode. Do not push the power button, it may
cause the desk to be incorrectly calibrated.
The keyboard and mouse of the nighthawk are connected to the Crestron,
which is a black shelf-like system on the corner of the systems lab, it
is an elaberate system used to route inputs and outputs of other systems.
If you do not yet have access to nighthawk you will need to talk to Matt
must be set to 640x800 or lower, and nighthawk must be told that stereo
is on. If this is not the case, the virtual reality programs will not work
and you will need to talk to Matt Wolf to change the display settings.
demos are located in the directory /usr/local/CAVE/demos, the executables
of are named run_<demo> where <demo> is the name of the particular
demo. There is a diagnostic program cavevars under the /usr/local/CAVE/bin
directory. When ran, it shows the values supplied by the tracker. To ensure
the tracker is working properly, move around the tracked goggles and the
wand and see that the corresponding values are changing. If the tracker
is not working properly, that usually means the tracker daemon which listens
to the tracker on the Immersadesk needs to be restarted. This is done by
executing the restarttrackd program under the same directory as cavevars.
Restarting the tracker daemon requires special previlages on nighthawk.
The crashing of the track daemon usually cause the CAVElib programs to
be unable to run.
CAVElib is a library for Virtual Reality programming. It is a layer
on top of a standard graphics library – in our case openGL – that handles
stereo output, interfacing the tracker daemon, networking issues dealing
with remote input and display devices, and some others. For a programmer
with experience using openGL, it is fairly simple to use CAVElib to write
a VR program. The most complete resource for programming in CAVElib is
its User's Manual . There
you can find instructions on how to compile your first program, how to
configure the software and hardware, and reference to all of the function
calls provided by the library.
about the Immersadesk, and which tracker sensors are available.
any shared data between the main loop and the rendering process.
CAVEInit basically creates all the processes that run in the CAVElib.
CAVEInitApplication receives the pointer to a graphics initialization routine.
This is necessary because the initialization of graphics must be done in
the rendering process rather than the main process.
CAVEDisplay takes the frame display function as an argument, the function
is called at every frame.
app_compute_init is the place to put all the initial computations of the
The while(!getbutton(ESCKEY)) app_compute(); line is the input loop. The
getbutton function continually checks for input from the wand. The result
of which can be feed into the applications computation in app_compute.
CAVEExit kills all processes and ends the program properly.
To get you started, here are some sample programs. If you are more motivated, you could also look at the source
code for the demos distributed with CAVElib. here CAVE_fractal_mountain.tar.gz
is the demo program I wrote, it displays and allows the user to navigate
through a recursively generated fractal mountain and was originally a project
for a graphics class.
Some Useful Functions
Here are some of the useful functions provided, a complete list of them
can be found here.
CAVENavTransform() - applies the navigational matrix to the scene. The
navigational represents the position and orientation of the current perspective
of the user.
CAVENavLoadIdentity() - sets the navigational matrix back to the identity
CAVENavScale(double x, double y, double z) - scales the navigational matrix.
CAVENavTranslate(double x, double y, double z) - translates the navigational
CAVEGetTime() - returns the current time in seconds.
CAVEgetbutton(CAVE_DEVICE_ID device) - returns whether the device corresponding
to the device ID passed in was triggered.
CAVEGetPosition(CAVEID posname,float pos) - stores in pos the position
of the sensor corresponding to posname.
CAVEbuttonChange(int button) - returns whether the button corresponding
to button changed.
Much of the trouble i ran into with CAVElib were due to the differences
between the glut library and the CAVElib. Here are some tips that I think
might be useful:
do not use anything from glu.h or glut.h, like gluLookAt, or glutSwapBuffers
all of the list generated in openGL must be generated in graphics initialization
function passed to CAVE_init_application(), or else the list will not be
at the beginning of the display function passed to CAVEDisplay, do not
call glLoadIdentity(), this will mess up the display orientation
CAVElib Users Manual
Link to this Page
Our Immersadesk is connected to the display of nighthawk.cc, a 16 processor
Once the desk is on, it should show the current display of nighthawk.
In order to ultilize stereo video on the Immersadesk, the display resolution
Once you are logged on to nighthawk, you can try out some demos. The
The general form of a CAVElib program is:
main(int argc,char Error: this should not happenargv)
CAVEConfigure reads a configuration file which contains information
app_shared_init is a the place where the programmer should initialize