00001
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "K3dMatrixWork.h"
00034
00035 K3dMatrixWork::K3dMatrixWork ( K3dGameData *_pGameData )
00036 {
00037 m_pGameData = _pGameData;
00038
00039 m_pGameData->SetMatrixWork ( this );
00040 m_pVector3Work = m_pGameData->GetVector3Work();
00041 }
00042
00043 K3dMatrixWork::~K3dMatrixWork ( void )
00044 {}
00045
00047 void K3dMatrixWork::RotationUpVector ( K3dMatrix &_rM, const K3dVector3Obj &_rV )
00048 {
00049 K3dVector3Obj kV;
00050 K3dVector3Obj kUp ( 0,1,0 );
00051 K3dVector3Obj kCross;
00052 float fAngle;
00053
00054 kV = _rV;
00055 kV = m_pVector3Work->Normalize ( kV );
00056 kCross = m_pVector3Work->Cross ( kUp, kV );
00057 kCross = m_pVector3Work->Normalize ( kCross );
00058 fAngle = m_pVector3Work->Dot ( kV, kUp );
00059 fAngle = acos ( fAngle );
00060 _rM.Rotation ( kCross, fAngle );
00061 }
00062
00064 void K3dMatrixWork::RotationUpVectorGL ( K3dMatrix &_rM, const K3dVector3Obj &_rV )
00065 {
00066
00067 K3dVector3Obj kV;
00068 K3dVector3Obj kUp ( 0,1,0 );
00069 K3dVector3Obj kCross;
00070 float fAngle;
00071
00072 kV = _rV;
00073 kV = m_pVector3Work->Normalize ( kV );
00074 kCross = m_pVector3Work->Cross ( kUp, kV );
00075 kCross = m_pVector3Work->Normalize ( kCross );
00076 fAngle = m_pVector3Work->Dot ( kV, kUp );
00077 fAngle = acos ( fAngle );
00078 _rM.RotationGL ( kCross, fAngle );
00079 }
00080
00082 void K3dMatrixWork::RotationForwardVector ( K3dMatrix &_rM, const K3dVector3Obj &_rV )
00083 {
00084
00085 K3dVector3Obj kV;
00086 K3dVector3Obj kForward ( 0,0,1 );
00087 K3dVector3Obj kCross;
00088 float fAngle;
00089
00090 kV = _rV;
00091 kV = m_pVector3Work->Normalize ( kV );
00092 kCross = m_pVector3Work->Cross ( kForward, kV );
00093 kCross = m_pVector3Work->Normalize ( kCross );
00094 fAngle = m_pVector3Work->Dot ( kV, kForward );
00095 fAngle = acos ( fAngle );
00096 _rM.Rotation ( kCross, fAngle );
00097 }
00098
00099
00100
00102 void K3dMatrixWork::RotationForwardVectorGL ( K3dMatrix &_rM, const K3dVector3Obj &_rV )
00103 {
00104
00105 K3dVector3Obj kV;
00106 K3dVector3Obj kForward ( 0,0,1 );
00107 K3dVector3Obj kCross;
00108 float fAngle;
00109
00110 kV = _rV;
00111 kV = m_pVector3Work->Normalize ( kV );
00112 kCross = m_pVector3Work->Cross ( kForward, kV );
00113 kCross = m_pVector3Work->Normalize ( kCross );
00114 fAngle = m_pVector3Work->Dot ( kV, kForward );
00115 fAngle = acos ( fAngle );
00116 _rM.RotationGL ( kCross, fAngle );
00117 }
00118
00119
00120
00122 void K3dMatrixWork::RotationRightVector ( K3dMatrix &_rM, const K3dVector3Obj &_rV )
00123 {
00124
00125 K3dVector3Obj kV;
00126 K3dVector3Obj kRight ( 1,0,0 );
00127 K3dVector3Obj kCross;
00128 float fAngle;
00129
00130 kV = _rV;
00131 kV = m_pVector3Work->Normalize ( kV );
00132 kCross = m_pVector3Work->Cross ( kRight, kV );
00133 kCross = m_pVector3Work->Normalize ( kCross );
00134 fAngle = m_pVector3Work->Dot ( kV, kRight );
00135 fAngle = acos ( fAngle );
00136 _rM.Rotation ( kCross, fAngle );
00137 }
00138
00139
00140
00142 void K3dMatrixWork::RotationRightVectorGL ( K3dMatrix &_rM, const K3dVector3Obj &_rV )
00143 {
00144
00145 K3dVector3Obj kV;
00146 K3dVector3Obj kRight ( 1,0,0 );
00147 K3dVector3Obj kCross;
00148 float fAngle;
00149
00150 kV = _rV;
00151 kV = m_pVector3Work->Normalize ( kV );
00152 kCross = m_pVector3Work->Cross ( kRight, kV );
00153 kCross = m_pVector3Work->Normalize ( kCross );
00154 fAngle = m_pVector3Work->Dot ( kV, kRight );
00155 fAngle = acos ( fAngle );
00156 _rM.RotationGL ( kCross, fAngle );
00157 }
00158
00159
00160
00162 void K3dMatrixWork::RotationArbitraryVector ( K3dMatrix &_rM, const K3dVector3Obj &_rkVector,const K3dVector3Obj &_rkArbitrary )
00163 {
00164
00165 K3dVector3Obj kV;
00166 K3dVector3Obj kArb;
00167 K3dVector3Obj kCross;
00168 float fAngle;
00169
00170 kV = _rkVector;
00171 kArb = _rkArbitrary;
00172 kV = m_pVector3Work->Normalize ( kV );
00173 kArb = m_pVector3Work->Normalize ( kArb );
00174 kCross = m_pVector3Work->Cross ( kArb, kV );
00175 kCross = m_pVector3Work->Normalize ( kCross );
00176 fAngle = m_pVector3Work->Dot ( kV ,kArb );
00177 fAngle = acos ( fAngle );
00178 _rM.Rotation ( kCross, fAngle );
00179 }
00180
00181
00183 void K3dMatrixWork::RotationArbitraryVectorGL ( K3dMatrix &_rM, const K3dVector3Obj &_rkVector,const K3dVector3Obj &_rkArbitrary )
00184 {
00185
00186 K3dVector3Obj kV;
00187 K3dVector3Obj kArb;
00188 K3dVector3Obj kCross;
00189 float fAngle;
00190
00191 kV = _rkVector;
00192 kArb = _rkArbitrary;
00193 kV = m_pVector3Work->Normalize ( kV );
00194 kArb = m_pVector3Work->Normalize ( kArb );
00195 kCross = m_pVector3Work->Cross ( kArb, kV );
00196 kCross = m_pVector3Work->Normalize ( kCross );
00197 fAngle = m_pVector3Work->Dot ( kV, kArb );
00198 fAngle = acos ( fAngle );
00199 _rM.RotationGL ( kCross, fAngle );
00200 }
00201
00202