00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00042
00043
00044 #ifndef _MATHUTILS_H
00045 #define _MATHUTILS_H
00046
00047 #include <vector>
00048
00049 #include "../dllinclude.h"
00050
00051
00052 #define Q_X 0
00053 #define Q_Y 1
00054 #define Q_Z 2
00055 #define Q_W 3
00056
00067 namespace ot {
00068
00069 class OPENTRACKER_API MathUtils
00070 {
00071 public:
00073 typedef double Matrix3x3[3][3];
00075 typedef double Matrix4x4[4][4];
00077 typedef double Vector3[3];
00079 typedef double Quaternion[4];
00080
00082 enum EULER {
00083
00084
00085
00086
00087
00088
00089 XYX = 0 + 4 + 0,
00090 XYZ = 0 + 4 + 2,
00091 XZX = 0 + 8 + 0,
00092 XZY = 0 + 8 + 1,
00093 YXY = 16 + 0 + 1,
00094 YXZ = 16 + 0 + 2,
00095 YZX = 16 + 8 + 0,
00096 YZY = 16 + 8 + 1,
00097 ZXY = 32 + 0 + 1,
00098 ZXZ = 32 + 0 + 2,
00099 ZYX = 32 + 4 + 0,
00100 ZYZ = 32 + 4 + 2
00101 };
00102
00109 static float* axisAngleToQuaternion(const float* axisa, float* qResult);
00116 static std::vector<float>& axisAngleToQuaternion(const std::vector<float> &axisa, std::vector<float> &qResult);
00123 static double* axisAngleToQuaternion(const double* axisa, Quaternion qResult);
00131 static float* eulerToQuaternion(const float roll, const float pitch, const float yaw, float* qResult);
00139 static std::vector<float>& eulerToQuaternion(const float roll, const float pitch, const float yaw, std::vector<float> &qResult);
00150 static float * eulerToQuaternion( const double alpha, const double beta,
00151 const double gamma, const enum MathUtils::EULER sequence,
00152 float * qResult );
00159 static float* invertQuaternion(const float* q, float* qResult);
00166 static std::vector<float>& invertQuaternion(const std::vector<float> &q, std::vector<float> &qResult);
00171 static float* matrixToQuaternion(const float matrix[3][3], float* qResult);
00176 static std::vector<float>& matrixToQuaternion(const float matrix[3][3], std::vector<float> &qResult);
00184 static float* multiplyQuaternion(const float* q1, const float* q2, float* qResult);
00192 static std::vector<float>& multiplyQuaternion(const std::vector<float> &q1, const std::vector<float> &q2, std::vector<float> &qResult);
00200 static double* multiplyQuaternion(const Quaternion q1, const Quaternion q2, Quaternion qResult);
00205 static float* normalizeQuaternion(float* q);
00210 static std::vector<float>& normalizeQuaternion(std::vector<float> &q);
00215 static double* normalizeQuaternion(Quaternion q);
00224 static float* rotateVector(const float* q, const float* v, float* vResult);
00233 static std::vector<float>& rotateVector(const std::vector<float> &q, const std::vector<float> &v, std::vector<float> &vResult);
00234
00238 static float determinant( const float matrix[3][3] );
00239
00246 static float* quaternionToAxisAngle(const float *q, float *axisa);
00247
00255 static double angle( const float * v1, const float * v2, const int dim );
00263 static double angle( const std::vector<float> &v1, const std::vector<float> & v2, const int dim );
00271 static double dot( const float * v1, const float * v2, const int dim );
00279 static double dot( const std::vector<float> &v1, const std::vector<float> &v2, const int dim );
00293 static float * slerp( const float * q1, const float *q2, const float t, float * qResult );
00307 static std::vector<float>& slerp( const std::vector<float> &q1, const std::vector<float> &q2, const float t, std::vector<float> &qResult );
00308
00309 static void matrixMultiply(const Matrix4x4 m1, const Matrix4x4 m2, Matrix4x4 &m);
00310 static void matrixMultiply(const Matrix3x3 m1, const Matrix3x3 m2, Matrix3x3 &m);
00311
00313 static const Matrix4x4 matrix4x4_flipY;
00315 static const Matrix4x4 matrix4x4_identity;
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335 static void MatrixToEuler(Vector3 angles, const Matrix4x4 colMatrix);
00336
00338 static const double Pi;
00339
00341 static const double E;
00342
00344 static const double GradToRad;
00345 };
00346
00347 }
00348
00349 #endif
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365