提交 9ab854de 编写于 作者: A alteredq

Refactored handling of Matrix4 => Matrix3 inversion.

This is now done as method of Matrix3 object which gets as a parameter Matrix4 object to be inverted (to be consistent with how Matrix4 => Matrix4 inversion is done).

As per discussion in #1615.
上级 c33a473d
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
......@@ -12,6 +12,43 @@ THREE.Matrix3.prototype = {
constructor: THREE.Matrix3,
getInverse: function ( m ) {
// input: THREE.Matrix4
// ( based on http://code.google.com/p/webgl-mjs/ )
var a11 = m.n33 * m.n22 - m.n32 * m.n23,
a21 = - m.n33 * m.n21 + m.n31 * m.n23,
a31 = m.n32 * m.n21 - m.n31 * m.n22,
a12 = - m.n33 * m.n12 + m.n32 * m.n13,
a22 = m.n33 * m.n11 - m.n31 * m.n13,
a32 = - m.n32 * m.n11 + m.n31 * m.n12,
a13 = m.n23 * m.n12 - m.n22 * m.n13,
a23 = - m.n23 * m.n11 + m.n21 * m.n13,
a33 = m.n22 * m.n11 - m.n21 * m.n12;
var det = m.n11 * a11 + m.n21 * a12 + m.n31 * a13;
// no inverse
if ( det === 0 ) {
console.warn( "Matrix3.getInverse(): determinant == 0" );
}
var idet = 1.0 / det;
var m = this.m;
m[ 0 ] = idet * a11; m[ 1 ] = idet * a21; m[ 2 ] = idet * a31;
m[ 3 ] = idet * a12; m[ 4 ] = idet * a22; m[ 5 ] = idet * a32;
m[ 6 ] = idet * a13; m[ 7 ] = idet * a23; m[ 8 ] = idet * a33;
return this;
},
/*
transpose: function () {
......
......@@ -20,8 +20,6 @@ THREE.Matrix4 = function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33
);
this.m33 = new THREE.Matrix3();
};
THREE.Matrix4.prototype = {
......@@ -232,6 +230,7 @@ THREE.Matrix4.prototype = {
//TODO: make this more efficient
//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
return (
n14 * n23 * n32 * n41-
n13 * n24 * n32 * n41-
......@@ -962,6 +961,7 @@ THREE.Matrix4.prototype = {
},
clone: function () {
return new THREE.Matrix4(
......@@ -977,44 +977,6 @@ THREE.Matrix4.prototype = {
};
THREE.Matrix4.makeInvert3x3 = function ( m1 ) {
// input: THREE.Matrix4, output: THREE.Matrix3
// ( based on http://code.google.com/p/webgl-mjs/ )
var m33 = m1.m33, m33m = m33.m,
a11 = m1.n33 * m1.n22 - m1.n32 * m1.n23,
a21 = - m1.n33 * m1.n21 + m1.n31 * m1.n23,
a31 = m1.n32 * m1.n21 - m1.n31 * m1.n22,
a12 = - m1.n33 * m1.n12 + m1.n32 * m1.n13,
a22 = m1.n33 * m1.n11 - m1.n31 * m1.n13,
a32 = - m1.n32 * m1.n11 + m1.n31 * m1.n12,
a13 = m1.n23 * m1.n12 - m1.n22 * m1.n13,
a23 = - m1.n23 * m1.n11 + m1.n21 * m1.n13,
a33 = m1.n22 * m1.n11 - m1.n21 * m1.n12,
det = m1.n11 * a11 + m1.n21 * a12 + m1.n31 * a13,
idet;
// no inverse
if ( det === 0 ) {
return null;
}
idet = 1.0 / det;
m33m[ 0 ] = idet * a11; m33m[ 1 ] = idet * a21; m33m[ 2 ] = idet * a31;
m33m[ 3 ] = idet * a12; m33m[ 4 ] = idet * a22; m33m[ 5 ] = idet * a32;
m33m[ 6 ] = idet * a13; m33m[ 7 ] = idet * a23; m33m[ 8 ] = idet * a33;
return m33;
}
THREE.Matrix4.__v1 = new THREE.Vector3();
THREE.Matrix4.__v2 = new THREE.Vector3();
THREE.Matrix4.__v3 = new THREE.Vector3();
......
......@@ -301,6 +301,7 @@ THREE.WebGLRenderer = function ( parameters ) {
object.__webglInit = false;
delete object._modelViewMatrix;
delete object._normalMatrix;
delete object._normalMatrixArray;
delete object._modelViewMatrixArray;
......@@ -3824,6 +3825,7 @@ THREE.WebGLRenderer = function ( parameters ) {
object.__webglInit = true;
object._modelViewMatrix = new THREE.Matrix4();
object._normalMatrix = new THREE.Matrix3();
object._normalMatrixArray = new Float32Array( 9 );
object._modelViewMatrixArray = new Float32Array( 16 );
......@@ -4937,13 +4939,8 @@ THREE.WebGLRenderer = function ( parameters ) {
object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray );
var inverseMatrix = THREE.Matrix4.makeInvert3x3( object._modelViewMatrix );
if ( inverseMatrix ) {
inverseMatrix.transposeIntoArray( object._normalMatrixArray );
}
object._normalMatrix.getInverse( object._modelViewMatrix );
object._normalMatrix.transposeIntoArray( object._normalMatrixArray );
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册