fshake3d  0.0.1
FreeformDensity3DSurfaceEditor
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines
transform_LookAt.cpp
Go to the documentation of this file.
00001 #include "transform_LookAt.hpp"
00002 #include "opengl.hpp"
00003 
00004 LookAt::LookAt()
00005 {
00006   identity(mTransform);
00007   identity(mInverse);
00008 }
00009 
00010 void LookAt::computeVectors()
00011 {
00012   Vec3d f = mCenter - mEye;
00013   mForward = makeNormal( f );
00014   mUp      = makeNormal(mUp);
00015   mSide    = makeCross(mForward,mUp);
00016 }
00017 
00018 void LookAt::computeTransform()
00019 {
00020   computeVectors();
00021   
00022   mTransform(0,0) =  mSide[0];
00023   mTransform(0,1) =  mSide[1];
00024   mTransform(0,2) =  mSide[2];
00025   mTransform(1,0) =  mUp[0];
00026   mTransform(1,1) =  mUp[1];
00027   mTransform(1,2) =  mUp[2];
00028   mTransform(2,0) = -mForward[0];
00029   mTransform(2,1) = -mForward[1];
00030   mTransform(2,2) = -mForward[2];
00031 
00032   mTransform(0,3) = -mEye[0]*    mSide[0] + -mEye[1]*    mSide[1] + -mEye[2]*    mSide[2];
00033   mTransform(1,3) = -mEye[0]*      mUp[0] + -mEye[1]*      mUp[1] + -mEye[2]*      mUp[2];
00034   mTransform(2,3) = -mEye[0]*-mForward[0] + -mEye[1]*-mForward[1] + -mEye[2]*-mForward[2];  
00035 }
00036 
00037 void LookAt::computeInverse()
00038 {
00039   computeVectors();
00040 
00041   mInverse(0,0) =  mSide[0];
00042   mInverse(1,0) =  mSide[1];
00043   mInverse(2,0) =  mSide[2];
00044   mInverse(0,1) =  mUp[0];
00045   mInverse(1,1) =  mUp[1];
00046   mInverse(2,1) =  mUp[2];
00047   mInverse(0,2) = -mForward[0];
00048   mInverse(1,2) = -mForward[1];
00049   mInverse(2,2) = -mForward[2];
00050 
00051   mInverse(0,3) = mEye[0]*mSide[0] + mEye[1]*mUp[0] + mEye[2]*-mForward[0];
00052   mInverse(1,3) = mEye[0]*mSide[1] + mEye[1]*mUp[1] + mEye[2]*-mForward[1];
00053   mInverse(2,3) = mEye[0]*mSide[2] + mEye[1]*mUp[2] + mEye[2]*-mForward[2];
00054 }
00055 
00056 void LookAt::computeTransformGL()
00057 {
00058   glPushAttrib(GL_TRANSFORM_BIT);
00059   glMatrixMode(GL_MODELVIEW);
00060   glPushMatrix();
00061   glLoadIdentity();
00062   gluLookAt(mEye[0],mEye[1],mEye[2],mCenter[0],mCenter[1],mCenter[2],mUp[0],mUp[1],mUp[2]);
00063   glGetDoublev(GL_MODELVIEW_MATRIX, &mTransform(0,0) );  
00064   glPopMatrix();
00065   glPopAttrib();
00066 }