1

回転が適用される順序が回転行列の形式に影響を与える可能性があるため、これが可能かどうかはわかりません。しかし、CSS の matrix3d Transform からオイラー角を取得したいと思います。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 に答える