fshake3d
0.0.1
FreeformDensity3DSurfaceEditor
|
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 }