Причина, по которой я получил эти неожиданные значения, заключалась в том, что в определенных ракурсах GLM внутренне применяет свои собственные ракурсы. Т.е. для:
Ввод yawDeg=60, pitchDeg=0, rollDeg=0
получим yaw: 60.0, pitch: 0.0, roll: 0.0
- как положено .
И для:
Ввод yawDeg=92, pitchDeg=0, rollDeg=0
мы получим yaw: 88.0, pitch: 180.0, roll: 180.0
- изменено !
Если вы посмотрите визуально на 3D-объект с этими преобразованиями - все повороты должны выглядит хорошо, даже если GLM изменил значения внутри.
Еще одна вещь, которую я заметил, это то, что углы Эйлера, возвращаемые GLM, всегда находятся в диапазоне -180, 180 градусов для всех осей.
Относительно преобразования glm::mat4
в glm::quat
, Я делал все ~ хорошо. Здесь важно отметить, что , если вы используете масштабирование в матрице преобразования, вам нужно нормализовать кватернион!
glm::quat rotation = glm::normalize(glm::quat_cast(matrix));
Еще одна вещь, которую я обнаружил, заключалась в том, что GLM имеет функция называется glm::extractEulerAngleXYZ
. Поэтому, если вы просто хотите извлечь углы Эйлера из матрицы преобразования, вам на самом деле не нужно выполнять какое-либо преобразование в кватернион.
Я все еще не полностью удовлетворен, потому что я не нашел никакого способа преобразовать значения угла Эйлера GLM обратно в исходные значения, предоставленные пользователем.