00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "Common/Quaternion.h"
00012
00013
00014 KQuaternion::KQuaternion()
00015 {
00016 m_W = 1.0f;
00017 m_X = 0.0f;
00018 m_Y = 0.0f;
00019 m_Z = 0.0f;
00020 }
00021
00022
00023 KQuaternion::KQuaternion( float W, float X, float Y, float Z )
00024 {
00025 m_W = W;
00026 m_X = X;
00027 m_Y = Y;
00028 m_Z = Z;
00029 }
00030
00031
00032 void KQuaternion::SetAxis( float Angle, KVector& Axe )
00033 {
00034 float Omega = Angle * 0.5f;
00035 float Sin = sinf( Omega );
00036
00037 m_W = cosf( Omega );
00038 m_X = Sin * Axe.x;
00039 m_Y = Sin * Axe.y;
00040 m_Z = Sin * Axe.z;
00041 }
00042
00043
00044 void KQuaternion::SetEuler( float Angle, float Pitch, float Roll, float Yaw )
00045 {
00046 float CosY = cosf( Yaw * 0.5f );
00047 float SinY = sinf( Yaw * 0.5f );
00048 float CosP = cosf( Pitch * 0.5f );
00049 float SinP = sinf( Pitch * 0.5f );
00050 float CosR = cosf( Roll * 0.5f );
00051 float SinR = sinf( Roll * 0.5f );
00052
00053 m_W = CosR * SinP * CosY + SinR * CosP * SinY;
00054 m_X = CosR * CosP * SinY - SinR * SinP * CosY;
00055 m_Y = SinR * CosP * CosY - CosR * SinP * SinY;
00056 m_Z = CosR * CosP * CosY + SinR * SinP * SinY;
00057 }
00058
00059
00060 void KQuaternion::GetAxis( float* pAngle, KVector* pAxe )
00061 {
00062 *pAngle = 2.0f * acosf( m_W );
00063
00064 float Scale = sqrtf( m_X * m_X + m_Y * m_Y + m_Z * m_Z );
00065
00066 pAxe->x = m_X / Scale;
00067 pAxe->y = m_Y / Scale;
00068 pAxe->z = m_Z / Scale;
00069 }
00070
00071
00072 void KQuaternion::GetEuler( float* pAngle, float* pPitch, float* pRoll, float* pYaw )
00073 {
00074
00075 }
00076
00077
00078 KMatrix KQuaternion::GetMatrix()
00079 {
00080 KMatrix m;
00081
00082 m._11 = 1.0f - 2.0f * SQR( m_Y ) - 2.0f * SQR( m_Z );
00083 m._12 = 2.0f * m_X * m_Y + 2.0f * m_W * m_Z;
00084 m._13 = 2.0f * m_X * m_Z - 2.0f * m_W * m_Y;
00085 m._14 = 0.0f;
00086
00087 m._21 = 2.0f * m_X * m_Y - 2.0f * m_W * m_Z;
00088 m._22 = 1.0f - 2.0f * SQR( m_X ) - 2.0f * SQR( m_Z );
00089 m._23 = 2.0f * m_Y * m_Z + 2.0f * m_W * m_X;
00090 m._24 = 0.0f;
00091
00092 m._31 = 2.0f * m_X * m_Z + 2.0f * m_W * m_Y;
00093 m._32 = 2.0f * m_Y * m_Z - 2.0f * m_W * m_X;
00094 m._33 = 1.0f - 2.0f * SQR( m_X ) - 2.0f * SQR( m_Y );
00095 m._34 = 0.0f;
00096
00097 m._41 = 0.0f;
00098 m._42 = 0.0f;
00099 m._43 = 0.0f;
00100 m._44 = 1.0f;
00101
00102 return m;
00103 }
00104
00105
00106
00107
00108
00109
00110
00111 KQuaternion KQuaternion::operator *( KQuaternion& Q )
00112 {
00113 return KQuaternion( m_W * Q.m_W - m_X * Q.m_X - m_Y * Q.m_Y - m_Z * Q.m_Z,
00114 m_W * Q.m_X + m_X * Q.m_W + m_Y * Q.m_Z - m_Z * Q.m_Y,
00115 m_W * Q.m_Y + m_Y * Q.m_W + m_Z * Q.m_X - m_X * Q.m_Z,
00116 m_W * Q.m_Z + m_Z * Q.m_W + m_X * Q.m_Y - m_Y * Q.m_X );
00117 }
00118