The basis vectors panel shows spanning vectors for
the projective subspace used by the current window
to view the currently selected object.  In
addition, it displays the camera displacement
relative to the object, both as a displacement in
the higher dimensional space, and as a
displacement in the in the projective subspace
(relative to the coordinates of the current
window).  The default mode is to update these
values continually, but there is also an option to
"update once", after which it will not continually
poll Geomview and you can type in new values more
easily.

To best understand what these numbers do, try
changing them a little bit at a time.  For
example, replace the "camera view from" vector
with a larger multiple.  This should result in the
camera moving away from the current object.  (This
is not the same as using zoom; see the toolkit
help page for more details.)

Examples and explanation of changing the spanning
vectors:

Suppose you are looking at a standard projection
from four dimensions into three, by chopping of
the last coordinate.  The spanning vectors may
look like this (especially if you have just
begun):

x-dir: (1.00, 0.00, 0.00, 0.00) 
y-dir: (0.00, 1.00, 0.00, 0.00) 
z-dir: (0.00, 0.00, 1.00, 0.00)

Suppose you type a change into the first vector so
that it looks like (1.00, 1.00, 0.00, 0.00), and
then (without moving the mouse) press return.  The
panel should update itself to look like this:

x-dir: (0.70, 0.70, 0.00, 0.00) 
y-dir: (-0.70, 0.70, 0.00, 0.00) 
z-dir: (0.00, 0.00, 1.00, 0.00)

The new set of vectors is again an orthonormal
basis for the three dimensional projected subspace
shown in the current window.  Each time you type
something in, the result is processed by a
Gram-Schmidt algorithm, which normalizes the entry
just typed in and adjusts all the other vectors to
be orthonormal.  "All the other vectors" means the
other two displayed on the panel, as well as other
basis vectors that complete a basis for the n-d
space.  In the above example, if you had modified
the first vector to read (0.00, 0.00, 0.00, 1.00)
instead of (1.00, 1.00, 0.00, 0.00), then nothing
would have changed, because the Gram-Schmidt
algorithm would have detected a singularity and
returned the original values.  The singular matrix
in this case results from trying to set the first
vector equal to a fourth (undisplayed) vector, and
in general trying to type in a vector that is not
linearly independent of the others will not effect
any change.  In order to avoid this difficulty, it
is sometimes necessary to use a two step process.
In this case, if the first vector is first changed
to (.70,0.00,0.00,.70), and then to
(0.00,0.00,0.00,1.00), it should give the intended
result.  You can change the "unseen" vectors by
using this panel in combination with other cameras
(of the same cluster) whose projected axes include
those you wish to change.

This final paragraph is to be read by those who
want to know about the internal implementation of
this panel, in order to know _exactly_ what the
modification of these values does.  Casual users
hopefully will not need to know the following
details.  The information given on this panel is
basically four rows of a transformation matrix
relating object coordinates to camera coordinates.
This transformation matrix is actually the product
of several other matrices maintained within
Geomview.  In order to allow several cameras to
look at the same scene, Geomview keeps "camera to
universe" matrices.  In order to allow movement of
different objects relative to one another,
Geomview keeps "object to world" matrices.  And in
order to allow movement of the "world" all at
once, Geomview keeps "world to universe" matrices.
So to find an "object to camera" transform used in
this panel, appropriate object, world, and camera
matrices are multiplied together, and when the
user modifies one of the values on the panel, the
appropriate matrix is recalculated and sent back.
Appropriate in this case means that, when the
world is the current object (or targetgeom, in the
language of Geomview) then modifications are made
to the camera matrix, which may affect all the
cameras attached to that camera's cluster.  When
something else is the current object (targetgeom),
the object matrix is modified.  In neither case is
the world modified.  ( It is possible to simulate
a movement of the world either through repeated
movements of cameras or objects, whichever is
easier.)  All of these matrices can be examined
directly by using Geomview's command language.
For example, to get the camera c0's matrix, give
Geomview the command (echo (ND-xform-get c0))
