Сведения о вопросе

Fedya

21:07, 28th August, 2020

Теги

c++   opengl   glut    

OpenGL вращение

Просмотров: 454   Ответов: 6

Я пытаюсь сделать простое вращение в 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 Hmm спасибо майку Хабустаку-оказалось, что мой код вызывал функцию SetCamera, которая использует glOrtho. Я слишком новичок в OpenGL, чтобы иметь какое-либо представление о том, что это означало, но отключение этого и вращение по оси Z дали желаемый результат.



  Сведения об ответе

fo_I_K

21:06, 5th August, 2020

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

glMatrixMode(GL_MODELVIEW);

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


  Сведения об ответе

lool

11:03, 20th August, 2020

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

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

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

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

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


  Сведения об ответе

pumpa

18:41, 16th August, 2020

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

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

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

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

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


  Сведения об ответе

darknet

21:55, 26th August, 2020

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


  Сведения об ответе

pumpa

17:23, 11th August, 2020

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

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

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


  Сведения об ответе

ASSembler

18:31, 20th August, 2020

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

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

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

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

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

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

Повеселись


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться