2012-01-08 3 views
1

키보드를 사용하여 카메라를 이동하려고합니다. 다음 I은 연신 방법에서하는 gluLookAt 함수를 호출하고 :glulookat() - 키보드로 카메라 이동 (OpenGL)

또한
gluLookAt(posx,posy,posz,lookx,looky,lookz,upx,upy,upz); 

I가, 예를 들어, 다음의 코드 축 X에 카메라의 위치를 ​​이동 :

void keyboard(unsigned char key, int x, int y) { 

switch(key) { 
    case 'w' : 

     break; 
    case 'a' : 
     posx-=1.0; 
     break; 
    case 's' : 

     break; 
    case 'd' : 
     posx+=1.0; 
     break; 

} 

} 

posx, posy, posz, lookx, looky, lookz, upx, upy, upz 변수는 전역 변수로 선언됩니다. init() 메서드뿐만 아니라 선언 할 때 두 가지 방법으로 초기화하려고 시도했지만 성공하지는 못했습니다. 이 부분을 별도로 테스트 했으므로 프로그램이 키보드 입력을 제대로 수신하더라도 카메라는 움직이지 않습니다. 내가 뭘 잘못하고 있는지 생각해?

편집 : 나는 더 나은 이해를위한 주요 코드를 제공 :

Outer_space* space; 
Light* sceneLight; 
Light* sceneLight2; 
Light* sceneLight3; 
Satelite* satelite1; 

double posx=35.0,posy=35.0,posz=35.0,lookx=0,looky=1,lookz=0,upx=0,upy=0,upz=-1; 

void init(void) { 


//random number generator 
    srand(time(NULL)); 


    space = new Outer_space(12, 12,12, new Vector3D(0.5f, 0.7f, 0.9f)); 

    sceneLight = new Light(0, 0); 
    sceneLight->setTranslation(new Vector3D(0, 20, 0)); 
    sceneLight->setConstantAttenuation(0.09f); 
    sceneLight->setLinearAttenuation(0.08f); 

    sceneLight2 = new Light(1, 0); 
    sceneLight2->setTranslation(new Vector3D(20, 0, 0)); 
    sceneLight2->setConstantAttenuation(0.09f); 
    sceneLight2->setLinearAttenuation(0.08f); 

    sceneLight3 = new Light(2, 0); 
    sceneLight3->setTranslation(new Vector3D(0, 0, 20)); 
    sceneLight3->setConstantAttenuation(0.09f); 
    sceneLight3->setLinearAttenuation(0.08f); 


    satelite1 = new Satelite(2,new Vector3D(0.2f,0.3f,0.5f)); 
    satelite1->setTranslation(new Vector3D(10,10,10)); 
    satelite1->setRotation(new Vector3D(-90, 0, 0)); 
    satelite1->setScale(new Vector3D(10, 10, 10)); 




    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glEnable(GL_DEPTH_TEST); 
    glShadeModel(GL_SMOOTH); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_NORMALIZE); 
} 


void draw(void) { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 


//gluLookAt(0,20,0, 0, 0, 0, 0, 1, 0); 
    gluLookAt(posx,posy,posz,lookx,looky,lookz,upx,upy,upz); 

    space->draw(); 
    sceneLight->draw(); 
    sceneLight2->draw(); 
    sceneLight3->draw(); 
    satelite1->draw(); 



    glPushMatrix(); 
    glRasterPos3f(-8.5, 4, -6); 



    glutSwapBuffers(); 
} 


void update(void){ 

    glutPostRedisplay(); 

} 

void resize(int w, int h) { 

    glViewport(0, 0, (GLsizei)w, (GLsizei)h); 
    GLfloat aspect = (GLfloat)w/(GLfloat)h; 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45, aspect, 1.0, 60); 
} 

void keyboard(unsigned char key, int x, int y) { 

    switch (key) 
    { 
    case 'w' : 

     break; 
    case 'a' : 
     posx-=1.0; 
     break; 
    case 's' : 

     break; 
    case 'd' : 
     posx+=1.0; 
     break; 

    } 

} 

void specialKeyboard(int key, int x, int y) { 
    switch (key) 
    { 
     case GLUT_KEY_RIGHT: 
     posx+=1; 
     break; 
    case GLUT_KEY_LEFT: 
     posx-=1; 
     break; 
    case GLUT_KEY_UP: 

     break; 

    case GLUT_KEY_DOWN: 

     break; 
    } 

} 

int main(int argc, char **argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(800, 600); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Asteroid Escape"); 

    init(); 
    glutIdleFunc(update); 
    glutDisplayFunc(draw); 
    glutReshapeFunc(resize); 
    glutKeyboardFunc(keyboard); 
    glutSpecialFunc(specialKeyboard); 
    glutMainLoop(); 

    return 0; 
} 

EDIT2 : 나는 glPushMatrix()를 주석 한

;에서 draw() 메서드를 호출하면 카메라가 움직이는 것처럼 보입니다. 설명은 무엇입니까?

+1

코드에 대한 더 많은 컨텍스트를 제공하십시오 :'posx' 변수를 어떻게 선언합니까? 어떤 문맥에서'gluLookAt'가 호출 되었습니까? – rotoglup

+0

이 기능이 다시는 아닙니다 ... 세계는이 기능이 직면하는 악용 사례없이 더 나을 것입니다. – Lalaland

+0

@rotoglup 나는 더 많은 코드로 질문을 편집했다. – biggdman

답변

1

glPushMatrix 다음에 glPopMatrix가 있어야합니다.

매트릭스 스택이 오버플로 된 것 같습니다. glGetError 결과를 확인 했습니까?

게다가, glPushMatrix에 대한 전화는 꽤 쓸모없는 것 같습니다. 무엇을 기대합니까?