/*
3D Viewing and Rotation Using Orthonormal Bases
by Steve Cunningham
from "Grahics Gems", Academic Press, 1990
*/
/*
* Transformations are presented as 4 by 3 matrices, omitting the
* fourth column to save memory.
*
* Functions are used from the Graphics Gems vector C library
*/
#include "GraphicsGems.h"
typedef float Transform[4][3];
void BuildViewTransform( VRP, EP, UP, T )
Point3 VRP, EP, UP;
Transform T;
{
Vector3 U, V, N;
float dot;
/*
* Compute vector N = EP - VRP and normalize N
*/
N.x = EP.x - VRP.x; N.y = EP.y - VRP.y; N.z = EP.z - VRP.z;
V3Normalize(&N);
/*
* Compute vector V = UP - VRP
* Make vector V orthogonal to N and normalize V
*/
V.x = UP.x - VRP.x; V.y = UP.y - VRP.y; V.z = UP.z - VRP.z;
dot = V3Dot(&V,&N);
V.x -= dot * N.x; V.y -= dot * N.y; V.z -= dot * N.z;
V3Normalize(&V);
/*
* Compute vector U = V x N (cross product)
*/
V3Cross(&V,&N,&U);
/*
* Write the vectors U, V, and N as the first three rows of the
* first, second, and third columns of T, respectively
*/
T[0][0] = U.x; /* column 1 , vector U */
T[1][0] = U.y;
T[2][0] = U.z;
T[0][1] = V.x; /* column 2 , vector V */
T[1][1] = V.y;
T[2][1] = V.z;
T[0][2] = N.x; /* column 3 , vector N */
T[1][2] = N.y;
T[2][2] = N.z;
/*
* Compute the fourth row of T to include the translation of
* VRP to the origin
*/
T[3][0] = - U.x * VRP.x - U.y * VRP.y - U.z * VRP.z;
T[3][1] = - V.x * VRP.x - V.y * VRP.y - V.z * VRP.z;
T[3][2] = - N.x * VRP.x - N.y * VRP.y - N.z * VRP.z;
return;
}