Blame view

math/quaternion.h 3.24 KB
57729e5b   David Mayerich   changed directory...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  #include "rts/math/matrix.h"

  

  #ifndef RTS_QUATERNION_H

  #define RTS_QUATERNION_H

  

  namespace rts{

  

  template<typename T>

  class quaternion

  {

  public:

  	T w;

  	T x;

  	T y;

  	T z;

  

  	void normalize();

  	void CreateRotation(T theta, T axis_x, T axis_y, T axis_z);

  	void CreateRotation(T theta, vector<T, 3> axis);

  	quaternion<T> operator*(quaternion<T> &rhs);

  	matrix<T, 3> toMatrix3();

  	matrix<T, 4> toMatrix4();

  

  

  	quaternion();

  	quaternion(T w, T x, T y, T z);

  

  };

  

  template<typename T>

  void quaternion<T>::normalize()

  {

  	double length=sqrt(w*w + x*x + y*y + z*z);

  	w=w/length;

  	x=x/length;

  	y=y/length;

  	z=z/length;

  }

  

  template<typename T>

  void quaternion<T>::CreateRotation(T theta, T axis_x, T axis_y, T axis_z)

  {

  	//assign the given Euler rotation to this quaternion

7731cf24   David Mayerich   fixed precision p...
44
45
46
47
  	w = (T)cos(theta/2);

  	x = axis_x*(T)sin(theta/2);

  	y = axis_y*(T)sin(theta/2);

  	z = axis_z*(T)sin(theta/2);

57729e5b   David Mayerich   changed directory...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  }

  

  template<typename T>

  void quaternion<T>::CreateRotation(T theta, vector<T, 3> axis)

  {

  	CreateRotation(theta, axis[0], axis[1], axis[2]);

  }

  

  template<typename T>

  quaternion<T> quaternion<T>::operator *(quaternion<T> &param)

  {

  	float A, B, C, D, E, F, G, H;

  

  

  	A = (w + x)*(param.w + param.x);

  	B = (z - y)*(param.y - param.z);

  	C = (w - x)*(param.y + param.z);

  	D = (y + z)*(param.w - param.x);

  	E = (x + z)*(param.x + param.y);

  	F = (x - z)*(param.x - param.y);

  	G = (w + y)*(param.w - param.z);

  	H = (w - y)*(param.w + param.z);

  

  	quaternion<T> result;

  	result.w = B + (-E - F + G + H) /2;

  	result.x = A - (E + F + G + H)/2;

  	result.y = C + (E - F + G - H)/2;

  	result.z = D + (E - F - G + H)/2;

  

  	return result;

  }

  

  template<typename T>

  matrix<T, 3> quaternion<T>::toMatrix3()

  {

  	matrix<T, 3> result;

  

  

      T wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;

  

  

      // calculate coefficients

      x2 = x + x; y2 = y + y;

      z2 = z + z;

      xx = x * x2; xy = x * y2; xz = x * z2;

      yy = y * y2; yz = y * z2; zz = z * z2;

      wx = w * x2; wy = w * y2; wz = w * z2;

  

7731cf24   David Mayerich   fixed precision p...
96
  	result(0, 0) = 1 - (yy + zz);

57729e5b   David Mayerich   changed directory...
97
98
99
100
101
  	result(0, 1) = xy - wz;

  

  	result(0, 2) = xz + wy;

  

  	result(1, 0) = xy + wz;

7731cf24   David Mayerich   fixed precision p...
102
  	result(1, 1) = 1 - (xx + zz);

57729e5b   David Mayerich   changed directory...
103
104
105
106
107
108
  

  	result(1, 2) = yz - wx;

  

  	result(2, 0) = xz - wy;

  	result(2, 1) = yz + wx;

  

7731cf24   David Mayerich   fixed precision p...
109
  	result(2, 2) = 1 - (xx + yy);

57729e5b   David Mayerich   changed directory...
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  

  	return result;

  }

  

  template<typename T>

  matrix<T, 4> quaternion<T>::toMatrix4()

  {

  	matrix<T, 4> result;

  

  

      T wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;

  

  

      // calculate coefficients

      x2 = x + x; y2 = y + y;

      z2 = z + z;

      xx = x * x2; xy = x * y2; xz = x * z2;

      yy = y * y2; yz = y * z2; zz = z * z2;

      wx = w * x2; wy = w * y2; wz = w * z2;

  

7731cf24   David Mayerich   fixed precision p...
130
  	result(0, 0) = 1 - (yy + zz);

57729e5b   David Mayerich   changed directory...
131
132
133
134
135
  	result(0, 1) = xy - wz;

  

  	result(0, 2) = xz + wy;

  

  	result(1, 0) = xy + wz;

7731cf24   David Mayerich   fixed precision p...
136
  	result(1, 1) = 1 - (xx + zz);

57729e5b   David Mayerich   changed directory...
137
138
139
140
141
142
  

  	result(1, 2) = yz - wx;

  

  	result(2, 0) = xz - wy;

  	result(2, 1) = yz + wx;

  

7731cf24   David Mayerich   fixed precision p...
143
  	result(2, 2) = 1 - (xx + yy);

57729e5b   David Mayerich   changed directory...
144
  

7731cf24   David Mayerich   fixed precision p...
145
  	result(3, 3) = 1;

57729e5b   David Mayerich   changed directory...
146
147
148
149
150
151
152
  

  	return result;

  }

  

  template<typename T>

  quaternion<T>::quaternion()

  {

7731cf24   David Mayerich   fixed precision p...
153
  	w=0; x=0; y=0; z=0;

57729e5b   David Mayerich   changed directory...
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
  }

  

  template<typename T>

  quaternion<T>::quaternion(T c, T i, T j, T k)

  {

  	w=c;  x=i;  y=j;  z=k;

  }

  

  }	//end rts namespace

  

  //#if __GNUC__ > 3 && __GNUC_MINOR__ > 7

  //template<class T> using rtsQuaternion = rts::quaternion<T>;

  //#endif

  

  #endif