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