Не могу двигаться вперед с камерой в OpenGL - PullRequest
0 голосов
/ 16 июля 2011

Я экспериментирую с pyOpenGL, и у меня были проблемы с настройкой камеры для правильной работы.

def Draw():

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
     glMatrixMode(GL_MODELVIEW)
     glLoadIdentity()

     glRotatef(roty,1,0,0)
     glRotatef(rotx,0,1,0)
     glTranslate(0,0,eyez)

     glPushMatrix()

     glTranslate(0,0,-80)

     glBegin(GL_QUADS)
     glColor(0,1,0)
     glVertex3f(-50,-5,10)
     glVertex3f(-50,50,10)
     glVertex3f(50,50,10)
     glVertex3f(50,-5,10)

     glColor(1,0,0)
     glVertex3f(-50,-5,10)
     glVertex3f(-50,50,10)
     glVertex3f(-50,50,70)
     glVertex3f(-50,-5,70)
     glEnd()

     glPopMatrix()

     glutSwapBuffers()

Эти повороты работают великолепно, но я не могу двигаться вперед в направлении камеры.,Когда я изменил код, чтобы иметь возможность двигаться вперед таким образом, сцена не будет вращаться правильно.Что произойдет, так это то, что сцена будет вращаться по кругу, если я отступлю достаточно далеко.

Ответы [ 3 ]

5 голосов
/ 16 июля 2011

Если вы пишете приложение, которое имеет концепцию камеры , движущейся (и, наверное, тоже вращающейся), то вместо того, чтобы работать с объектом с glRotate и glTranslate, рассмотрите возможность gluLookAt, который позволяет вам, так сказать, настраивать изображение с камеры.

Кстати, gluLookAt устарела, хотя некоторые люди говорили, что "очень по ней скучают". Если вы хотите держаться подальше от этой устаревшей служебной функции, см. источник этой функции и разверните свою собственную матрицу на ЦП.

2 голосов
/ 16 июля 2011

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

Как только у вас есть единичный вектор, указывающий в направлении стороны камеры, это легко.Просто умножьте это на то, как далеко в этом направлении вы хотите переместиться, и добавьте его в текущее положение камеры.

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

0 голосов
/ 17 июля 2011

Хотя я больше привык программировать на JOGL, чем любая другая привязка OpenGL, я предлагаю вам следующую контрольную точку:

*) Вы задали правильную функцию (для меня это изменение JOGL GLEventListener (int x, int y, int width, int height)), область просмотра и область усечения?

=> Для области просмотра (область рамки, используемая для рисования OpenGL), вы обычно просто вызываете glViewport (x, y, width, height) => выделение всей вашей зоны Canvas для ваших чертежей GL

=> Для усеченной области (поля зрения камеры) сначала необходимо переключиться на матрицу проекции (glMatrixMode (GL_PROJECTION)), затем установите усеченный конус, затем переключитесь обратно на матрицу GL_MODELVIEW, чтобы подготовиться к вашим чертежам.Я предлагаю вам, чтобы определить усеченную фигуру, вызвать gluPerspective (45, (float) ширина / высота, 0,001f, 1000f).45 для 45 градусов половинного угла, ширину / высоту для определения соотношения экрана, 0,001f для задания ближней усеченной плоскости на 0,001f от вашего глаза (или экрана), 1000f для отдаленной усеченной плоскости 1000f от вашего глаза.

*) Думали ли вы использовать в своей функции рисования вызов gluLookAt, как вам подсказывает Рэй Тоал?Я предлагаю вам вызвать gluLookAt (

0,0,1, // Камера установлена ​​на (0,0,1), чтобы она увидела точку 0,0,0

0,0,0, // камера стремится к (0,0,0)

0,1,0) // камера имеет (0,1,0) для своего восходящего вектора (так,Ой - это вектор роста ... логика)

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...