Вопрос

Я пытаюсь выполнить простой поворот в 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 привели к желаемому результату.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

glMatrixMode(GL_MODELVIEW);

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

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

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

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

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

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

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

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

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

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

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

http://msdn.microsoft.com/en-us/library/bb147302 (ПРОТИВ 85).aspx

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

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

  • Transform1 = Преобразование системы координат объекта в Мировую (например, вращение и масштаб объекта)
  • Преобразование 2 = Мировой системы координат в камеру (размещение объекта в нужном месте)
  • Преобразование3 = Системы координат камеры в пространство экрана (проецирование на экран)

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

Получайте удовольствие

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top