Chapter 8
Примеры интересных программ

8.4  Управление камерой

     За основу данного проекта мы возьмем программу из упражнения "Список трехмерный фигур". Далее, все примерно так же, как и в предыдущем пункте. Здесь нам потребуются три переменных x,y,z типа float для хранения текущего положения камеры, им также присвоим начальное значение (0,0,5). В функциях-обработчиках стрелок клавиатуры мы будем вызывать функцию resize с размерами окна 400х400, эти размеры мы установили в функции main. Соответственно, надо модифицировать код функции resize так, чтобы она устанавливала камеру в точку с координатами x,y,z.


#define M_PI        3.14159265358979323846


float delta=0.1;
float x=0,y=0,z=5;


void CALLBACK resize(int width,int height)
{
   glViewport(0,0,width,height);
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho(-5,5, -5,5, 2,12);
   gluLookAt( x,y,z, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW ); }

     Теперь модифицируйте немного функцию перевода из полярных в обычные координаты. Это связано с тем, что в нее удобнее передавать не массив из трех переменных, а указатели на эти переменные. Указатели передаются затем, чтобы функция смогла сохранить значение в эти переменные.

void Polar2Normal(float a, float b, float r,
				  float* x, float* y, float* z)
{ *x = r*cos(a)*cos(b); *y = r*sin(a); *z = -r*cos(a)*sin(b); }
Функцию перевода из нормальных координат в полярные оставляем без изменений.
void Normal2Polar(float x, float y, float z, float pol[3])
{
pol[2] = sqrt(x*x+y*y+z*z);
pol[0] = asin(y/pol[2]);
pol[1] = acos(x/sqrt(x*x+z*z));
if(z>0)
 pol[1] = 2*M_PI - pol[1];
}
Далее функции-обработчики кнопок.
void CALLBACK Key_LEFT(void)
{
float pol[3];

  Normal2Polar(x, y, z, pol);
  pol[1] -= delta;
  Polar2Normal(pol[0], pol[1], pol[2], &x, &y, &z);
  resize(400,400);
}

void CALLBACK Key_RIGHT(void)
{
float pol[3];

  Normal2Polar(x, y, z, pol);
  pol[1] += delta;
  Polar2Normal(pol[0], pol[1], pol[2], &x, &y, &z);
  resize(400,400);
}

void CALLBACK Key_DOWN(void)
{
float pol[3];

  Normal2Polar(x, y, z, pol);
  pol[0] -= delta;
  Polar2Normal(pol[0], pol[1], pol[2], &x, &y, &z);
  resize(400,400);
}

void CALLBACK Key_UP(void)
{
float pol[3];

  Normal2Polar(x, y, z, pol);
  pol[0] += delta;
  Polar2Normal(pol[0], pol[1], pol[2], &x, &y, &z);
  resize(400,400);
}
Не забудьте добавить в функцию main.
    auxKeyFunc(AUX_LEFT, Key_LEFT);
    auxKeyFunc(AUX_RIGHT, Key_RIGHT);
    auxKeyFunc(AUX_UP, Key_UP);
    auxKeyFunc(AUX_DOWN, Key_DOWN);

Исходный файл смотрите здесь. Исполняемый файл здесь.