1

我不确定这是否可能,因为应用的顺序旋转会影响旋转矩阵的形式;但我想从 CSS matrix3d 变换中获得欧拉角。我发现缺乏关于 matrix3d 格式以及如何应用转换的文档。到目前为止,这是我的代码:

getRotation: function (el) {
    var matrix = Esprit.getTransform(el);
    // 2d matrix
    if (matrix.length === 6) {
        return {
            x: 0,
            y: 0,
            z: Math.round(Math.atan2(matrix[1], matrix[0]) * (180 / Math.PI))
        };
    }
    // 3d matrix
    else {
        // incorrect calculations
        // only work for a single rotation
        // return {
        //      x: Math.round(Math.atan2(matrix[6], matrix[5]) * (180/Math.PI)),
        //      y: Math.round(Math.atan2(-matrix[2], matrix[0]) * (180/Math.PI)),
        //      z: Math.round(Math.atan2(matrix[1], matrix[0]) * (180/Math.PI))
        // };

        // convert from string to number
        // for (var i = 0, len = matrix.length; i < len; i++) {
        //      matrix[i] = Number(matrix[i]);
        // }

        // gimball lock for positive 90 degrees
        if (matrix[2] === 1) {
            return {
                x: Esprit.toDegrees(Math.atan2(matrix[0], matrix[1])),
                y: Esprit.toDegrees(Math.PI / 2),
                z: 0
            }
        }
        // gimball lock for negative 90 degrees
        else if (matrix[2] === -1) {
            return {
                x: Esprit.toDegrees(-Math.atan2(matrix[0], matrix[1])),
                y: Esprit.toDegrees(-Math.PI / 2),
                z: 0
            }
        }
        // no gimball lock
        else {
            return {
                x: Esprit.toDegrees(Math.atan2(matrix[6], matrix[10])),
                y: Esprit.toDegrees(Math.asin(matrix[2])),
                z: Esprit.toDegrees(Math.atan2(-matrix[1], matrix[0]))
            }
        }

    }
},

getTransform: function (el) {
    var transform = getComputedStyle(el).webkitTransform;
    return transform !== 'none' ? transform.split('(')[1].split(')')[0].split(',') : Esprit.create3dMatrix();
},

toDegrees: function (radians) {
    return Math.round(radians * 180 / Math.PI);
}

任何帮助或想法将不胜感激。谢谢!

4

1 回答 1

0

John Schulz ( @jfsiii ) 发表了以下回复:

https://gist.github.com/4119165

于 2012-11-20T16:51:50.713 回答