OpenGL Rotation - PullRequest
       23

OpenGL Rotation

10 голосов
/ 23 августа 2008

Я пытаюсь сделать простой поворот в OpenGL, но, должно быть, упускаю суть. Я не столько ищу конкретное исправление, сколько быстрое объяснение или ссылку, которая объясняет ротацию OpenGL в целом.

На данный момент у меня есть такой код:

glPushMatrix();
  glRotatef(90.0, 0.0, 1.0, 0.0);
  glBegin(GL_TRIANGLES);        
    glVertex3f( 1.0, 1.0, 0.0 );        
    glVertex3f( 3.0, 2.0, 0.0 );        
    glVertex3f( 3.0, 1.0, 0.0 );        
  glEnd();
glPopMatrix();

Но в результате получается не повернутый на 90 градусов треугольник.

Редактировать Хм, спасибо Майку Хабустаку - похоже, мой код вызывал функцию SetCamera, которая использует glOrtho. Я слишком новичок в OpenGL, чтобы иметь какое-либо представление о том, что это значит, но отключение этого и поворот по оси Z дали желаемый результат.

Ответы [ 6 ]

6 голосов
/ 23 августа 2008

Вы получаете 1 единицу прямой? Кажется, что 90 градусов гнили. вокруг Y вы будете смотреть на треугольник без глубины.

Вы должны вместо этого попробовать вращаться вокруг оси Z и посмотреть, получите ли вы что-то, что имеет больше смысла.

OpenGL имеет две матрицы, связанные с отображением геометрии, ModelView и Projection. Оба применяются к координатам, прежде чем данные становятся видимыми на экране. Сначала применяется матрица ModelView, преобразующая данные из пространства модели в пространство просмотра. Затем применяется матрица проекции с преобразованием данных из пространства просмотра для «проецирования» на ваш 2D-монитор.

ModelView используется для позиционирования нескольких объектов на их местах в «мире», проекция используется для позиционирования объектов на экране.

Ваш код выглядит нормально, поэтому, читая документацию, я предполагаю, что вы знаете, какова природа функций, таких как glPushMatrix (). Если вращение вокруг Z по-прежнему не имеет смысла, убедитесь, что вы редактируете матрицу ModelView, вызвав glMatrixMode.

6 голосов
/ 23 августа 2008

Убедитесь, что вы модифицируете матрицу вида модели, поместив перед вызовом glRotatef следующее:

glMatrixMode(GL_MODELVIEW);

В противном случае вы можете изменить либо проекцию, либо матрицу текстуры.

5 голосов
/ 16 сентября 2008

«Принятый ответ» не совсем корректен - вращение вокруг Z не поможет вам увидеть этот треугольник, если вы не сделали некоторые странные вещи перед этим кодом. Удаление вызова glOrtho (...) могло бы исправить проблему в этом случае, но у вас все еще есть пара других проблем.

Две основные проблемы с написанным кодом:

  • Вы ранее устанавливали камеру? В OpenGL камера расположена в начале координат, смотря вниз по оси Z, с положительным Y вверх. В этом случае треугольник рисуется в той же плоскости, что и ваш глаз, но вверх и вправо. Если у вас нет очень странной проекционной матрицы, вы ее не увидите. gluLookat () - самая простая команда, чтобы сделать это, но любая команда, которая перемещает текущую матрицу (которая должна быть MODELVIEW), может быть выполнена для работы.

  • Вы рисуете треугольник в методе левой руки или по часовой стрелке, тогда как по умолчанию для OpenGL используется правая или против часовой стрелки система координат. Это означает, что, если вы отбраковываете задние грани (что, вероятно, не так, но, вероятно, вы перейдете на более продвинутый уровень), вы не увидите треугольник, как ожидалось. Чтобы увидеть проблему, поместите правую руку перед лицом и, воображая, что она находится в плоскости XY, проведите пальцами в порядке, в котором вы рисуете вершины (1,1) - (3,2) - (3,1) ). Когда вы делаете это, ваш большой палец направлен в сторону от вашего лица, что означает, что вы смотрите на обратную сторону треугольника. Вы должны привыкнуть к рисованию граней правым методом, так как это обычно делается в OpenGL.

Лучшее, что я могу порекомендовать, - это использовать учебные пособия NeHe - http://nehe.gamedev.net/. Они начинают с того, что показывают, как настроить OpenGL в нескольких системах, переходить к рисованию треугольников и медленно и уверенно переходить к более сложным темам. , За ними очень легко следовать.

1 голос
/ 15 сентября 2008

Что касается матрицы проекции, вы можете найти хороший источник для начала здесь:

http://msdn.microsoft.com/en-us/library/bb147302(VS.85).aspx

Это объясняет немного о том, как построить матрицу проекции одного типа. Ортогональная проекция является очень простой / примитивной формой такой матрицы, и в основном она берет 2 из 3 координат осей и проецирует их на экран (вы все равно можете перевернуть оси и масштабировать их, но эффект деформации или перспективы отсутствует) .

преобразование матриц, скорее всего, является одной из самых важных вещей при рендеринге в 3D и в основном включает 3 этапа матрицы:

  • Transform1 = Система координат объекта в Мире (например, вращение и масштаб объекта)
  • Transform2 = Мировая система координат для камеры (размещение объекта в нужном месте)
  • Transform3 = Система координат камеры в пространстве экрана (проецирование на экран)

Обычно результат умножения на 3 матрицы называется матрицей WorldViewProjection (если вы когда-либо сталкивались с этим термином), поскольку он преобразует координаты из пространства модели через мир, затем в камеру и, наконец, в представление экрана.

Веселись

1 голос
/ 02 сентября 2008

Я бы хотел порекомендовать книгу:

3D компьютерная графика: математическое введение с OpenGL от Samuel R. Buss

Это дает очень четкие объяснения, и математика широко применима к неграфическим областям. Вы также найдете подробное описание ортографических проекций и перспективных преобразований.

1 голос
/ 02 сентября 2008

Когда я впервые взглянул на OpenGL, учебники NeHe (см. Левое меню) были неоценимы.

...