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

#opengl #matrix #rotation #interpolation

#opengl #матрица #вращение #интерполяция

Вопрос:

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

Ответ №1:

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

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

Ответ №2:

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

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

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

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