GLM :: Rotate, кажется, вызывает неправильное вращение?

Проще говоря, я изучаю OpenGL и начинаю изучать матрицы преобразования. Ниже мой текущий код:

glm::vec4 myPosition(1.0f, 1.0f, 1.0f, 1.0f);

glm::vec3 rotationAxis(0.0f, 1.0f, 0.0f);

glm::mat4 scalar = glm::scale(glm::vec3(1.0f, 1.0f, 1.0f));
glm::mat4 rotator = glm::rotate(360.0f, rotationAxis);
glm::mat4 translator = glm::translate(glm::vec3(1.0f, 1.0f, 1.0f));

glm::mat4 transform = translator * rotator * scalar;

myPosition = transform * myPosition;

Насколько я могу судить, я делаю это в правильном порядке: Масштабирование -> Поворот -> Перемещение. Итак, у меня есть шкала, ничего не делающая, потому что я на самом деле не хочу, чтобы она где-либо масштабировалась (для простоты).

Затем я установил поворот на 360.0f (поправьте меня, если я ошибаюсь) по оси Y. Это должно вернуться в исходную точку, по крайней мере, я бы так подумал, вращаясь на 360 градусов вокруг единственной оси.

Затем я настроил его на перемещение на 1 единицу в каждом направлении, чтобы убедиться, что он движется.

Закончив со всем этим, я закомментировал линию ротатора, и он отлично работает, даже если я изменю масштаб. Однако всякий раз, когда я добавляю строку поворота, конечная позиция не является нормальным поворотом на 360 градусов?

Я настроил свою программу на вывод вектора положения как до преобразования, так и после него.

Предыдущая позиция (1, 1, 1)

Позиция после (1,67522, 2, -0,242607).

Я изо всех сил пытался найти свою ошибку буквально весь день, поэтому, если кто-нибудь может помочь мне найти, что я делаю неправильно, я был бы очень признателен!


person Michael Bresette    schedule 08.12.2015    source источник
comment
Также там создается вектор rotateAxis, чтобы его было легко найти и правильно прочитать. Конечный продукт просто инициализирует этот вектор в аргументах поворота.   -  person Michael Bresette    schedule 09.12.2015


Ответы (1)


Согласно документации на http://glm.g-truc.net/0.9.7/api/a00236.html (для последней версии, выпущенной на данный момент), glm::rotate(..) принимает угол, выраженный в градусах.

Однако изменение строки матрицы вращения

glm::mat4 rotator = glm::rotate(360.0f, rotationAxis);

to

glm::mat4 rotator = glm::rotate(3.141592f * 2.0f, rotationAxis);

это просто 2 * PI исправляет это.

Это означает, что угол должен быть в радианах, а не в градусах. Проверено на моей машине с GLM 0.9.7.1-1. Это либо ошибка в документации, либо в самом коде GLM.

Исходя из моего опыта работы с GLM (некоторое время назад, возможно, это была более ранняя версия), такие функции должны по умолчанию принимать угол в градусах, а макрос #define GLM_FORCE_RADIANS заставляет их рассчитывать в радианах. Возможно, автор сделал это поведением по умолчанию и забыл обновить документы.

Кстати, вам, вероятно, не следует использовать scalar в качестве имени для значения glm::mat4, поскольку скаляр в математике — это просто одно действительное число, а не матрица: https://en.wikipedia.org/wiki/Scalar_%28mathematics%29

person W. Nawrocki    schedule 08.12.2015
comment
Спасибо, я предполагаю, что вы правы. И я знаю, что соглашение об именах неверно, я просто играю с матрицами и смотрю, получаю ли я правильные результаты, поэтому я не описывал свои имена. Я собираюсь попробовать это сейчас! - person Michael Bresette; 09.12.2015
comment
Да, это сработало. Они действительно должны изменить это в документации, но это все равно. Огромное спасибо - person Michael Bresette; 09.12.2015
comment
Я потратил смущающее количество времени на эту ошибку. Теперь, когда мы знаем, что для этого нужны радианы, в GLM 9.7.1 есть функция glm::radians, которая переводит градусы в радианы. - person parker.sikand; 09.10.2016