[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24167] trunk/blender/source/blender/ blenlib: Functions to test for and correct orientation matrix orthogonality ( since MatXOrtho only normalizes and should probably be renamed)

Martin Poirier theeth at yahoo.com
Thu Oct 29 22:31:55 CET 2009


Revision: 24167
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24167
Author:   theeth
Date:     2009-10-29 22:31:55 +0100 (Thu, 29 Oct 2009)

Log Message:
-----------
Functions to test for and correct orientation matrix orthogonality (since MatXOrtho only normalizes and should probably be renamed)

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_arithb.h
    trunk/blender/source/blender/blenlib/intern/arithb.c

Modified: trunk/blender/source/blender/blenlib/BLI_arithb.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_arithb.h	2009-10-29 21:31:00 UTC (rev 24166)
+++ trunk/blender/source/blender/blenlib/BLI_arithb.h	2009-10-29 21:31:55 UTC (rev 24167)
@@ -323,9 +323,15 @@
 void Mat3Scale(float m[][3], float scale);
 void Mat4Scale(float m[][4], float scale);
 
+/* NOTE: These only normalise the matrix, they don't make it orthogonal */
 void Mat3Ortho(float mat[][3]);
 void Mat4Ortho(float mat[][4]);
 
+int IsMat3Orthogonal(float mat[][3]);
+void Mat3Orthogonal(float mat[][3], int axis); /* axis is the one to keep in place (assumes it is non-null) */
+int IsMat4Orthogonal(float mat[][4]);
+void Mat4Orthogonal(float mat[][4], int axis); /* axis is the one to keep in place (assumes it is non-null) */
+
 void VecMat4MulVecfl(float *in, float mat[][4], float *vec);
 void Mat4MulMat43(float (*m1)[4], float (*m3)[4], float (*m2)[3]);
 void Mat3IsMat3MulMat4(float m1[][3], float m2[][3], float m3[][4]);

Modified: trunk/blender/source/blender/blenlib/intern/arithb.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/arithb.c	2009-10-29 21:31:00 UTC (rev 24166)
+++ trunk/blender/source/blender/blenlib/intern/arithb.c	2009-10-29 21:31:55 UTC (rev 24167)
@@ -2115,6 +2115,161 @@
 
 /* ************************************************  */
 
+void Mat3Orthogonal(float mat[][3], int axis)
+{
+	float size[3];
+	size[0] = VecLength(mat[0]);
+	size[1] = VecLength(mat[1]);
+	size[2] = VecLength(mat[2]);
+	Normalize(mat[axis]);
+	switch(axis)
+	{
+		case 0:
+			if (Inpf(mat[0], mat[1]) < 1) {
+				Crossf(mat[2], mat[0], mat[1]);
+				Normalize(mat[2]);
+				Crossf(mat[1], mat[2], mat[0]);
+			} else if (Inpf(mat[0], mat[2]) < 1) {
+				Crossf(mat[1], mat[2], mat[0]);
+				Normalize(mat[1]);
+				Crossf(mat[2], mat[0], mat[1]);
+			} else {
+				float vec[3] = {mat[0][1], mat[0][2], mat[0][0]};
+
+				Crossf(mat[2], mat[0], vec);
+				Normalize(mat[2]);
+				Crossf(mat[1], mat[2], mat[0]);
+			}
+		case 1:
+			if (Inpf(mat[1], mat[0]) < 1) {
+				Crossf(mat[2], mat[0], mat[1]);
+				Normalize(mat[2]);
+				Crossf(mat[0], mat[1], mat[2]);
+			} else if (Inpf(mat[0], mat[2]) < 1) {
+				Crossf(mat[0], mat[1], mat[2]);
+				Normalize(mat[0]);
+				Crossf(mat[2], mat[0], mat[1]);
+			} else {
+				float vec[3] = {mat[1][1], mat[1][2], mat[1][0]};
+
+				Crossf(mat[0], mat[1], vec);
+				Normalize(mat[0]);
+				Crossf(mat[2], mat[0], mat[1]);
+			}
+		case 2:
+			if (Inpf(mat[2], mat[0]) < 1) {
+				Crossf(mat[1], mat[2], mat[0]);
+				Normalize(mat[1]);
+				Crossf(mat[0], mat[1], mat[2]);
+			} else if (Inpf(mat[2], mat[1]) < 1) {
+				Crossf(mat[0], mat[1], mat[2]);
+				Normalize(mat[0]);
+				Crossf(mat[1], mat[2], mat[0]);
+			} else {
+				float vec[3] = {mat[2][1], mat[2][2], mat[2][0]};
+
+				Crossf(mat[0], vec, mat[2]);
+				Normalize(mat[0]);
+				Crossf(mat[1], mat[2], mat[0]);
+			}
+	}
+	VecMulf(mat[0], size[0]);
+	VecMulf(mat[1], size[1]);
+	VecMulf(mat[2], size[2]);
+}
+
+void Mat4Orthogonal(float mat[][4], int axis)
+{
+	float size[3];
+	size[0] = VecLength(mat[0]);
+	size[1] = VecLength(mat[1]);
+	size[2] = VecLength(mat[2]);
+	Normalize(mat[axis]);
+	switch(axis)
+	{
+		case 0:
+			if (Inpf(mat[0], mat[1]) < 1) {
+				Crossf(mat[2], mat[0], mat[1]);
+				Normalize(mat[2]);
+				Crossf(mat[1], mat[2], mat[0]);
+			} else if (Inpf(mat[0], mat[2]) < 1) {
+				Crossf(mat[1], mat[2], mat[0]);
+				Normalize(mat[1]);
+				Crossf(mat[2], mat[0], mat[1]);
+			} else {
+				float vec[3] = {mat[0][1], mat[0][2], mat[0][0]};
+
+				Crossf(mat[2], mat[0], vec);
+				Normalize(mat[2]);
+				Crossf(mat[1], mat[2], mat[0]);
+			}
+		case 1:
+			Normalize(mat[0]);
+			if (Inpf(mat[1], mat[0]) < 1) {
+				Crossf(mat[2], mat[0], mat[1]);
+				Normalize(mat[2]);
+				Crossf(mat[0], mat[1], mat[2]);
+			} else if (Inpf(mat[0], mat[2]) < 1) {
+				Crossf(mat[0], mat[1], mat[2]);
+				Normalize(mat[0]);
+				Crossf(mat[2], mat[0], mat[1]);
+			} else {
+				float vec[3] = {mat[1][1], mat[1][2], mat[1][0]};
+
+				Crossf(mat[0], mat[1], vec);
+				Normalize(mat[0]);
+				Crossf(mat[2], mat[0], mat[1]);
+			}
+		case 2:
+			if (Inpf(mat[2], mat[0]) < 1) {
+				Crossf(mat[1], mat[2], mat[0]);
+				Normalize(mat[1]);
+				Crossf(mat[0], mat[1], mat[2]);
+			} else if (Inpf(mat[2], mat[1]) < 1) {
+				Crossf(mat[0], mat[1], mat[2]);
+				Normalize(mat[0]);
+				Crossf(mat[1], mat[2], mat[0]);
+			} else {
+				float vec[3] = {mat[2][1], mat[2][2], mat[2][0]};
+
+				Crossf(mat[0], vec, mat[2]);
+				Normalize(mat[0]);
+				Crossf(mat[1], mat[2], mat[0]);
+			}
+	}
+	VecMulf(mat[0], size[0]);
+	VecMulf(mat[1], size[1]);
+	VecMulf(mat[2], size[2]);
+}
+
+int IsMat3Orthogonal(float mat[][3])
+{
+	if (fabs(Inpf(mat[0], mat[1])) > 1.5 * FLT_EPSILON)
+		return 0;
+
+	if (fabs(Inpf(mat[1], mat[2])) > 1.5 * FLT_EPSILON)
+		return 0;
+
+	if (fabs(Inpf(mat[0], mat[2])) > 1.5 * FLT_EPSILON)
+		return 0;
+	
+	return 1;
+}
+
+int IsMat4Orthogonal(float mat[][4])
+{
+	if (fabs(Inpf(mat[0], mat[1])) > 1.5 * FLT_EPSILON)
+		return 0;
+
+	if (fabs(Inpf(mat[1], mat[2])) > 1.5 * FLT_EPSILON)
+		return 0;
+
+	if (fabs(Inpf(mat[0], mat[2])) > 1.5 * FLT_EPSILON)
+		return 0;
+	
+	return 1;
+}
+
 void Mat3Ortho(float mat[][3])
 {	
 	Normalize(mat[0]);





More information about the Bf-blender-cvs mailing list