Как реконструировать преобразование webkit matrix3d

У меня есть элемент куба, который вращается и переводится в трехмерное пространство.

Я хочу узнать только часть rotateY этого преобразования в данный момент времени. Это возможно?

У меня есть:

var cube = document.getElementById("cube");
var transform = getComputedStyle(cube).webkitTransform;

//the value of transform is:
// matrix3d(-1, 0, 0.00000000000000012246467991473532, 0, 
//           0, 1, 0, 0, 
//          -0.00000000000000012246467991473532, 0, -1, 0, 
//           0, 0, 0, 1)

Помощь? :-)


person Matt H.    schedule 15.05.2012    source источник
comment
получение значения y преобразования? вы можете взглянуть на translate(). который преобразует матричную форму в значение. подробнее об этом здесь преобразование перевода   -  person Ikmal Ezzani    schedule 15.05.2012
comment
Может я не слежу, но у меня застрял этот matrix3d, трансформация у меня применяется чужим кодом. Я просто пытаюсь понять, смогу ли я вернуться к ТОЛЬКО повороту.   -  person Matt H.    schedule 15.05.2012
comment
Я неправильно понял. думал, что вы хотите использовать значение преобразования, чтобы что-то сделать. не обращайте внимания на комментарий. Я нашел функцию по этой ссылке el">Читайте getRotationDegrees. И прочитайте ссылку выше, чтобы узнать, какое значение принадлежит Y, и используйте то, как они используют функцию, чтобы получить степень Y. Я прочитаю об этом позже сегодня вечером, если вы не получите ответ. извините, что не был достаточно полезным. по пути на работу. :)   -  person Ikmal Ezzani    schedule 15.05.2012


Ответы (3)


Если ваш объект вращается только вокруг оси Y, то да, вращение легко вычислить — это arccos элементов матрицы 1,1 или 3,3 или арсин элемента -(элемент 3,1) или арксинус элемента 1,3. В вашем конкретном примере это около 180 градусов. Если вращения связаны не только с осью Y, вам нужно начать отслеживать предыдущие вращения, и это может стать более запутанным.

Ваш перевод будет просто нижней строкой выходной матрицы, в данном случае 0,0,0.

См. примеры на http://www.inversereality.org/tutorials/graphics%20programming/3dwmatrices.html

person Ruan Caiman    schedule 15.05.2012
comment
Ну, это тема 7-летней давности. Вы можете использовать машину обратного пути на archive.org, чтобы увидеть ее кешированную версию. Вот версия 2011 года с путевой машины: "nofollow noreferrer">web.archive.org/web/20110127040842/http:// - person Ruan Caiman; 06.03.2019

Вы можете получить информацию о преобразовании с помощью функции «new WebKitCSSMatrix». Например :

var matrix = new WebKitCSSMatrix($('#element').css('-webkit-transform'));
var translateZ = matrix.m43;

Каждая часть матрицы объясняется здесь: http://9elements.com/html5demos/matrix3d/. может получить более сложные свойства, такие как вращениеX, для 3D-матрицы с математическим беспорядком:

var rotationX = Math.acos(matrix.a) * (180/Math.PI);
var rotationY = Math.asin(matrix.b) * (180/Math.PI);
person adriendenat    schedule 02.07.2012

Данная функция определяет rotation*, transform* и scale для заданного элемента DOM кроссбраузерно.

Если вы хотите чего-то большего или найдете ошибки в математике, это обсуждение на math.stackexchange.com

Протестировано в браузерах, перечисленных в http://caniuse.com/transforms3d:

var reverseEngineerTransform3d = function (domElement, parameterName) {

        parameterName = parameterName.toLowerCase();

        var computedStyle = window.getComputedStyle(domElement),
            matrixStyle = computedStyle.transform || computedStyle.WebkitTransform || computedStyle.MozTransform || computedStyle.msTransform || computedStyle.OTransform;

        if (matrixStyle) {
            matrixStyle = matrixStyle.trim();
        }

        if (matrixStyle === 'none') {
            if (parameterName.indexOf('rotate') === 0) {
                return '0deg';
            } else if (parameterName.indexOf('translate') === 0) {
                return '0px';
            } else if (parameterName === 'scale') {
                return 1;
            } else {
                throw "Unsupported 3D parameter " + parameterName;
            }
        }

        else if (!matrixStyle || matrixStyle.substr(0, 9) !== 'matrix3d(') {
            //return something or die ?????
            throw "Something is wrong with 3D transform style. Probably no style applied at all OR unknown CSS3 vendor OR unknown/unsupported 3D matrix representation string OR CSS3 3D transform is not fully supported in this browser";
        }

        var matrix = window.WebKitCSSMatrix && (new WebKitCSSMatrix(matrixStyle)) ||
                window.MozCSSMatrix && (new MozCSSMatrix(matrixStyle)) ||
                window.MsCSSMatrix && (new MsCSSMatrix(matrixStyle)) ||
                window.OCSSMatrix && (new OCSSMatrix(matrixStyle)) ||
                window.CSSMatrix && (new CSSMatrix(matrixStyle)); // sorry 4 copy-paste my friends

        if (!matrix || isNaN(matrix.a) || isNaN(matrix.b) || isNaN(matrix.c) || isNaN(matrix.m41) || isNaN(matrix.m42) || isNaN(matrix.m43) || isNaN(matrix.m11)) {
            throw "Could not catch CSSMatrix constructor for current browser, OR the constructor has returned a non-standard matrix object (need .a, .b, .c and mXX numerical properties to work)";
        }


        // todo: giving a parameters array (and returning an array) is a good idea, or we could return everything if no parameters given

        switch (parameterName) {

            case 'rotatey':  // in degrees
                return Math.acos(matrix.m11)*180/Math.PI * (matrix.m13 > 0 ? -1 : 1) + 'deg';

            case 'rotatex':  // in degrees
                return Math.asin(matrix.m22)*180/Math.PI + 'deg';

            case 'rotatez':  // in degrees
                throw "TODO: Sorry, math people. I really need help here! Please implement this case for me. This will help you: http://9elements.com/html5demos/matrix3d/";

            case 'translatex': // in pixels
                return matrix.m41 + 'px';

            case 'translatey': // in pixels
                return matrix.m42 + 'px';

            case 'translatez': // in pixels
                return matrix.m43 + 'px';

            case 'scale': // no units
                if (matrix.m11 === matrix.m22 && matrix.m22 === matrix.m33) {
                    return matrix.m11;
                } else {
                    throw "I'm not so smart to calculate scale from this matrix";
                }

           // todo: anything else? skew ????

            default:
                throw "This function accepts 3d-parameter name (case-insensitive string) as the second argument. Currently supported: 'rotate[xyz]', 'translate[xyz]', 'scale'. This parameter is unsupported: " + parameterName;
        }
    };
person Dan    schedule 06.09.2013
comment
Человек с лучшими математическими способностями может расширить возможности функции. Когда у нас есть матрица, мы можем многое перепроектировать. - person Dan; 06.09.2013
comment
// Todo: хорошая статья, которую я скоро обработаю: css -tricks.com/get-value-of-css-rotation-through-javascript - person Dan; 11.09.2013