2012-01-08 19 views
1

キーボードを使用してカメラを移動しようとしています。次のように私は、drawメソッドでglulookat関数を呼び出しています:glulookat() - キーボードでカメラを移動する(OpenGL)

また
gluLookAt(posx,posy,posz,lookx,looky,lookz,upx,upy,upz); 

私は例えば、次のコードを軸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、posx、lookx、looky、lookz、upx、upy、upz変数はグローバルなdouble変数として宣言されます。私はinit()メソッドと同様、宣言するときにも、成功することなく、2つの方法で初期化しようとしました。カメラが動いていませんが、私は別にこのアスペクトをテストしたので、プログラムはキーボード入力を正しく受け取ります。私が間違っていることのアイデアは?

EDIT:私はより良い理解のためにメインコードを提供し:

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へのjour呼び出しは、このようにかなり役に立たないようです。何をするには期待していますか?

関連する問題