csgeom/quaternion.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2000 by Norman Kramer 00003 2006 by Marten Svanfeldt 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public 00016 License along with this library; if not, write to the Free 00017 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 */ 00019 00020 #ifndef __CS_QUATERNION_H__ 00021 #define __CS_QUATERNION_H__ 00022 00030 #include "csextern.h" 00031 #include "csqsqrt.h" 00032 00033 #include "csgeom/vector3.h" 00034 00035 class csMatrix3; 00036 00041 class CS_CRYSTALSPACE_EXPORT csQuaternion 00042 { 00043 public: 00044 // Constructors 00045 00047 csQuaternion () 00048 : v (0.0f), w (1.0f) 00049 {} 00050 00052 csQuaternion (float x, float y, float z, float w) 00053 : v (x, y, z), w (w) 00054 {} 00055 00057 csQuaternion (const csVector3& v, float w) 00058 : v (v), w (w) 00059 {} 00060 00062 csQuaternion (const csQuaternion& q) 00063 : v (q.v), w (q.w) 00064 {} 00065 00069 inline void Set (float x, float y, float z, float w) 00070 { 00071 v.x = x; 00072 v.y = y; 00073 v.z = z; 00074 this->w = w; 00075 } 00076 00078 inline void SetIdentity () 00079 { 00080 v.Set (0.0f); w = 1.0f; 00081 } 00082 00084 inline friend csQuaternion operator+ (const csQuaternion& q1, 00085 const csQuaternion& q2) 00086 { 00087 return csQuaternion (q1.v+q2.v, q1.w+q2.w); 00088 } 00089 00091 inline csQuaternion& operator+= (const csQuaternion& q) 00092 { 00093 v += q.v; w += q.w; 00094 return *this; 00095 } 00096 00098 inline friend csQuaternion operator- (const csQuaternion& q1, 00099 const csQuaternion& q2) 00100 { 00101 return csQuaternion (q1.v-q2.v, q1.w-q2.w); 00102 } 00103 00105 inline csQuaternion& operator-= (const csQuaternion& q) 00106 { 00107 v -= q.v; w -= q.w; 00108 return *this; 00109 } 00110 00112 inline friend csQuaternion operator- (const csQuaternion& q) 00113 { 00114 return csQuaternion (-q.v, -q.w); 00115 } 00116 00118 inline friend csQuaternion operator* (const csQuaternion& q1, 00119 const csQuaternion& q2) 00120 { 00121 return csQuaternion (q1.v*q2.w + q1.w*q2.v + q1.v%q2.v, 00122 q1.w*q2.w - q1.v*q2.v); 00123 } 00124 00126 inline csQuaternion& operator*= (const csQuaternion& q) 00127 { 00128 csVector3 newV = v*q.w + w*q.v + v%q.v; 00129 w = w*q.w - v*q.v; 00130 v = newV; 00131 return *this; 00132 } 00133 00135 inline friend csQuaternion operator* (const csQuaternion& q, float f) 00136 { 00137 return csQuaternion (q.v*f, q.w*f); 00138 } 00139 00141 inline friend csQuaternion operator* (float f, const csQuaternion& q) 00142 { 00143 return csQuaternion (q.v*f, q.w*f); 00144 } 00145 00147 inline csQuaternion& operator*= (float f) 00148 { 00149 v *= f; 00150 w *= f; 00151 00152 return *this; 00153 } 00154 00156 inline friend csQuaternion operator/ (const csQuaternion& q, float f) 00157 { 00158 float invF = 1.0f/f; 00159 return csQuaternion (q.v*invF, q.w*invF); 00160 } 00161 00163 inline friend csQuaternion operator/ (float f, const csQuaternion& q) 00164 { 00165 float invF = 1.0f/f; 00166 return csQuaternion (q.v*invF, q.w*invF); 00167 } 00168 00170 inline csQuaternion& operator/= (float f) 00171 { 00172 float invF = 1.0f/f; 00173 v *= invF; 00174 w *= invF; 00175 00176 return *this; 00177 } 00178 00180 inline csQuaternion GetConjugate () const 00181 { 00182 return csQuaternion (-v, w); 00183 } 00184 00186 inline void Conjugate () 00187 { 00188 v = -v; 00189 } 00190 00192 inline float Dot (const csQuaternion& q) const 00193 { 00194 return v*q.v + w*q.w; 00195 } 00196 00198 inline float SquaredNorm () const 00199 { 00200 return Dot (*this); 00201 } 00202 00204 inline float Norm () const 00205 { 00206 return csQsqrt (SquaredNorm ()); 00207 } 00208 00214 inline csQuaternion Unit () const 00215 { 00216 return (*this) / Norm (); 00217 } 00218 00222 inline csVector3 Rotate (const csVector3& src) const 00223 { 00224 csQuaternion p (src, 0); 00225 csQuaternion q = *this * p; 00226 q *= GetConjugate (); 00227 return q.v; 00228 } 00229 00237 inline void SetAxisAngle (const csVector3& axis, float angle) 00238 { 00239 v = axis * sinf (angle / 2.0f); 00240 w = cosf (angle / 2.0f); 00241 } 00242 00250 inline void GetAxisAngle (csVector3& axis, float& angle) const 00251 { 00252 angle = 2.0f * acosf (w); 00253 if (v.SquaredNorm () != 0) 00254 axis = v.Unit (); 00255 else 00256 axis.Set (1.0f, 0.0f, 0.0f); 00257 } 00258 00262 void SetEulerAngles (const csVector3& angles); 00263 00267 csVector3 GetEulerAngles () const; 00268 00272 void SetMatrix (const csMatrix3& matrix); 00273 00277 csMatrix3 GetMatrix () const; 00278 00283 csQuaternion NLerp (const csQuaternion& q2, float t) const; 00284 00289 csQuaternion SLerp (const csQuaternion& q2, float t) const; 00290 00294 csQuaternion Log () const; 00295 00299 csQuaternion Exp () const; 00300 00306 csQuaternion Squad (const csQuaternion & t1, const csQuaternion & t2, 00307 const csQuaternion & q, float t) const; 00308 00309 // Data 00310 csVector3 v; 00311 float w; 00312 }; 00313 00316 #endif // __CS_QUATERNION_H__ 00317
Generated for Crystal Space 1.4.0 by doxygen 1.5.8