将3D矩阵转换为可读格式

4

由于我对矩阵的了解几乎为零,因此我正在寻找一个辅助方法,可以将矩阵数组转换为可读格式。

所谓可读格式是指:

{
    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)
我已经在 Google 上搜索了这样的方法,但似乎找不到。
是否有这样的方法,或者如何解密/计算每个可用轴上的每个变换类型?
更新:我的朋友偶然发现http://web.iitd.ac.in/~hegde/cad/lecture/L6_3dtrans.pdf,我会尝试研究并至少获得一些信息。

这篇文章对matrix3D进行了相当有用的解释,虽然要利用这些知识编写转换工具需要花费相当大的精力。值得注意的是,扭曲、旋转等操作的顺序很重要,即旋转后跟扭曲不一定与扭曲后跟旋转相同,因此任何可读版本的矩阵都必须对预期首先执行哪个变换作出一些明确的假设。 - wheresrhys
嗯,但这适用于倾斜和旋转,不是吗?如果是这样,该方法可以构建成一种方式,以接受参数选择倾斜和旋转的顺序。 - tomsseisums
是的,这是可以的,只是需要考虑一下。 - wheresrhys
也许这个项目会有所帮助 https://github.com/mattdesl/mat4-decompose - GibboK
1个回答

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]
    }
}

但是对于任何其他变换顺序,它都会失败。

有什么想法可以返回偏斜度吗? - thednp
嘿,这段代码中radians是未定义的变量,公式是什么? - thednp
添加了 radians 变量。您也可以查看 https://github.com/michaelvillar/dynamics.js/blob/master/src/dynamics.coffee#L766-L920。它具有更高级的分解方法。 - user207297
我找到了一些有趣的东西 https://github.com/start940315/matrix/blob/master/matrix.js - thednp
如上所述,它仅支持一种特定的变换顺序(translate rotate scale) http://s17.postimg.org/upcsqhn4f/Screen_Shot_2015_06_25_at_12_43_18_AM.png 然后是http://s17.postimg.org/bmtf3kc3y/Screen_Shot_2015_06_25_at_12_46_51_AM.jpg。你会得到奇怪的值,因为JS使用IEEE浮点算术标准,所以你需要稍微舍入一下。有关更高级的分解,请参阅https://github.com/michaelvillar/dynamics.js/blob/master/src/dynamics.coffee#L766-L920。它支持`skew`和`perspective`等功能。谢谢。 - user207297
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接