Ответ 1
Используйте кватернионы (SLERP). Для интерполяции не подходят ни матрицы вращения, ни углы Эйлера.
См. 45:05 здесь (Дэвид Сакс, Google Tech Talk).
У меня есть 2 матрицы вращения (давайте назовем их A и B), где:
A = 1 0 0
0 0 -1
0 1 0
и
B = -1 0 0
0 0 -1
0 -1 0
Это в основном просто поворот, где камера вращается вокруг, чтобы заглянуть за себя. Очевидно, я не могу просто интерполировать значения в матрицах напрямую, потому что это выглядит странно. Я попытался преобразовать матрицы в углы Эйлера, которые дают 2 набора углов X, Y, Z и пытаются определить, какие углы использовать на основе минимального расстояния между каждым компонентом угла X, Y, Z. Это определенно приводит к типу вращения, который я хочу, но я не могу придумать подходящий способ определить, какие углы интерполировать между ними, потому что иногда наборы углов, которые приводят к наименьшей ошибке, приводят к вращению вокруг неправильной оси/осей. Я также пробовал кватернионы, но это по сути дало мне тот же результат. Может ли кто-нибудь указать мне в правильном направлении?
Используйте кватернионы (SLERP). Для интерполяции не подходят ни матрицы вращения, ни углы Эйлера.
См. 45:05 здесь (Дэвид Сакс, Google Tech Talk).
Мое личное мнение заключается в том, что использование кватернионов для такого типа вещей имеет больше смысла. Тем не менее, вы можете сделать это без использования кватернионов.
Следует заметить, что "разностная" матрица, т.е. матрица, которая принимает "ориентацию" A
в "ориентацию" B
, может быть рассчитана на T = A.tranpose() * B
(учитывая, что вы умножаетесь на правую). Когда у вас есть матрица вращения T
, вы можете преобразовать в представление Axis-Angle (см., Например, http://en.wikipedia.org/wiki/Axis-angle_representation).
Наконец, поскольку вы знаете ось вращения, которая принимает от A
до B
, вы можете линейно интерполировать углы от нуля до угла, предварительно вычисленного из T
.
Это эквивалентно использованию SLERP.