Matrix3.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /**
  2. * @author alteredq / http://alteredqualia.com/
  3. */
  4. THREE.Matrix3 = function () {
  5. this.elements = new Float32Array(9);
  6. };
  7. THREE.Matrix3.prototype = {
  8. constructor: THREE.Matrix3,
  9. getInverse: function ( matrix ) {
  10. // input: THREE.Matrix4
  11. // ( based on http://code.google.com/p/webgl-mjs/ )
  12. var me = matrix.elements;
  13. var a11 = me[10] * me[5] - me[6] * me[9];
  14. var a21 = - me[10] * me[1] + me[2] * me[9];
  15. var a31 = me[6] * me[1] - me[2] * me[5];
  16. var a12 = - me[10] * me[4] + me[6] * me[8];
  17. var a22 = me[10] * me[0] - me[2] * me[8];
  18. var a32 = - me[6] * me[0] + me[2] * me[4];
  19. var a13 = me[9] * me[4] - me[5] * me[8];
  20. var a23 = - me[9] * me[0] + me[1] * me[8];
  21. var a33 = me[5] * me[0] - me[1] * me[4];
  22. var det = me[0] * a11 + me[1] * a12 + me[2] * a13;
  23. // no inverse
  24. if ( det === 0 ) {
  25. console.warn( "Matrix3.getInverse(): determinant == 0" );
  26. }
  27. var idet = 1.0 / det;
  28. var m = this.elements;
  29. m[ 0 ] = idet * a11; m[ 1 ] = idet * a21; m[ 2 ] = idet * a31;
  30. m[ 3 ] = idet * a12; m[ 4 ] = idet * a22; m[ 5 ] = idet * a32;
  31. m[ 6 ] = idet * a13; m[ 7 ] = idet * a23; m[ 8 ] = idet * a33;
  32. return this;
  33. },
  34. transpose: function () {
  35. var tmp, m = this.elements;
  36. tmp = m[1]; m[1] = m[3]; m[3] = tmp;
  37. tmp = m[2]; m[2] = m[6]; m[6] = tmp;
  38. tmp = m[5]; m[5] = m[7]; m[7] = tmp;
  39. return this;
  40. },
  41. transposeIntoArray: function ( r ) {
  42. var m = this.m;
  43. r[ 0 ] = m[ 0 ];
  44. r[ 1 ] = m[ 3 ];
  45. r[ 2 ] = m[ 6 ];
  46. r[ 3 ] = m[ 1 ];
  47. r[ 4 ] = m[ 4 ];
  48. r[ 5 ] = m[ 7 ];
  49. r[ 6 ] = m[ 2 ];
  50. r[ 7 ] = m[ 5 ];
  51. r[ 8 ] = m[ 8 ];
  52. return this;
  53. }
  54. };