Я надеюсь, что вы знакомы с математикой GL ( GLM ), потому что у меня есть проблема, я не могу сломать:
У меня есть набор углов Эйлера, и мне нужно выполнить плавную интерполяцию между ними. Лучший способ - преобразовать их в кватернионы и применить алгоритм SLERP.
У меня вопрос, как инициализировать glm :: quaternion с помощью углов Эйлера, пожалуйста?
Я читаю документацию GLM снова и снова, но не могу найти уместного Quaternion constructor signature
, что бы взять три угла Эйлера. Самым близким, который я нашел, является
функция angleAxis () , принимающая значение угла и ось для этого угла. Обратите внимание, что я ищу способ, как разобрать RotX, RotY, RotZ
.
К вашему сведению, это подпись функции metNioned angleAxis () :
detail::tquat< valType > angleAxis (valType const &angle, valType const &x, valType const &y, valType const &z)
operator *
умножение кватернионов, поэтому, возможно, мне придется выполнять умножение вручную .Где
angle
находитсяglm::vec3
вмещающий шаг, рыскание, крен соответственно.PS. Если есть сомнения, просто зайдите в заголовки и посмотрите. Определение можно найти в glm / gtc / quaternion.hpp:
Для чего
quat
используется тип floattquat
?источник
Решение в википедии: http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
используя это:
Конструкторы для кватерниона, заданные Эйлером (где применение вращения XYZ или ZYX). Однако это только две из шести возможных комбинаций углов Эйлера. Вам действительно нужно выяснить, в каком порядке построены углы Эйлера при преобразовании в матрицу преобразования. Только тогда можно определить решение.
В старой компании, в которой я работал, у нас был Z вперед (как у большинства видеокарт), поэтому заказ приложений был ZYX, а в моей нынешней компании ось Y направлена вперед, а Z вверх, поэтому наш заказ приложений - YZX. Этот порядок - порядок, в котором вы умножаете свои кватернионы вместе, чтобы сгенерировать ваше окончательное преобразование, и порядок вращений имеет значение, если умножения не являются коммутативными.
источник
Угол должен быть в радианах!
источник