Интерполяция между матрицами вращения

У меня есть 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. Это определенно приводит к тому типу вращения, который мне нужен, но я не могу придумать достойного способа определить, какие углы интерполировать между ними, потому что иногда наборы углов, которые приводят к наименьшей ошибке, приводят к повороту вокруг неправильной оси / осей. Я также пробовал кватернионы, но это, по сути, дало мне тот же результат. Может кто-то указать мне верное направление?

2 ответа

Решение

Используйте кватернионы (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.

Другие вопросы по тегам