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
元素阵列。
我应该从我的Matrix4
中创建一个Matrix3
,然后将其转换并将其转换回我的反向Matrix3
?或者我错过了一些明显的东西?
答案 0 :(得分:2)
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