Проблема методов обратного вызова GLUT - PullRequest
0 голосов
/ 12 ноября 2011

Я пытаюсь реализовать сцену, управляемую камерой, используя код камеры из: http://www.swiftless.com/tutorials/opengl/camera2.html

И код ландшафта из книги, которая случайным образом генерирует ландшафт. Используя код, как показано ниже, элементы управления мышью и ландшафт работают, НО ландшафт продолжает случайным образом генерировать ВСЕ время. Я подозреваю, что это связано с IdleFunc, но если я возьму эту строку из main (), мышь перестает работать.

Как я могу отделить камеру и землю для самостоятельной работы?

 void display() 
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();

        camera();
        landscape.draw();

        glutSwapBuffers();
    }

в основном:

// callback methods
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(display);
glutPassiveMotionFunc(mouseMovement);

land.cpp:

void land::draw(void)
{
   int i;
   size = 1;
   for (i=1;i<=numlevels;i++) size = size * 2;
   for (i=0;i<=size;i++) cd[i] = (GLfloat)i/(GLfloat)size;
   twotopowerh = exp(log(2.0)*hvalue);
   cvalue = 1.0*sqrt(1.0 - twotopowerh*twotopowerh/4.0);
   if (!sea) {
       calcheights();
       makesmooth();
   }
   drawmesh();
   drawsides();
   if (sea) {
       drawsea();
       sea = 0;
   }
}

1 Ответ

2 голосов
/ 12 ноября 2011

Действительно, этот код рисования ландшафта восстанавливает геометрию каждый раз, когда он вызывается. Весь этот код в land :: draw, кроме drawmesh (), drawsides () и drawsea (), должен быть помещен в конструктор или инициализатор. Из функции рисования должны выполняться только вызовы рисования.


Редактировать: модификация предоставленного кода

land.hpp

class land : …
{
// ...
public:
    void generate(void);
// ...
}

land.cpp

void land::generate(void)
{
   int i;
   size = 1;
   for (i=1;i<=numlevels;i++) size = size * 2;
   for (i=0;i<=size;i++) cd[i] = (GLfloat)i/(GLfloat)size;
   twotopowerh = exp(log(2.0)*hvalue);
   cvalue = 1.0*sqrt(1.0 - twotopowerh*twotopowerh/4.0);
   if (!sea) {
       calcheights();
       makesmooth();
   }
}

void land::draw(void)
{
   drawmesh();
   drawsides();
   if (sea) {
       drawsea();
       sea = 0;
   }
}

In Main

glutDisplayFunc(display);
glutReshapeFunc(reshape);

// better just issue a redisplay, allows for smoother input event processing
glutIdleFunc(glutPostRedisplay);

glutPassiveMotionFunc(mouseMovement);

landscape.generate();

// ...

glutMainLoop();
...