Kyle,
(it looks like you just figured it out, but I was
about to send this response anyway; let me know if it is consistent with
your newly found wisdom)
It looks like you want to be able to describe an
object in world coordinates, and view that object from a camera
positioned in world coordinates.
Let's say that the camera origin is at (Px, Py,
Pz), the camera's "up" direction is VUP = (VUPx, VUPy, VUPz), and the camera
is looking in the direction DIR = (DIRx, DIRy, DIRz). These are all
defined in world coordinates, which we will call W-space. This
position and two directions ("up" and "forward") define a "frame" or
coordinate system, which we will call C-space. You probably want
to have the VUP vector align with the +Y axis of C-space, and the DIR
direction align with the -Z axis of C-space.
We
are missing a vector to align with the +X axis of C-space, the "right"
vector: RT = (RTx, RTy, RTz). So, we need a new
"right" vector (in world space) which is perpendicular to VUP and DIR.
This can be computed with a cross product. Assuming DIR and
VUP are normalized (unit length):
RT
= DIR x VUP
Note that RT is normalized, perpendicular to VUP
and DIR, and points to the "right" as required. If you do the cross
product in the opposite order, RT will point "left" which is not what we
want.
With these three vectors, and the camera position
(all in W-space) we can easily build a matrix that will take points in
C-space and tell us where they are in W-space. This matrix
is:
RTx VUPx -DIRx
Px
RTy VUPy -DIRy
Py
RTz VUPz -DIRz
Pz
0 0 0
1
Notice that the first column, the "X column",
contains the RT vector, and similarly with the second and third
columns. (DIR is negated because we want to look down the -Z axis, not
the +Z)
However, this matrix is not quite what you need:
this matrix take points in C-space and expresses them in W-space, i.e. a
"C-to-W" matrix. I think you really want a matrix that will take
points in W-space and express them in C-space, a "W-to-C" matrix. This
is simply the inverse of the C-to-W matrix:
(corrected matrix)
RTx RTy RTz (-Px*RTx -
Py*RTy - Pz*RTz)
VUPx VUPy VUPz (-Px*VUPx -
Py*VUPy - Pz*VUPz)
-DIRx
-DIRy -DIRz (Px*DIRx + Py*DIRy +
Pz*DIRz)
0
0 0
1
(sorry for the bad formatting) Using the
terminology for most graphics APIs, this is a view
matrix.
This explanation assumes that your are using the
"typical" transformation matrix orientation, where the translation
parameters are in the fourth column (not the fourth row), i.e.
R
R R T
R
R R T
R
R R T
0
0 0 1
Clarification: I can easily translate
the vrp to the world coordinate origin. I just want to rotate the
viewer's coordinate system so that the axis coincides with the world
coordinate system. Does it have to do with calculating the
projection, and then doing the cross product? I am in dire
straits. Any help is greatly appreciated.
/**
* Kyle Wayne Kelly
* Computer Science
Student
* University of New Orleans
*
504-391-3985
*
http://www.cs.uno.edu/~kkelly
* Glory to God!
* El temor del hombre pondra lazo;
*
Mas el que confia en Jehova sera exaltado. (Proverbios 29:25)
*/
----- Original Message -----
Sent: Sunday, April 22, 2001 2:33
PM
Subject: [JAVA3D] Let me try to say
this more clearly
I am implementing a 3D system. I want
to shift the viewers reference point to the origin of the
world coordinate system. Second, I want to rotate the viewers
coordinate system, so that the users axis lie on top of the world
coordinate system. I want to use properties of special orthogonal
matrices. Can anyone explain how to use special orthogonal
matrices to rotate the viewers system to the world coordinate
system? I am implementing this in Java, but I am not using
Java3D. Does anyone know of any web pages that might have good
information about this or can explain how this rotation works? If
you can explain using vectors without any actual coding then that would
be perfect.
/**
* Kyle Wayne
Kelly
* Computer Science Student
* University of New
Orleans
* 504-391-3985
* http://www.cs.uno.edu/~kkelly
* Glory to God!
* El temor del hombre pondra lazo;
*
Mas el que confia en Jehova sera exaltado. (Proverbios 29:25)
*/