如何获得 three.js 中 Matrix3 的逆矩阵?

How to get the inverse of a Matrix3 in three.js?

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 returns 一个有效的 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 作为它的第一个参数,因此访问 elements[10]elements[11],这在 Matrix3 上不起作用,因此可能导致 NaN 元素数组。

所以我是否应该从我的 Matrix3 中创建一个 Matrix4 然后将其反转并将其转换回以获得我的 Inverse Matrix3 ?还是我在这里错过了一些明显的东西?

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

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

另一个解决方案是从您的 Matrix3 填充一个 Matrix4,然后调用 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