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);
Исходный файл смотрите здесь.
Исполняемый файл здесь.
|