Есть формула из книги "Основы управления манипуляционными роботами" С.Л. Зенкевич, А.С. Ющенко 2004г.
.
.
.
Наговнокодил, так чтобы сходилось с формулами:
<p id="log"></p>
"use strict";
// ф-я вывода item(string) внутри тега p с id "log"
var log = function(item) {
var p = document.getElementById("log");
Array.isArray(item) ? item.forEach(function(current, i, array) {
log("[" + current + "]")
}) : p.innerHTML += item + "<br />"
};
var calcAngleAxisFromRotateMatrix = function(rotateMatrix) {
var R = rotateMatrix,
cosA = (1 / 2) * (math.subtract((R[0][0] + R[1][1] + R[2][2]), 1)),
angleRad = math.acos(cosA),
sinA = math.sin(angleRad),
sinAx2 = 2 * sinA,
axis = [(R[2][1] - R[1][2]) / sinAx2, (R[0][2] - R[2][0]) / sinAx2, (R[1][0] - R[0][1]) / sinAx2];
return [angleRad, axis]
};
var AngleAndAxis = calcAngleAxisFromRotateMatrix([
[1, 0, 0],
[0, -1, 0],
[0, 0, 1]
]);
log(AngleAndAxis[0] * 180 / Math.PI); // angle
log(AngleAndAxis[1]); // angle
Вход - матрица - аргумент функции calcAngleAxisFromRotateMatrix
https://jsfiddle.net/Quncore/1kfsL0b5/
Для матрицы поворота вокруг оси X и Z на 90 и 180 градусов соответственно, определяется угол, но не ось. Для угла 30 градусов в знаменателе получается 0, соответственно вычисления не идут.
Матрицы для теста использовались следующие:
R90x
[1,0,0]
[0,0,-1]
[0,1,0]
R30y
[1,0,0]
[0,1,0]
[0,0,1]
R180z
[-1,0,0]
[0,-1,0]
[0,0,1]