OpenGL Rotate, Translate, Push / Pop вопрос - PullRequest
1 голос
/ 18 июня 2011

Я довольно новичок в openGL, но я боролся с тем, почему это не сработает (не пытаясь решить проблему обязательно, а просто пытаясь понять основы)

Так что в основном это рисуетсетка треугольников, которые вращаются.Я пытаюсь понять, можно ли / как удалить операции Push и Pop.Когда я вынимаю их, происходит случайное рассеяние.Я попытался изменить направление вращения после завершения рисования, переключая команды перевода и вращения.Я предполагаю, что, как я вижу, я должен быть в состоянии избежать push / pop и вместо этого использовать поворот каждый раз, чтобы увеличивать его на несколько градусов дальше, чем в прошлый раз, но я, очевидно, что-то упускаю.

Ответы [ 3 ]

2 голосов
/ 18 июня 2011

Матрицы push / pop сохраняют / восстанавливают предыдущую матрицу.Вы не можете избежать этого, потому что вы накапливаете переводы и вращения.

Помните: glTranslate не позиционирует вещи.Он строит матрицу перевода и применяет ее к текущей матрице, какой бы она ни была.Таким образом, если вы выполняете перевод, затем поворачиваете, а затем переводите, последний перевод будет находиться в повернутом пространстве, а не в том же пространстве, что и вращение.

2 голосов
/ 18 июня 2011

OpenGL хранит внутренний стек матриц преобразования.Когда вы вызываете glPushMatrix () , он толкает все матрицы вниз на одну, дублируя одну в верхней части списка.Это позволяет вам затем применять преобразования, вращения, масштабирование и т. Д. К своему сердечному контенту, и при условии, что вы вызываете glPopMatrix (), чтобы удалить вновь настроенную матрицу преобразования, когда вы закончите, остальной мир 3D не изменится вовсе.

Обратите внимание, что когда я говорю об остальном трехмерном мире, это включает в себя ваши объекты в следующий раз, когда ваш основной цикл зацикливается.Если вы не вызываете glPushMatrix (), а затем glPopMatrix (), вы постоянно преобразуете мир, и он будет (непредсказуемо) влиять на ваши объекты.

Поэтому, чтобы закончить, всегда вызывайте glPushMatrix () иglPopMatrix () в начале и конце ваших преобразований, если вы не знаете, что делаете, и не хотите влиять на остальной мир 3D.

1 голос
/ 18 июня 2011

Вам нужно поменять местами команды перевода и поворота (в обратном порядке):

glTranslatef(xF, yF, 0);
glRotatef(angle, 0.0f, 0.0f, 1.0f);                        

// draw

glRotatef(-angle, 0.0f, 0.0f, 1.0f);                        
glTranslatef(-xF, -yF, 0);

Как указывает @Nicol ниже, вероятно, будет быстрее использовать glPushMatrix / glPopMatrix, поскольку glRotatef требует построения матрицы вращения с синусами и косинусами.

Более того, поворот, за которым следует его обратное вращение, может не быть точно единицей из-за ошибок округления с плавающей запятой. Это означает, что если вы полагаетесь на эту технику во внутреннем цикле (как вы делали выше), вы можете накопить некоторые существенные ошибки с плавающей запятой в течение всего вашего вызова отрисовки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...