three.js文档指出Matrix3
具有.getInverse功能。

但是它将Matrix4作为其第一个参数。

所以我在r71中尝试了幼稚的方法:

var m = new THREE.Matrix3();
console.log('Initial:', m.elements);
m.set(10,8,3,15,7,2,10,6,1);
console.log('Set    :', m.elements);
console.log('Inverse:', m.getInverse(m).elements);


http://jsfiddle.net/as8g61nb/5/(仅在Chrome中测试)

但这给了我:

Initial: [1, 0, 0, 0, 1, 0, 0, 0, 1]                   // OK
Set    : [10, 15, 10, 8, 7, 6, 3, 2, 1]                // Arbitrary numbers
Inverse: [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN] // Not what I expected


Wolfram Alpha返回有效的3x3矩阵。

输入:Inverse[{{10, 15, 10}, {8, 7, 6}, {3, 2, 1}}]

输出:{{-1/10, 1/10, 2/5}, {1/5, -2/5, 2/5}, {-1/10, 1/2, -1}}

我已经研究了three.js源代码,以检查它在.getInverse中的作用,但这使我更加困惑。

如前所述,它希望将Matrix4作为其第一个参数,从而访问在Matrix3上不起作用的elements[10]elements[11],因此可能导致NaN Elements数组。

所以我应该从我的Matrix4中创建一个Matrix3然后将其反转并转换回我的反向Matrix3吗?还是我错过了一些显而易见的东西?

最佳答案

three.js基于Matrix4,因此没有直接反转Matrix3的方法。

一种解决方案是在代码中到处使用Matrix4

另一种解决方案是从Matrix4填充Matrix3,然后调用getInverse()

var m3 = new THREE.Matrix3();

m3.set( 10,8,3, 15,7,2, 10,6,1 ); // column1, column2, column3

console.log( 'Set    :', m3.elements );

var m4 = new THREE.Matrix4();

m4.set( 10,8,3,0, 15,7,2,0, 10,6,1,0, 0,0,0,1 );

console.log( 'Inverse:', m3.getInverse(m4).elements );


three.js r.71

09-25 16:41