如何获得 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
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