Most VR display structures and their tracking hardware generally limit a user's movements to a 10 foot square area or smaller. This is not enough space for many applications, so it is necessary to introduce a navigation coordinate transformation that simulates moving the VR device's physical coordinate system around in the virtual world. The CAVELib maintains a navigation transformation matrix that is controlled by various functions, and provides conversions between the tracker (physical) and world (navigated) coordinate systems.
The basic functions for navigation are CAVENavTranslate(), CAVENavRot(), and to a lesser use CAVENavScale(). The transformations are all defined relative to the physical coordinate system; i.e. a CAVENavTranslate(0.0,0.0,-1.0) will move the user's device coordinate space (local coordinates) through the virtual world one unit along the worlds -Z axis, and a CAVENavRot(30.0,'y') will turn the user's view of the environment 30 degrees to the left. Other functions for affecting the navigation matrix are CAVENavLoadIdentity(), CAVENavLoadMatrix(), CAVENavMultMatrix(), and CAVENavGetMatrix().
When the CAVELib executes an application's display function, the default coordinate system is still the physical coordinates. To render objects properly in a navigated environment the application should call CAVENavTransform() prior to any graphics calls.
It is sometimes necessary to convert values between the physical and navigated coordinate systems. The function CAVENavConvertCAVEToWorld() will take a position in physical coordinates and transform it into navigated coordinates; CAVENavConvertWorldToCAVE() will perform the reverse transformation. CAVENavConvertVectorCAVEToWorld() and CAVENavConvertVectorWorldToCAVE() will perform the same transformations for direction vectors instead of positions.
The library stores the navigation matrix in shared memory, so these functions can be called from any process. One suggestion is to calculate navigation amounts and make the navigation function calls once per frame in the master process so that all display processes have the same value prior to rendering any graphics.