Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Используйте кватернионы (SLERP). Для интерполяции не подходят ни матрицы вращения, ни углы Эйлера.

См. 45:05 здесь (Дэвид Сакс, Google Tech Talk).

Ответ 2

Мое личное мнение заключается в том, что использование кватернионов для такого типа вещей имеет больше смысла. Тем не менее, вы можете сделать это без использования кватернионов.

Следует заметить, что "разностная" матрица, т.е. матрица, которая принимает "ориентацию" A в "ориентацию" B, может быть рассчитана на T = A.tranpose() * B (учитывая, что вы умножаетесь на правую). Когда у вас есть матрица вращения T, вы можете преобразовать в представление Axis-Angle (см., Например, http://en.wikipedia.org/wiki/Axis-angle_representation).

Наконец, поскольку вы знаете ось вращения, которая принимает от A до B, вы можете линейно интерполировать углы от нуля до угла, предварительно вычисленного из T.

Это эквивалентно использованию SLERP.