Browse Source

Added inversion of 3x3 rotation submatrix.

Added rudimentary 3x3 matrix class (just transpose, as this is needed for normal matrix).
alteredq 15 years ago
parent
commit
fdb1ee5ff2
1 changed files with 61 additions and 0 deletions
  1. 61 0
      src/core/Matrix4.js

+ 61 - 0
src/core/Matrix4.js

@@ -361,6 +361,45 @@ THREE.Matrix4.makeInvert = function ( m1 ) {
 
 };
 
+THREE.Matrix4.makeInvert3x3 = function ( m1 ) {
+    
+    // input:  THREE.Matrix4
+    // output: THREE.Matrix3
+    
+    // ( based on http://code.google.com/p/webgl-mjs/ )
+    
+    var m2 = new THREE.Matrix3();
+
+    var m = m1.flatten();
+    
+    var a11 = m[10]*m[5]-m[6]*m[9],
+        a21 = -m[10]*m[1]+m[2]*m[9],
+        a31 = m[6]*m[1]-m[2]*m[5],
+        a12 = -m[10]*m[4]+m[6]*m[8],
+        a22 = m[10]*m[0]-m[2]*m[8],
+        a32 = -m[6]*m[0]+m[2]*m[4],
+        a13 = m[9]*m[4]-m[5]*m[8],
+        a23 = -m[9]*m[0]+m[1]*m[8],
+        a33 = m[5]*m[0]-m[1]*m[4];
+    var det = m[0]*(a11) + m[1]*(a12) + m[2]*(a13);
+    if (det == 0) // no inverse
+        throw "matrix not invertible";
+    var idet = 1.0 / det;
+
+    m2.m[0] = idet*a11;
+    m2.m[1] = idet*a21;
+    m2.m[2] = idet*a31;
+    m2.m[3] = idet*a12;
+    m2.m[4] = idet*a22;
+    m2.m[5] = idet*a32;
+    m2.m[6] = idet*a13;
+    m2.m[7] = idet*a23;
+    m2.m[8] = idet*a33;
+
+    return m2;
+    
+}
+
 THREE.Matrix4.makeFrustum = function( left, right, bottom, top, near, far ) {
 
 	var m, x, y, a, b, c, d;
@@ -415,3 +454,25 @@ THREE.Matrix4.makeOrtho = function( left, right, top, bottom, near, far ) {
 	return m;
 
 };
+
+THREE.Matrix3 = function () {
+
+	this.m = [];
+
+};
+
+THREE.Matrix3.prototype = {
+	
+    transpose: function () {
+    
+        var tmp;
+        
+        tmp = this.m[1]; this.m[1] = this.m[3]; this.m[3] = tmp;
+        tmp = this.m[2]; this.m[2] = this.m[6]; this.m[6] = tmp;
+        tmp = this.m[5]; this.m[5] = this.m[7]; this.m[7] = tmp;
+        
+        return this;
+
+    }
+    
+}