[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40352] trunk/blender/source/blender: Move function out of mathutils to: BLI_math_rotation --- single_axis_angle_to_mat3(mat3, axis, angle), copied out from mathutils, axis arg is a char 'X/Y/Z' rather then a vector like axis_angle_to_mat3().

Campbell Barton ideasman42 at gmail.com
Mon Sep 19 15:08:01 CEST 2011


Revision: 40352
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40352
Author:   campbellbarton
Date:     2011-09-19 13:08:01 +0000 (Mon, 19 Sep 2011)
Log Message:
-----------
Move function out of mathutils to: BLI_math_rotation --- single_axis_angle_to_mat3(mat3, axis, angle), copied out from mathutils, axis arg is a char 'X/Y/Z' rather then a vector like axis_angle_to_mat3().

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_math_rotation.h
    trunk/blender/source/blender/blenlib/intern/math_rotation.c
    trunk/blender/source/blender/python/mathutils/mathutils_Matrix.c

Modified: trunk/blender/source/blender/blenlib/BLI_math_rotation.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_rotation.h	2011-09-19 12:26:20 UTC (rev 40351)
+++ trunk/blender/source/blender/blenlib/BLI_math_rotation.h	2011-09-19 13:08:01 UTC (rev 40352)
@@ -102,6 +102,8 @@
 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         */

Modified: trunk/blender/source/blender/blenlib/intern/math_rotation.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_rotation.c	2011-09-19 12:26:20 UTC (rev 40351)
+++ trunk/blender/source/blender/blenlib/intern/math_rotation.c	2011-09-19 13:08:01 UTC (rev 40352)
@@ -771,6 +771,52 @@
 	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         */
 

Modified: trunk/blender/source/blender/python/mathutils/mathutils_Matrix.c
===================================================================
--- trunk/blender/source/blender/python/mathutils/mathutils_Matrix.c	2011-09-19 12:26:20 UTC (rev 40351)
+++ trunk/blender/source/blender/python/mathutils/mathutils_Matrix.c	2011-09-19 13:08:01 UTC (rev 40352)
@@ -266,42 +266,19 @@
 
 		axis_angle_to_mat3((float (*)[3])mat, tvec, angle);
 	}
-	else if(matSize == 2) {
+	else if (matSize == 2) {
+		const float angle_cos= cosf(angle);
+		const float angle_sin= sinf(angle);
+
 		//2D rotation matrix
-		mat[0] = (float) cos (angle);
-		mat[1] = (float) sin (angle);
-		mat[2] = -((float) sin(angle));
-		mat[3] = (float) cos(angle);
+		mat[0] =  angle_cos;
+		mat[1] =  angle_sin;
+		mat[2] = -angle_sin;
+		mat[3] =  angle_cos;
 	}
-	else if(strcmp(axis, "X") == 0) {
-		//rotation around X
-		mat[0] = 1.0f;
-		mat[4] = (float) cos(angle);
-		mat[5] = (float) sin(angle);
-		mat[7] = -((float) sin(angle));
-		mat[8] = (float) cos(angle);
-	}
-	else if(strcmp(axis, "Y") == 0) {
-		//rotation around Y
-		mat[0] = (float) cos(angle);
-		mat[2] = -((float) sin(angle));
-		mat[4] = 1.0f;
-		mat[6] = (float) sin(angle);
-		mat[8] = (float) cos(angle);
-	}
-	else if(strcmp(axis, "Z") == 0) {
-		//rotation around Z
-		mat[0] = (float) cos(angle);
-		mat[1] = (float) sin(angle);
-		mat[3] = -((float) sin(angle));
-		mat[4] = (float) cos(angle);
-		mat[8] = 1.0f;
-	}
 	else {
-		/* should never get here */
-		PyErr_SetString(PyExc_ValueError,
-		                "mathutils.RotationMatrix(): unknown error");
-		return NULL;
+		/* valid axis checked above */
+		single_axis_angle_to_mat3((float (*)[3])mat, axis[0], angle);
 	}
 
 	if(matSize == 4) {




More information about the Bf-blender-cvs mailing list