Как извлечь тональную катушку из glm :: quat и glm :: mat4 - PullRequest
0 голосов
/ 21 февраля 2020

Можно ли извлечь рыскание , шаг и крен информацию из glm::mat4? ( Это матрица преобразования мира с уже примененным переводом, вращением и масштабированием )

Вот код, с которым я экспериментирую:

    float yawDeg = 0;
    float pitchDeg = 20;
    float rollDeg = 80;

    glm::mat4 transform = glm::eulerAngleYXZ(glm::radians(yawDeg), glm::radians(pitchDeg), glm::radians(rollDeg));

    glm::quat rotation(transform); // Is this a correct way?
 // glm::quat rotation(glm::quat_cast(transform)); // Gives the same results.

    printf("pitch: %f\n", glm::degrees(glm::pitch(rotation))); // Output:   3.616443
    printf("yaw:   %f\n", glm::degrees(glm::yaw(rotation)));   // Output: -19.683496
    printf("roll:  %f\n", glm::degrees(glm::roll(rotation)));  // Output:  79.372414

Но Я получаю некоторые странные результаты, вот некоторые значения:

yawDeg=92, pitchDeg=0, rollDeg=0 результаты yaw: 88.0, pitch: 180.0, roll: 180.0

yawDeg=0, pitchDeg=92, rollDeg=0 результаты yaw: 0.0, pitch: 92.0, roll: 0.0 - выглядит нормально.

yawDeg=0, pitchDeg=0, rollDeg=92 результаты yaw: 0.0, pitch: 0.0, roll: 92.0 - Выглядит нормально.

yawDeg=0, pitchDeg=10, rollDeg=92 результаты yaw: -9.993845, pitch: -0.352578, roll: 92.030830

Я думаю, что мое преобразование glm::mat4 в glm::quat неверно?

1 Ответ

0 голосов
/ 27 февраля 2020

Причина, по которой я получил эти неожиданные значения, заключалась в том, что в определенных ракурсах 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 обратно в исходные значения, предоставленные пользователем.

...