44 #ifndef QUATERNIONS_H_
45 #define QUATERNIONS_H_
92 #define QUAT(q, s, v0, v1, v2) \
106 quat_t static inline quaternions_create_from_vector(
float v[3])
124 #define QMUL(q1,q2,out) \
125 tmp[0] = q1.v[1] * q2.v[2] - q1.v[2] * q2.v[1];\
126 tmp[1] = q1.v[2] * q2.v[0] - q1.v[0] * q2.v[2];\
127 tmp[2] = q1.v[0] * q2.v[1] - q1.v[1] * q2.v[0];\
128 out.v[0] = q2.s* q1.v[0] + q1.s * q2.v[0] + tmp[0];\
129 out.v[1] = q2.s* q1.v[1] + q1.s * q2.v[1] + tmp[1];\
130 out.v[2] = q2.s* q1.v[2] + q1.s * q2.v[2] + tmp[2];\
131 out.s= q1.s * q2.s - SCP(q1.v, q2.v);
147 tmp[0] = q1.
v[1] * q2.
v[2] - q1.
v[2] * q2.
v[1];
148 tmp[1] = q1.
v[2] * q2.
v[0] - q1.
v[0] * q2.
v[2];
149 tmp[2] = q1.
v[0] * q2.
v[1] - q1.
v[1] * q2.
v[0];
151 out.
v[0] = q2.
s * q1.
v[0] + q1.
s * q2.
v[0] + tmp[0];
152 out.
v[1] = q2.
s * q1.
v[1] + q1.
s * q2.
v[1] + tmp[1];
153 out.
v[2] = q2.
s * q1.
v[2] + q1.
s * q2.
v[2] + tmp[2];
154 out.
s = q1.
s * q2.
s - vectors_scalar_product(q1.
v, q2.
v);
166 quat_t static inline quaternions_inverse(
const quat_t q)
171 for( int32_t i = 0; i < 3; i++)
194 qinv = quaternions_inverse(qe);
195 qtmp = quaternions_multiply(qinv,qvect);
196 qtmp = quaternions_multiply(qtmp,qe);
216 qinv = quaternions_inverse(qe);
217 qtmp = quaternions_multiply(qe, qvect);
218 qtmp = quaternions_multiply(qtmp, qinv);
235 void static inline quaternions_rotate_vector(
const quat_t q,
const float u[3],
float v[3])
237 float tmp1[3], tmp2[3];
239 vectors_cross_product(q.
v, u, tmp1);
240 tmp1[0] = 2 * tmp1[0];
241 tmp1[1] = 2 * tmp1[1];
242 tmp1[2] = 2 * tmp1[2];
244 vectors_cross_product(q.
v, tmp1, tmp2);
246 v[0] = u[0] + q.
s * tmp1[0] + tmp2[0];
247 v[1] = u[1] + q.
s * tmp1[1] + tmp2[1];
248 v[2] = u[2] + q.
s * tmp1[2] + tmp2[2];
258 static inline quat_t quaternions_normalise(
const quat_t q)
262 float snorm = SQR(q.
s) + SQR(q.
v[0]) + SQR(q.
v[1]) + SQR(q.
v[2]);
264 if (snorm > 0.0000001f)
266 float norm = maths_fast_sqrt(snorm);
267 result.
s = q.
s / norm;
268 result.
v[0] = q.
v[0] / norm;
269 result.
v[1] = q.
v[1] / norm;
270 result.
v[2] = q.
v[2] / norm;
float s
Scalar component.
Definition: quaternions.h:64
Unit quaternion.
Definition: quaternions.h:62
float v[3]
Vector component.
Definition: quaternions.h:65