D:/Zythum/DinoKod/Common/Quaternion.cpp

00001 //---------------------------------------------------------------------------------------------
00002 //      This file is a part of "DinoKod".
00003 //      Copyright © 2003 Dino Productions. All Rights Reserved.
00004 //      
00005 //      File                    : Quaternion.cpp
00006 //      Author                  : Sebastien LEIX        sebastien.leix@wanadoo.fr
00007 //      Date                    : 18/09/2003
00008 //      Modification    :
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 Matrix =  [ 1 - 2y² - 2z²    2xy - 2wz      2xz + 2wy
00106               2xy + 2wz    1 - 2x² - 2z²    2yz - 2wx
00107               2xz - 2wy      2yz + 2wx    1 - 2x² - 2y² ]
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 

Generated on Sun Mar 25 20:02:11 2007 for Zythum Project by  doxygen 1.5.1-p1