Вращение OpenGL

Я пытаюсь сделать простое вращение в 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 градусов.

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

Ответ 1

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

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

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

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

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

Ответ 2

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

glMatrixMode(GL_MODELVIEW);

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

Ответ 3

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

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

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

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

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

Ответ 4

Когда я впервые посмотрел OpenGL, NeHe tutorials (см. левое меню) были неоценимы.

Ответ 5

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

3D-компьютерная графика: математическое введение с OpenGL Самуэлем Р. Бусом

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

Ответ 6

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

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

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

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

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

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

Удачи