From: Tristan C. <ex...@us...> - 2002-10-16 22:34:43
|
Update of /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/vector In directory usw-pr-cvs1:/tmp/cvs-serv11404 Modified Files: Matrix2f.java Matrix3f.java Matrix4f.java Log Message: added invert/determinant Index: Matrix2f.java CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/java/org/lwjgl/vector/Matrix2f.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/vector/Matrix2f.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- Matrix2f.java 28 Aug 2002 00:05:45 -0000 1.8 +++ Matrix2f.java 16 Oct 2002 22:34:40 -0000 1.9 @@ -292,8 +292,24 @@ * Invert this matrix * @return this */ - public Matrix invert() { - assert false : "Not implemented yet!"; + public Matrix invert() + { + + /* + inv(A) = 1/det(A) * adj(A); + */ + + float determinant = m00 * m11 - m01*m10; + float t00 = m11/determinant; + float t01 = -m01/determinant; + float t11 = m00/determinant; + float t10 = -m10/determinant; + + m00 = t00; + m01 = t01; + m10 = t10; + m11 = t11; + return this; } @@ -357,8 +373,7 @@ * @see org.lwjgl.vector.Matrix#determinant() */ public float determinant() { - assert false : "Not implemented yet!"; - return 0; + return m00 * m11 - m01*m10; } } Index: Matrix3f.java CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/java/org/lwjgl/vector/Matrix3f.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/vector/Matrix3f.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- Matrix3f.java 28 Aug 2002 00:05:45 -0000 1.9 +++ Matrix3f.java 16 Oct 2002 22:34:40 -0000 1.10 @@ -365,8 +365,55 @@ * Invert this matrix * @return this */ - public Matrix invert() { - assert false : "Not implemented yet!"; + public Matrix invert() + { + float determinant = m00 * (m11 * m22 - m12 * m21) + + m01 * (m12 * m20 - m10 * m22) + + m02 * (m10 * m21 - m11 * m20); + + if (determinant == 1) + // matrix is proper orthogonal + transpose(); + else if (determinant == -1) + { // matrix is improper orthogonal + transpose(); + negate(); + } + else if (determinant != 0) + { + // do it the ordinary way + + /* inv(A) = 1/det(A) * adj(T), where adj(T) = transpose(Conjugate Matrix) + + m00 m01 m02 + m10 m11 m12 + m20 m21 m22 + */ + + // get the conjugate matrix + float t00 = m11 * m22 - m12* m22; + float t01 = - m10 * m22 + m12 *m20; + float t02 = m10 * m21 - m11 * m20; + float t10 = - m01 * m22 + m02 * m21; + float t11 = m00 * m22 - m02 * m20; + float t12 = - m00 * m21 + m01 * m20; + float t20 = m01 * m12 - m02 * m11; + float t21 = -m00 * m12 + m02 * m10; + float t22 = m00 * m11 - m01 * m10; + + + m00 = t00/determinant; + m11 = t11/determinant; + m22 = t22/determinant; + m01 = t10/determinant; + m10 = t01/determinant; + m20 = t02/determinant; + m02 = t20/determinant; + m12 = t21/determinant; + m21 = t12/determinant; + } + + return this; } Index: Matrix4f.java CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/java/org/lwjgl/vector/Matrix4f.java =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/java/org/lwjgl/vector/Matrix4f.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- Matrix4f.java 28 Aug 2002 00:05:45 -0000 1.9 +++ Matrix4f.java 16 Oct 2002 22:34:40 -0000 1.10 @@ -553,13 +553,84 @@ return f; } + /** + * Calculate the determinant of a 3x3 matrix + * @return result + */ + + private float determinant3x3(float t00, float t01, float t02, + float t10, float t11, float t12, + float t20, float t21, float t22) + { + return t00 * (t11 * t22 - t12 * t21) + + t01 * (t12 * t20 - t10 * t22) + + t02 * (t10 * t21 - t11 * t20); + } /** * Invert this matrix * @return this */ public Matrix invert() { - assert false : "Not implemented yet!"; + + float determinant = determinant(); + + if (determinant == 1) + // proper orthogonal + transpose(); + else if (determinant == -1) + { // improper orthogonal + transpose(); + negate(); + } + else if (determinant != 0) + { + /* + m00 m01 m02 m03 + m10 m11 m12 m13 + m20 m21 m22 m23 + m30 m31 m32 m33 + */ + + // first row + float t00 = determinant3x3( m11, m12, m13, m21, m22, m23, m31, m32, m33 ); + float t01 = -determinant3x3(m10, m12, m13, m20, m22, m23, m30, m32, m33 ); + float t02 = determinant3x3( m10, m11, m13, m20, m21, m23, m30, m31, m33 ); + float t03 = -determinant3x3(m10, m11, m12, m20, m21, m22, m30, m31, m32 ); + // second row + float t10 = -determinant3x3(m01, m02, m03, m21, m22, m23, m31, m32, m33 ); + float t11 = determinant3x3( m00, m02, m03, m20, m22, m23, m30, m32, m33 ); + float t12 = -determinant3x3(m00, m01, m03, m20, m21, m23, m30, m31, m33 ); + float t13 = determinant3x3( m00, m01, m02, m20, m21, m22, m30, m31, m32 ); + // third row + float t20 = determinant3x3( m01, m02, m03, m11, m12, m13, m31, m32, m33 ); + float t21 = -determinant3x3(m00, m02, m03, m10, m12, m13, m30, m32, m33 ); + float t22 = determinant3x3( m00, m01, m03, m10, m11, m13, m30, m31, m33 ); + float t23 = -determinant3x3(m00, m01, m02, m10, m11, m12, m30, m31, m32 ); + // fourth row + float t30 = -determinant3x3(m01, m02, m03, m11, m12, m13, m21, m22, m23 ); + float t31 = determinant3x3( m00, m02, m03, m10, m12, m13, m20, m22, m23 ); + float t32 = -determinant3x3(m00, m01, m03, m10, m11, m13, m20, m21, m23 ); + float t33 = determinant3x3( m00, m01, m02, m10, m11, m12, m20, m21, m22 ); + + // transpose and divide by the determinant + m00 = t00/determinant; + m11 = t11/determinant; + m22 = t22/determinant; + m33 = t33/determinant; + m01 = t10/determinant; + m10 = t01/determinant; + m20 = t02/determinant; + m02 = t20/determinant; + m12 = t21/determinant; + m21 = t12/determinant; + m03 = t30/determinant; + m30 = t03/determinant; + m13 = t31/determinant; + m31 = t13/determinant; + m32 = t23/determinant; + m23 = t32/determinant; + } return this; } |