Угол GLM Ось не так? - PullRequest
       82

Угол GLM Ось не так?

3 голосов
/ 10 октября 2019

Из тестов кватернионов в OpenGL я заметил, что вращения по нескольким осям работают не так, как должны. Поэтому я написал простую программу для отладки этого. Это моя программа:

glm::quat rotation = glm::angleAxis(glm::radians(45.0f), glm::vec3(1.0f, 1.0f, 0.0f));
glm::vec3 eulerRotation = glm::degrees(glm::eulerAngles(rotation));
printf("X = %f\tY = %f\tZ = %f\n", eulerRotation.x, eulerRotation.y, eulerRotation.z);

Из моего понимания поворотов это должно вывести:

X = 45.0  Y = 45.0  Z = 0.0

Но программа выводит это:

X = 51.589348   Y = 45.000004   Z = 18.939444

Яиспользуя GLM версии 0.9.9.5 и C ++ 14 Итак, мое понимание вращений неверно или GLM что-то напортачил?

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Представление угла оси и Углы Эйлера - это два разных способа кодирования вращения. Для вращений по каноническим осям (X, Y, Z) представления очень похожи и могут привести к ложному выводу, что преобразование тривиально. Например, Угол Оси (45,(1,0,0)) - это просто Углы Эйлера (45,0,0). Однако, для более общих осей, преобразование не всегда так очевидно.

Добавление к путанице состоит в том, что имя Euler Vector используется, когда мы создаем один трехмерный вектор из Оси- Угловое представление с использованием длины вектора для кодирования угла поворота. Например, (45,(1,0,0)) может быть закодировано как 45*(1,0,0). Однако вектор Эйлера не совпадает с вектором, содержащим углы Эйлера, по той же причине, что представление угла оси отличается от углов Эйлера.

Наконец, как указано в другом ответе Амадея, glm Framework требует, чтобы вектор входной оси был нормализован. Нормализация этого вектора даст ожидаемый результат.

2 голосов
/ 10 октября 2019

С GLM_GTC_quaternion :

glm :: angleAxis:

Построить кватернион из угла и нормализованной оси.

Параметры

  • угол Угол, выраженный в радианах, если GLM_FORCE_RADIANS определен или градусы в противном случае.

  • ось Ось кватерниона, должна быть нормализована . (акцент мой)

У вас нет нормализованной оси в вашем фрагменте

...