diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-09-19 19:47:05 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-09-19 19:47:05 +0400 |
commit | 8dbc7a3ba321ce545c5ebfaa306c62314a38ff48 (patch) | |
tree | 7dc24b3605617c69022bccf6cd87521379626ac1 /source/blender/blenlib | |
parent | 8961f24425954c7f6fcaed94f6b0c776a00719ea (diff) | |
parent | d78231734d6ccf224738ea76307c26f8c0d4dab4 (diff) |
Merging r40345 through r40365 from trunk into soc-2011-garlic
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r-- | source/blender/blenlib/BLI_math_rotation.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_rotation.c | 46 |
2 files changed, 48 insertions, 0 deletions
diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h index ef20408a37e..d7ca03243df 100644 --- a/source/blender/blenlib/BLI_math_rotation.h +++ b/source/blender/blenlib/BLI_math_rotation.h @@ -102,6 +102,8 @@ void quat_to_axis_angle(float axis[3], float *angle, const float q[4]); void mat3_to_axis_angle(float axis[3], float *angle, float M[3][3]); void mat4_to_axis_angle(float axis[3], float *angle, float M[4][4]); +void single_axis_angle_to_mat3(float R[3][3], const char axis, const float angle); + /****************************** Vector/Rotation ******************************/ /* old axis angle code */ /* TODO: the following calls should probably be depreceated sometime */ diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c index 6800b59c2c7..ef286e1d102 100644 --- a/source/blender/blenlib/intern/math_rotation.c +++ b/source/blender/blenlib/intern/math_rotation.c @@ -771,6 +771,52 @@ void mat4_to_axis_angle(float axis[3], float *angle,float mat[4][4]) quat_to_axis_angle(axis, angle,q); } + + +void single_axis_angle_to_mat3(float mat[3][3], const char axis, const float angle) +{ + const float angle_cos= cosf(angle); + const float angle_sin= sinf(angle); + + switch(axis) { + case 'X': /* rotation around X */ + mat[0][0] = 1.0f; + mat[0][1] = 0.0f; + mat[0][2] = 0.0f; + mat[1][0] = 0.0f; + mat[1][1] = angle_cos; + mat[1][2] = angle_sin; + mat[2][0] = 0.0f; + mat[2][1] = -angle_sin; + mat[2][2] = angle_cos; + break; + case 'Y': /* rotation around Y */ + mat[0][0] = angle_cos; + mat[0][1] = 0.0f; + mat[0][2] = -angle_sin; + mat[1][0] = 0.0f; + mat[1][1] = 1.0f; + mat[1][2] = 0.0f; + mat[2][0] = angle_sin; + mat[2][1] = 0.0f; + mat[2][2] = angle_cos; + break; + case 'Z': /* rotation around Z */ + mat[0][0] = angle_cos; + mat[0][1] = angle_sin; + mat[0][2] = 0.0f; + mat[1][0] = -angle_sin; + mat[1][1] = angle_cos; + mat[1][2] = 0.0f; + mat[2][0] = 0.0f; + mat[2][1] = 0.0f; + mat[2][2] = 1.0f; + break; + default: + assert("invalid axis"); + } +} + /****************************** Vector/Rotation ******************************/ /* TODO: the following calls should probably be depreceated sometime */ |