glulookat () - перемещать камеру с помощью клавиатуры (OpenGL) - PullRequest
1 голос
/ 09 января 2012

Я пытаюсь переместить камеру с помощью клавиатуры.Я вызываю функцию glulookat в методе draw следующим образом:

 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, 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 Ответ

1 голос
/ 09 января 2012

За glPushMatrix должно следовать glPopMatrix.

Похоже, вы переполнили стек матрицы, вы проверили результат glGetError?

Кроме того, вызов из glPushMatrix в журнале выглядит довольно бесполезным, что вы ожидаете от него?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...