Вопрос: OpenGL glRotatef


В чем разница между

glRotatef(angle, 1.0f, 0.0f, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);

а также

glRotatef(angle, 1.0f, 0.0f, 1.0f);

И почему ничего не меняется, когда я меняю второй параметр 1.0f на 5.0f? Наконец, как я могу вращать объект вокруг x = 5, а не вокруг x = 0?


5


источник


Ответы:


Если вы хотите повернуть вокруг x=5 вы должны сделать glTranslate в x=5 и независимо от вашей координаты y, а затем выполните glRotate тогда glTranslate обратно в начало.

Так что-то вроде

glTranslate(5, 0, 0);
glRotatef(...);
glTranslate(-5, 0, 0);

Для первого вопроса я включаю ответ @ genpfault для полноты. Это обусловлено векторной нормировкой, выполняемой glRotatef() на вектор, который вы проходите.


6



И почему ничего не меняется, когда я меняю второй параметр 1.0f на 5.0f?

Вектор, который вы проходите glRotatef() нормализуется перед использованием.


3



Вы не можете просто суммировать вращения путем добавления осей вместе, это не приводит к такому же результату, что и конкатенированное преобразование. Если бы это было так, это предполагало бы, что преобразования являются коммутативными, что явно не так.

Возьмите объект и поверните его на 90 градусов вокруг оси Y, а затем на 90 градусов вокруг оси X. Посмотрите, как он ориентирован. Теперь верните исходное положение и поверните его на 90 градусов по X, затем на 90 градусов в Y. Обратите внимание, что ориентация отличается.

Хотя можно найти поворот, который даст тот же результат, что и любой из заказов, это не то же самое, что сумма.

Ничто не меняется, если вы меняете другие параметры (при условии, что вы масштабируете их равномерно), когда ось вращения нормализована.


1