2012-12-19 2 views
2

qt4에서 opengl을 사용하여 게임을 구현하려고합니다. 지금까지 축구 피치를 만들었고 사용자가 화살표 키를 사용하여 자유롭게 움직일 수있는 카메라를 구현하려고합니다. 제 친구는 NeHe의 튜토리얼에서 찾은 코드를 사용하여 코드에 붙여 넣기 만하면 카메라가 그를 대신했습니다. 같은 것을 시도해도 이스케이프 버튼 만 작동하고 OpenGL 위젯이 닫힙니다. f1 키는 전체 화면으로 전환해야하지만 전체 화면 모드로 전환하지 않고 마우스 커서를 보이지 않게합니다. 화살표 키가 전혀 작동하지 않습니다. OpenGL을 처음 접했을 때 구현에 무엇이 잘못되었는지 알 수 없었습니다.qt 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); 
} 
} 

는 그 복사 붙여 넣기 효율적인 방법이 아니라 내 친구의 프로젝트 내 다른 아니라는 것을 알고 그것은 그를 위해 작동합니다. 하나의 프로젝트에서 동일한 코드가 작동하고 다른 프로젝트에서는 작동하지 않을 수있는 사항을 알고 있다면이를 지적하십시오. 물론 코드에 대한 다른 의견도 많이 있습니다.

답변

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, 그게 뭐든간에.
  • OpenGL, 내 장면 그리기!
+0

감사합니다. 당신이 말한 것을하고이 함수 호출에서 +50과 -130을 삭제 한 후에 glTranslatef (xtrans, ytrans + 50, ztrans-130); 그것은 효과가 있었다. – user1432581

관련 문제