[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23140] branches/blender2.5/blender/source /blender/blenlib/intern/arithb.c: Rotation Math:

Joshua Leung aligorith at gmail.com
Sat Sep 12 12:21:55 CEST 2009


Revision: 23140
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23140
Author:   aligorith
Date:     2009-09-12 12:21:55 +0200 (Sat, 12 Sep 2009)

Log Message:
-----------
Rotation Math:

Replaced a few function calls with inlined code for nicer performance.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c	2009-09-12 09:10:24 UTC (rev 23139)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/arithb.c	2009-09-12 10:21:55 UTC (rev 23140)
@@ -3338,44 +3338,66 @@
 /* axis angle to 3x3 matrix - safer version (normalisation of axis performed) */
 void AxisAngleToMat3(float axis[3], float angle, float mat[3][3])
 {
-	float nor[3];
+	float nor[3], nsi[3], co, si, ico;
 	
 	/* normalise the axis first (to remove unwanted scaling) */
 	VecCopyf(nor, axis);
 	Normalize(nor);
 	
 	/* now convert this to a 3x3 matrix */
-	VecRotToMat3(nor, angle, mat);
+	co= (float)cos(angle);		
+	si= (float)sin(angle);
+	
+	ico= (1.0f - co);
+	nsi[0]= nor[0]*si;
+	nsi[1]= nor[1]*si;
+	nsi[2]= nor[2]*si;
+	
+	mat[0][0] = ((nor[0] * nor[0]) * ico) + co;
+	mat[0][1] = ((nor[0] * nor[1]) * ico) + nsi[2];
+	mat[0][2] = ((nor[0] * nor[2]) * ico) - nsi[1];
+	mat[1][0] = ((nor[0] * nor[1]) * ico) - nsi[2];
+	mat[1][1] = ((nor[1] * nor[1]) * ico) + co;
+	mat[1][2] = ((nor[1] * nor[2]) * ico) + nsi[0];
+	mat[2][0] = ((nor[0] * nor[2]) * ico) + nsi[1];
+	mat[2][1] = ((nor[1] * nor[2]) * ico) - nsi[0];
+	mat[2][2] = ((nor[2] * nor[2]) * ico) + co;
 }
 
 /* axis angle to 4x4 matrix - safer version (normalisation of axis performed) */
 void AxisAngleToMat4(float axis[3], float angle, float mat[4][4])
 {
-	float nor[3];
+	float tmat[3][3];
 	
-	/* normalise the axis first (to remove unwanted scaling) */
-	VecCopyf(nor, axis);
-	Normalize(nor);
-	
-	/* now convert this to a 4x4 matrix */
-	VecRotToMat4(nor, angle, mat);
+	AxisAngleToMat3(axis, angle, mat);
+	Mat4One(mat);
+	Mat4CpyMat3(mat, tmat);
 }
 
-/* 3x3 matrix to axis angle (alias around the other call) */
+/* 3x3 matrix to axis angle (see Mat4ToVecRot too) */
 void Mat3ToAxisAngle(float mat[3][3], float axis[3], float *angle)
 {
-	/* note different order of calling args... */
-	Mat3ToVecRot(axis, angle, mat);
+	float q[4];
+	
+	/* use quaternions as intermediate representation */
+	// TODO: it would be nicer to go straight there...
+	Mat3ToQuat(mat, q);
+	QuatToAxisAngle(q, axis, angle);
 }
 
-/* 4x4 matrix to axis angle (alias around the other call) */
+/* 4x4 matrix to axis angle (see Mat4ToVecRot too) */
 void Mat4ToAxisAngle(float mat[4][4], float axis[3], float *angle)
 {
-	/* note different order of calling args... */
-	Mat4ToVecRot(axis, angle, mat);
+	float q[4];
+	
+	/* use quaternions as intermediate representation */
+	// TODO: it would be nicer to go straight there...
+	Mat4ToQuat(mat, q);
+	QuatToAxisAngle(q, axis, angle);
 }
 
 /* ************ AXIS ANGLE (unchecked) *************** */
+// TODO: the following calls should probably be depreceated sometime
 
 /* 3x3 matrix to axis angle */
 void Mat3ToVecRot(float mat[3][3], float axis[3], float *angle)





More information about the Bf-blender-cvs mailing list