如何在three.js中得到Matrix3的逆?

时间:2015-05-19 09:03:21

标签: javascript matrix three.js matrix-inverse

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?或者我错过了一些明显的东西?

1 个答案:

答案 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