1. 4*4 矩阵的行列式:
function determinant(out, a) {
let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
let a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
let b00 = a00 a11 - a01 a10;
let b01 = a00 a12 - a02 a10;
let b02 = a00 a13 - a03 a10;
let b03 = a01 a12 - a02 a11;
let b04 = a01 a13 - a03 a11;
let b05 = a02 a13 - a03 a12;
let b06 = a20 a31 - a21 a30;
let b07 = a20 a32 - a22 a30;
let b08 = a20 a33 - a23 a30;
let b09 = a21 a32 - a22 a31;
let b10 = a21 a33 - a23 a31;
let b11 = a22 a33 - a23 a32;
return b00 b11 - b01 b10 + b02 b09 + b03 b08 - b04 b07 + b05 b06;
}
2. 4*4 矩阵乘法:
// 在webgl中,行列倒置并且按列展开,因此跟平常的数学公式不同
// AT 乘 BT = (B乘A)T
function multipli(out, {a, arow, acol}, {b, brow, bcol}) {
if (acol != brow) {
return null;
}
for(var i = 0; i < arow; ++i) {
for(var j = 0; j < bcol; ++j) {
out[i*bcol+j] = 0;
for(var k = 0; k < brow; ++k) {
out[i*bcol+j] = out[i*bcol+j] + b[j*bcol + k] * a[k*acol+i] ;
}
}
}
return {out, arow, bcol};
}
3. 4*4矩阵的伴随矩阵
function adjoint(out, a) {
let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
let a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
let b00 = a00 a11 - a01 a10;
let b01 = a00 a12 - a02 a10;
let b02 = a00 a13 - a03 a10;
let b03 = a01 a12 - a02 a11;
let b04 = a01 a13 - a03 a11;
let b05 = a02 a13 - a03 a12;
let b06 = a20 a31 - a21 a30;
let b07 = a20 a32 - a22 a30;
let b08 = a20 a33 - a23 a30;
let b09 = a21 a32 - a22 a31;
let b10 = a21 a33 - a23 a31;
let b11 = a22 a33 - a23 a32;
out[0] = (a11 b11 - a12 b10 + a13 * b09);
out[1] = (a02 b10 - a01 b11 - a03 * b09);
out[2] = (a31 b05 - a32 b04 + a33 * b03);
out[3] = (a22 b04 - a21 b05 - a23 * b03);
out[4] = (a12 b08 - a10 b11 - a13 * b07);
out[5] = (a00 b11 - a02 b08 + a03 * b07);
out[6] = (a32 b02 - a30 b05 - a33 * b01);
out[7] = (a20 b05 - a22 b02 + a23 * b01);
out[8] = (a10 b10 - a11 b08 + a13 * b06);
out[9] = (a01 b08 - a00 b10 - a03 * b06);
out[10] = (a30 b04 - a31 b02 + a33 * b00);
out[11] = (a21 b02 - a20 b04 - a23 * b00);
out[12] = (a11 b07 - a10 b09 - a12 * b06);
out[13] = (a00 b09 - a01 b07 + a02 * b06);
out[14] = (a31 b01 - a30 b03 - a32 * b00);
out[15] = (a20 b03 - a21 b01 + a22 * b00);
return out;
}
4. 4*4矩阵的逆矩阵
// 即A的伴随矩阵除以A的行列式
function inverse(out, a) {
let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
let a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
let b00 = a00 a11 - a01 a10;
let b01 = a00 a12 - a02 a10;
let b02 = a00 a13 - a03 a10;
let b03 = a01 a12 - a02 a11;
let b04 = a01 a13 - a03 a11;
let b05 = a02 a13 - a03 a12;
let b06 = a20 a31 - a21 a30;
let b07 = a20 a32 - a22 a30;
let b08 = a20 a33 - a23 a30;
let b09 = a21 a32 - a22 a31;
let b10 = a21 a33 - a23 a31;
let b11 = a22 a33 - a23 a32;
// 计算行列式
let det = b00 b11 - b01 b10 + b02 b09 + b03 b08 - b04 b07 + b05 b06;
if (Math.abs(det) > 0.00001) {
det = 1.0 / det;
}
out[0] = (a11 b11 - a12 b10 + a13 b09) det;
out[1] = (a02 b10 - a01 b11 - a03 b09) det;
out[2] = (a31 b05 - a32 b04 + a33 b03) det;
out[3] = (a22 b04 - a21 b05 - a23 b03) det;
out[4] = (a12 b08 - a10 b11 - a13 b07) det;
out[5] = (a00 b11 - a02 b08 + a03 b07) det;
out[6] = (a32 b02 - a30 b05 - a33 b01) det;
out[7] = (a20 b05 - a22 b02 + a23 b01) det;
out[8] = (a10 b10 - a11 b08 + a13 b06) det;
out[9] = (a01 b08 - a00 b10 - a03 b06) det;
out[10] = (a30 b04 - a31 b02 + a33 b00) det;
out[11] = (a21 b02 - a20 b04 - a23 b00) det;
out[12] = (a11 b07 - a10 b09 - a12 b06) det;
out[13] = (a00 b09 - a01 b07 + a02 b06) det;
out[14] = (a31 b01 - a30 b03 - a32 b00) det;
out[15] = (a20 b03 - a21 b01 + a22 b00) det;
return out;
}
5. 4*4矩阵的转置矩阵
function transport(out, a) {
//out[0] = a[0];
//out[1] = a[4];
//out[2] = a[8];
//out[3] = a[12];
//out[4] = a[1];
//out[5] = a[5];
//out[6] = a[9];
//out[7] = a[13];
//out[8] = a[2];
//out[9] = a[6];
//out[10] = a[10];
//out[11] = a[14];
//out[12] = a[3];
//out[13] = a[7];
//out[14] = a[11];
//out[15] = a[15];
for (let i = 0; i < 4; ++i) {
for (let j = 0; j < 4; ++j) {
out[i*4+j] = a[j*4+i];
}
}
return out;
}
6. 平移矩阵
[
1,0,0,0,
0,1,0,0,
0,0,1,0,
x,y,z,1
]
其中,x,y,z分别是x轴,y轴,z轴方向上的平移量,值范围是[-1,1]
7. 旋转矩阵
绕x轴旋转radx弧度,对应矩阵:
[
1,0,0,0,
0,cos(radx),sin(radx),0,
0,-sin(radx),cos(radx),0,
0,0,0,1
]
绕y轴旋转rady弧度,对应矩阵:
[
cos(rady),0,sin(rady),0,
0,1,0,0,
-sin(rady),0,cos(rady),0,
0,0,0,1
]
绕z轴旋转radz弧度,对应矩阵:
[
cos(radz),sin(radz),0,0,
-sin(radz),cos(radz),0,0,
0,0,1,0,
0,0,0,1
]
8. 缩放矩阵
[
scalex,0,0,0,
0,scaley,0,0,
0,0,scalez,0,
0,0,0,1
]
原网址: 访问
创建于: 2023-01-12 16:36:17
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论