Не удается переместить камеру с помощью команд клавиатуры в qt opengl



Я пытаюсь реализовать игру с использованием opengl в qt4. До сих пор я создал футбольное поле, и теперь я пытаюсь реализовать камеру, с помощью которой пользователь может свободно перемещаться по миру, используя клавиши со стрелками. Мой друг использовал фрагмент кода, который он нашел в учебниках Нехе, и просто скопировал его в свой код, и камера работала на него. Когда я попробовал то же самое, работает только кнопка escape, и она просто закрывает виджет opengl. клавиша f1 должна переключаться на полноэкранный режим, но она просто делает курсор мыши невидим без перехода в полноэкранный режим. Клавиши со стрелками не работают вообще. Поскольку я новичок в opengl, я не мог понять, что не так с реализацией.



Я добавляю код, в котором я рисую шаг, а также обработчики событий клавиатуры.



void metinalifeyyaz::paintGL(){

movePlayer();

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

GLfloat xtrans = -xpos;
GLfloat ytrans = -walkbias - 0.50f;
GLfloat ztrans = -zpos;
GLfloat sceneroty = 360.0f - yrot;

glLoadIdentity();
glRotatef(lookupdown, 1.0f, 0.0f, 0.0f);
glRotatef(sceneroty, 0.0f, 1.0f, 0.0f);
glTranslatef(xtrans, ytrans+50, ztrans-130);

glLoadIdentity();
glTranslatef(1.0f,0.0f,-18.0f);
glRotatef(45,1,0,0);
drawScene();

int delay = time.msecsTo(QTime::currentTime());
if (delay == 0)
delay = 1;
time = QTime::currentTime();
timer->start(qMax(0,10 - delay));

}


void metinalifeyyaz::movePlayer() {

if (keyUp) {
xpos -= sin(yrot * PI_OVER_180) * 0.5f;
zpos -= cos(yrot * PI_OVER_180) * 0.5f;
if (walkbiasangle >= 360.0f)
walkbiasangle = 0.0f;
else
walkbiasangle += 7.0f;
walkbias = sin(walkbiasangle * PI_OVER_180) / 10.0f;
} else if (keyDown) {
xpos += sin(yrot * PI_OVER_180)*0.5f;
zpos += cos(yrot * PI_OVER_180)*0.5f ;
if (walkbiasangle <= 7.0f)
walkbiasangle = 360.0f;
else
walkbiasangle -= 7.0f;
walkbias = sin(walkbiasangle * PI_OVER_180) / 10.0f;
}

if (keyLeft)
yrot += 0.5f;
else if (keyRight)
yrot -= 0.5f;

if (keyPageUp)
lookupdown -= 0.5;
else if (keyPageDown)
lookupdown += 0.5;
}


void metinalifeyyaz::keyPressEvent(QKeyEvent *event) {

switch (event->key()) {
case Qt::Key_Escape:
close();
break;
case Qt::Key_F1:
setWindowState(windowState() ^ Qt::WindowFullScreen);
break;
default:
QGLWidget::keyPressEvent(event);
case Qt::Key_PageUp:
keyPageUp = true;
break;
case Qt::Key_PageDown:
keyPageDown = true;
break;
case Qt::Key_Left:
keyLeft = true;
break;
case Qt::Key_Right:
keyRight = true;
break;
case Qt::Key_Up:
keyUp = true;
break;
case Qt::Key_Down:
keyDown = true;
break;

}
}

void metinalifeyyaz::changeEvent(QEvent *event) {

switch (event->type()) {
case QEvent::WindowStateChange:

if (windowState() == Qt::WindowFullScreen)
setCursor(Qt::BlankCursor);
else
unsetCursor();
break;
default:
break;
}
}
void metinalifeyyaz::keyReleaseEvent(QKeyEvent *event) {

switch (event->key()) {
case Qt::Key_PageUp:
keyPageUp = false;
break;
case Qt::Key_PageDown:
keyPageDown = false;
break;
case Qt::Key_Left:
keyLeft = false;
break;
case Qt::Key_Right:
keyRight = false;
break;
case Qt::Key_Up:
keyUp = false;
break;
case Qt::Key_Down:
keyDown = false;
break;
default:
QGLWidget::keyReleaseEvent(event);
}
}


Я знаю, что копипаст не является эффективным методом, но проект моего друга ничем не отличается от моего, и он работает для него. Если вы знаете что-нибудь, что может привести к тому, что один и тот же код будет работать над одним проектом, а не другой, пожалуйста, укажи на это. Конечно, любые другие комментарии о коде очень ценятся.
595   1  

1 ответ:

Смотрите:

glLoadIdentity();
glRotatef(lookupdown, 1.0f, 0.0f, 0.0f);
glRotatef(sceneroty, 0.0f, 1.0f, 0.0f);
glTranslatef(xtrans, ytrans+50, ztrans-130);

glLoadIdentity(); // get rid of this!
glTranslatef(1.0f,0.0f,-18.0f);
glRotatef(45,1,0,0);
drawScene();

"glLoadIdentity" сбрасывает текущую матрицу. В коде вы поворачиваете и переводите матрицу, но затем сбрасываете матрицу, вызывая "glLoadIdentity", поэтому предыдущие преобразования матрицы ничего не делают.

В основном это ваш код:

  • OpenGL, сбросьте матрицу.
  • OpenGL, переместите плеер и камеру.
  • OpenGL, сбросьте матрицу и забудьте все, что я только что сделал.
  • OpenGL, do... что бы там ни было является.
  • Опенгл, нарисуй мою сцену!

Comments

    Ничего не найдено.