Давайте возьмем пример, приведенный в задаче. Нормализованные оси задаются, но не в каком-либо определенном порядке, как указано ниже.
"normalizedAxes":[0,0,1,-0.707107,0.707107,0,-0.707107,-0.707107,0]
Поскольку мы знаем, что объект вращается только вокруг оси z, третий столбец в матрице вращения будет [0, 0, 1]. Так что это оставляет нас с двумя столбцами; давайте назовем их axis_0, axis_1.
Итак,
axis_0 = [-0.707107, 0.707107, 0]
axis_1 = [-0.707107, -0.707107, 0]
Вы можете вычислить угол, который каждая из этих осей образует с осью X в глобальной системе координат, используя обратную функцию тангенса. Допустим, угол, созданный axis_0 и axis_1, равен angle_0 и angle_1 соответственно.
Любое из следующих соотношений должно быть верным, поскольку мы знаем, что axis_0 и axis_1 ортогональны .
angle_0 = angle_1 + 90 or angle_1 = angle_0 + 90
Итак, на вышеупомянутом примере вы можете заметить, что
angle_0 = 135 degrees
angle_1 = 225 degrees (-135 degrees)
Поскольку мы рассматриваем вращение против часовой стрелки как положительное, ось, которая составляет меньший угол, будет первым столбцом в матрице вращения, а другая ось будет вторым столбцом в матрице вращения.
Матрица вращения в этом случае выглядит следующим образом:
[ [ -0.707107, -0.707107, 0],
[ 0.707107, -0.707107, 0],
[ 0, 0, 1],
]
Если вы используете функцию arctan2
, будьте осторожны при работе с особыми случаями, когда оси вращаются по часовой стрелке, а повернутые оси Y и X лежат в первом и четвертом квадранте соответственно.