Для WebGL есть файл с функциями операций с матрицами
glMatrix.js. Там есть функция:
mat4.rotate = function (mat, angle, axis, dest) {
var x = axis[0], y = axis[1], z = axis[2],
len = Math.sqrt(x * x + y * y + z * z),
s, c, t,
a00, a01, a02, a03,
a10, a11, a12, a13,
a20, a21, a22, a23,
b00, b01, b02,
b10, b11, b12,
b20, b21, b22;
if (!len) { return null; }
if (len !== 1) {
len = 1 / len;
x *= len;
y *= len;
z *= len;
}
s = Math.sin(angle);
c = Math.cos(angle);
t = 1 - c;
a00 = mat[0]; a01 = mat[1]; a02 = mat[2]; a03 = mat[3];
a10 = mat[4]; a11 = mat[5]; a12 = mat[6]; a13 = mat[7];
a20 = mat[8]; a21 = mat[9]; a22 = mat[10]; a23 = mat[11];
// Construct the elements of the rotation matrix
b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;
b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;
b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;
if (!dest) {
dest = mat;
} else if (mat !== dest) { // If the source and destination differ, copy the unchanged last row
dest[12] = mat[12];
dest[13] = mat[13];
dest[14] = mat[14];
dest[15] = mat[15];
}
// Perform rotation-specific matrix multiplication
dest[0] = a00 * b00 + a10 * b01 + a20 * b02;
dest[1] = a01 * b00 + a11 * b01 + a21 * b02;
dest[2] = a02 * b00 + a12 * b01 + a22 * b02;
dest[3] = a03 * b00 + a13 * b01 + a23 * b02;
dest[4] = a00 * b10 + a10 * b11 + a20 * b12;
dest[5] = a01 * b10 + a11 * b11 + a21 * b12;
dest[6] = a02 * b10 + a12 * b11 + a22 * b12;
dest[7] = a03 * b10 + a13 * b11 + a23 * b12;
dest[8] = a00 * b20 + a10 * b21 + a20 * b22;
dest[9] = a01 * b20 + a11 * b21 + a21 * b22;
dest[10] = a02 * b20 + a12 * b21 + a22 * b22;
dest[11] = a03 * b20 + a13 * b21 + a23 * b22;
return dest;
};
Поворот матрицы на указанный угол (в радианах) по указанным осям. Но нету функции которая бы возвращала угол поворота указанной оси соответствующей матрицы.
Типа:
mat4.getPitch = function (mat) {
...
}
mat4.getYaw = function (mat) {
...
}
mat4.getRoll = function (mat) {
...
}
Я спрашиваю может есть у кого то готовое решение. Заранее спасибо!