2008-08-23 4 views
10

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

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

ответ

6

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

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

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

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

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

+0

ВАЖНО! См. Также ответ Перри ниже. – Ali 2011-01-07 20:46:43

6

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

glMatrixMode(GL_MODELVIEW); 

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

1

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

1

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

3D Computer Graphics : A Mathematical Introduction with OpenGL Сэмюэлем Р. Buss

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

1

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

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

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

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

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

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

Веселитесь

5

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

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

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

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

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

Смежные вопросы