Explorar el Código

Added inversion of 3x3 rotation submatrix.

Added rudimentary 3x3 matrix class (just transpose, as this is needed for normal matrix).
alteredq hace 15 años
padre
commit
fdb1ee5ff2
Se han modificado 1 ficheros con 61 adiciones y 0 borrados
  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;
+
+    }
+    
+}