Основы OpenGL

         

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


За основу данного проекта мы возьмем программу из упражнения "Список трехмерный фигур". Далее все примерно также, как и в в предыдущем пункте. Здесь нам потребуется три переменных 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);

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



Содержание раздела