[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12806] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Dec 6 13:46:10 CET 2007


Revision: 12806
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12806
Author:   blendix
Date:     2007-12-06 13:46:10 +0100 (Thu, 06 Dec 2007)

Log Message:
-----------

Bugfix: rotation difference ipo drivers could give sudden jump. This
was actually due to a numerical issue in the matrix to quaternion
conversion code (which was from siggraph '85), now uses an improved
version. I hope nothing depends on the previous behavior.. though
it should only affect corner cases.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/intern/arithb.c
    trunk/blender/source/blender/src/drawipo.c

Modified: trunk/blender/source/blender/blenlib/intern/arithb.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/arithb.c	2007-12-06 10:20:03 UTC (rev 12805)
+++ trunk/blender/source/blender/blenlib/intern/arithb.c	2007-12-06 12:46:10 UTC (rev 12806)
@@ -1211,7 +1211,7 @@
 	m[3][3]= 1.0f;
 }
 
-void Mat3ToQuat( float wmat[][3], float *q)		/* from Sig.Proc.85 pag 253 */
+void Mat3ToQuat(float wmat[][3], float *q)
 {
 	double tr, s;
 	float mat[3][3];
@@ -1225,34 +1225,38 @@
 	if(tr>FLT_EPSILON) {
 		s= sqrt( tr);
 		q[0]= (float)s;
-		s*= 4.0;
-		q[1]= (float)((mat[1][2]-mat[2][1])/s);
-		q[2]= (float)((mat[2][0]-mat[0][2])/s);
-		q[3]= (float)((mat[0][1]-mat[1][0])/s);
+		s= 1.0/(4.0*s);
+		q[1]= (float)((mat[1][2]-mat[2][1])*s);
+		q[2]= (float)((mat[2][0]-mat[0][2])*s);
+		q[3]= (float)((mat[0][1]-mat[1][0])*s);
 	}
 	else {
-		q[0]= 0.0f;
-		s= -0.5*(mat[1][1]+mat[2][2]);
-		
-		if(s>FLT_EPSILON) {
-			s= sqrt(s);
-			q[1]= (float)s;
-			q[2]= (float)(mat[0][1]/(2*s));
-			q[3]= (float)(mat[0][2]/(2*s));
+		if(mat[0][0] > mat[1][1] && mat[0][0] > mat[2][2]) {
+			s= 2.0*sqrtf(1.0 + mat[0][0] - mat[1][1] - mat[2][2]);
+			q[1]= (float)(0.25*s);
+
+			s= 1.0/s;
+			q[0]= (float)((mat[2][1] - mat[1][2])*s);
+			q[2]= (float)((mat[1][0] + mat[0][1])*s);
+			q[3]= (float)((mat[2][0] + mat[0][2])*s);
 		}
+		else if(mat[1][1] > mat[2][2]) {
+			s= 2.0*sqrtf(1.0 + mat[1][1] - mat[0][0] - mat[2][2]);
+			q[2]= (float)(0.25*s);
+
+			s= 1.0/s;
+			q[0]= (float)((mat[2][0] - mat[0][2])*s);
+			q[1]= (float)((mat[1][0] + mat[0][1])*s);
+			q[3]= (float)((mat[2][1] + mat[1][2])*s);
+		}
 		else {
-			q[1]= 0.0f;
-			s= 0.5*(1.0-mat[2][2]);
-			
-			if(s>FLT_EPSILON) {
-				s= sqrt(s);
-				q[2]= (float)s;
-				q[3]= (float)(mat[1][2]/(2*s));
-			}
-			else {
-				q[2]= 0.0f;
-				q[3]= 1.0f;
-			}
+			s= 2.0*sqrtf(1.0 + mat[2][2] - mat[0][0] - mat[1][1]);
+			q[3]= (float)(0.25*s);
+
+			s= 1.0/s;
+			q[0]= (float)((mat[1][0] - mat[0][1])*s);
+			q[1]= (float)((mat[2][0] + mat[0][2])*s);
+			q[2]= (float)((mat[2][1] + mat[1][2])*s);
 		}
 	}
 	NormalQuat(q);

Modified: trunk/blender/source/blender/src/drawipo.c
===================================================================
--- trunk/blender/source/blender/src/drawipo.c	2007-12-06 10:20:03 UTC (rev 12805)
+++ trunk/blender/source/blender/src/drawipo.c	2007-12-06 12:46:10 UTC (rev 12806)
@@ -2032,7 +2032,7 @@
 	tmp+= sprintf(tmp, "|Scale Y %%x%d", OB_SIZE_Y);
 	tmp+= sprintf(tmp, "|Scale Z %%x%d", OB_SIZE_Z);
 	if(is_armature)
-		tmp+= sprintf(tmp, "|Rotation Differance %%x%d", OB_ROT_DIFF);
+		tmp+= sprintf(tmp, "|Rotation Difference %%x%d", OB_ROT_DIFF);
 	
 	return (string);
 }





More information about the Bf-blender-cvs mailing list