c0326ef78f4de0310ff049aa65a2c32c2222b111
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / Soft / Lib / Maths / matrix3d.h
1 /**
2  *  \brief    Matrix 3d declaration
3  *  \author   Sylvain Gaeremynck <sylvain.gaeremynck@parrot.fr>
4  *  \version  1.0
5  *  \date     04/06/2007
6  *  \warning  Subject to completion
7  */
8
9 #ifndef _MATRIX3D_H_
10 #define _MATRIX3D_H_
11
12 #include <VP_Os/vp_os_types.h>
13
14 typedef struct _matrix3d_t {
15   float32_t m00, m01, m02, m03;
16   float32_t m10, m11, m12, m13;
17   float32_t m20, m21, m22, m23;
18   float32_t m30, m31, m32, m33;
19 } matrix3d_t;
20
21 struct _vector31_t;
22
23 extern matrix3d_t matrix3d_id; // identity matrix
24
25 // Set m to zero
26 void matrix3d_zero(matrix3d_t* m);
27
28 // Set m to identity
29 void matrix3d_identity(matrix3d_t* m);
30
31 // Initialize m from euler angles
32 C_RESULT matrix3d_euler(matrix3d_t* m, float32_t phi, float32_t theta, float32_t psi);
33
34 // Initialize m from a position and a direction
35 C_RESULT matrix3d_vector( matrix3d_t* m, struct _vector31_t* pos, struct _vector31_t* dir,
36                                          struct _vector31_t* right, struct _vector31_t* up);
37
38 // Initialize m from a position and a normalized orientation
39 C_RESULT matrix3d_orientation(matrix3d_t* m, const struct _vector31_t* pos, const struct _vector31_t* dir,
40                                              const struct _vector31_t* right, const struct _vector31_t* up);
41
42 // Compute transposed matrix
43 C_RESULT matrix3d_transpose(matrix3d_t* out, matrix3d_t* in);
44
45 // Common arithmetic operation
46 C_RESULT matrix3d_add(matrix3d_t* out, matrix3d_t* m1, matrix3d_t* m2);
47 C_RESULT matrix3d_sub(matrix3d_t* out, matrix3d_t* m1, matrix3d_t* m2);
48 C_RESULT matrix3d_mul(matrix3d_t* out, matrix3d_t* m1, matrix3d_t* m2);
49
50 // Common 3d transformation
51 C_RESULT matrix3d_translate(matrix3d_t* m, struct _vector31_t* tr);
52 C_RESULT matrix3d_add_translate(matrix3d_t* m, struct _vector31_t* tr);
53
54 C_RESULT matrix3d_rotate_euler(matrix3d_t* m, float32_t phi, float32_t theta, float32_t psi);
55 C_RESULT matrix3d_rotate_axis(matrix3d_t* m, struct _vector31_t* axis, float32_t value);
56
57 C_RESULT matrix3d_transform(matrix3d_t* m, struct _vector31_t* v);
58
59 #endif // _MATRIX3D_H_