Can';t使用qt opengl中的键盘命令移动相机

Can';t使用qt opengl中的键盘命令移动相机,qt,opengl,keyboard,camera,Qt,Opengl,Keyboard,Camera,我正在尝试在qt4中使用opengl实现一个游戏。到目前为止,我已经创建了足球场,现在我正在尝试实现一个摄像头,用户可以使用箭头键在世界上自由移动。我的朋友使用他在NeHe的教程中找到的一段代码,简单地复制粘贴到他的代码中,相机为他工作。当我尝试同样的方法时,只有escape按钮起作用,它只是关闭opengl小部件。f1键应该切换到全屏模式,但它只会使鼠标光标不可见,而不会切换到全屏模式。箭头键根本不起作用。由于我是opengl新手,我无法找出实现中的错误 我正在添加绘制音高的代码以及键盘事件处

我正在尝试在qt4中使用opengl实现一个游戏。到目前为止,我已经创建了足球场,现在我正在尝试实现一个摄像头,用户可以使用箭头键在世界上自由移动。我的朋友使用他在NeHe的教程中找到的一段代码,简单地复制粘贴到他的代码中,相机为他工作。当我尝试同样的方法时,只有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);
}
}
void metinalifeyyaz::paintGL(){
movePlayer();
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glLoadIdentity();
GLfloat xtrans=-xpos;
GLfloat ytrans=-walkbias-0.50f;
GLZTRANS=-zpos;
GLfloat场景度=360.0f-yrot;
glLoadIdentity();
glRotatef(查找,1.0f,0.0f,0.0f);
glRotatef(场景度,0.0f,1.0f,0.0f);
GLTRANSTEF(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());
如果(延迟==0)
延迟=1;
time=QTime::currentTime();
定时器->启动(qMax(0,10-延迟));
}
void metinalifeyyaz::movePlayer(){
如果(键控){
xpos-=sin(yrot*PI除以180)*0.5f;
zpos-=cos(yrot*PI_除以180)*0.5f;
如果(walkbiasangle>=360.0f)
walkbiasangle=0.0f;
其他的
walkbiasangle+=7.0f;
walkbias=sin(walkbiasangle*PI_除以_180)/10.0f;
}否则,如果(按键关闭){
xpos+=sin(yrot*PI除以180)*0.5f;
zpos+=cos(yrot*PI*u除以180)*0.5f;
if(walkbiasangle键()){
案例Qt::密钥_转义:
close();
打破
案例Qt::键_F1:
设置WindowsState(WindowsState()^Qt::WindowFullScreen);
打破
违约:
QGLWidget::按键事件(事件);
案例Qt::关键页面:
keyPageUp=true;
打破
案例Qt::键_向下翻页:
keyPageDown=true;
打破
案例Qt::左键:
keyLeft=true;
打破
案例Qt::键右:
keyRight=true;
打破
案例Qt::键向上:
keyUp=true;
打破
案例Qt::按键向下:
keyDown=true;
打破
}
}
void metinalifeyyaz::changeEvent(QEvent*事件){
开关(事件->类型(){
案例QEvent::WindowsStateChange:
如果(WindowsState()==Qt::WindowFullScreen)
setCursor(Qt::BlankCursor);
其他的
取消光标();
打破
违约:
打破
}
}
void metinalifeyayaz::keyReleaseEvent(QKeyEvent*事件){
开关(事件->键()){
案例Qt::关键页面:
keyPageUp=false;
打破
案例Qt::键_向下翻页:
keyPageDown=false;
打破
案例Qt::左键:
keyLeft=false;
打破
案例Qt::键右:
keyRight=false;
打破
案例Qt::键向上:
keyUp=false;
打破
案例Qt::按键向下:
keyDown=false;
打破
违约:
QGLWidget::keyReleaseEvent(事件);
}
}
我知道复制粘贴不是一种有效的方法,但我朋友的项目与我的项目没有什么不同,它对他有效。如果你知道任何可能导致同一代码在一个项目上工作而不是在另一个项目上工作的事情,请指出。当然,非常感谢对代码的任何其他评论。

看:

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,做…不管那是什么
  • OpenGL,绘制我的场景

谢谢你,伙计。在做了你所说的并从这个函数中删除+50和-130之后,调用glTranslatef(xtrans,ytrans+50,ztrans-130);它成功了。