由于我对矩阵的了解接近于零,我正在寻找一种辅助方法,可以从矩阵数组转换为可读格式。
我的意思是可读格式:
{
translate :
{
x : 0,
y : 0,
z : 0
},
rotation :
{
x : 0,
y : 90,
z : 0
},
skew :
{
x : 0,
y : 0
},
scale :
{
x : 0,
y : 0,
z : 0
}
}
矩阵格式我的意思是:matrix3d(0.00000000000000006123233995736766, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0.00000000000000006123233995736766, 0, 0, 0, 0, 1)
。
我一直在通过谷歌寻找这样的方法,但似乎无法找到它。
是否有这样的方法,或者我如何在每个可用轴上对每个转换类型进行decypher /计算?
更新:我的一位朋友偶然发现了http://web.iitd.ac.in/~hegde/cad/lecture/L6_3dtrans.pdf,我将调查此内容以尝试至少检索一些内容。
答案 0 :(得分:1)
将矩阵分解回原始变换并不容易。我设法分解了scale*rotate*translate
矩阵。
function extract(m) { // supports only scale*rotate*translate matrix
var radians = Math.PI / 180
var sX = Math.sqrt(m[0]*m[0] + m[1]*m[1] + m[2]*m[2]),
sY = Math.sqrt(m[4]*m[4] + m[5]*m[5] + m[6]*m[6]),
sZ = Math.sqrt(m[8]*m[8] + m[9]*m[9] + m[10]*m[10])
var rX = Math.atan2(-m[9]/sZ, m[10]/sZ) / radians,
rY = Math.asin(m[8]/sZ) / radians,
rZ = Math.atan2(-m[4]/sY, m[0]/sX) / radians
if (m[4] === 1 || m[4] === -1) {
rX = 0
rY = m[4] * -Math.PI/2
rZ = m[4] * Math.atan2(m[6]/sY, m[5]/sY) / radians
}
var tX = m[12]/sX,
tY = m[13]/sX,
tZ = m[14]/sX
return {
translate: [tX, tY, tZ],
rotate: [rX, rY, rZ],
scale: [sX, sY, sZ]
}
}
但任何其他转换顺序都会失败。