Основы OpenGL

         

Управление лампами


Для управления лампами нам понадобится определить функции-обработчики стрелок: вверх, вниз, влево, вправо. Здесь все точно также как и в предыдущем пункте за исключением того, что управлять положением лампы гораздо удобнее в полярных координатах нежели в декартовых. Точка А в полярных координатах задается следующим образом, бэта - угол отклонения вектора ОВ в плоскости XZ, альфа - угол между вектором ОА и плоскостью XZ и третий параметр радиус - длина вектора.

Стрелки влево, вправо будут управлять углом бэта, а стрелки вверх, вниз - углом альфа. Соответственно, лампа будет перемещаться по сфере. Радиус мы изменять не будем. Для изменения положения лампы, нам понадобится выполнить следующие действия:

  • получить текущие координаты лампы
  • преобразовать их в полярные
  • в полярных координатах изменить соответствующий угол
  • преобразовать координаты из полярных в нормальные
  • установить новое положение лампы

За основу мы возьмем программу с тремя источниками света направленными на сферу из главы "Освещение". Создайте новый проект и скопируйте в него файл lamps.c. Объявите функции-обработчики и отредактируйте соответствующим образом функцию main.

auxKeyFunc(AUX_LEFT, Key_LEFT); auxKeyFunc(AUX_RIGHT, Key_RIGHT); auxKeyFunc(AUX_UP, Key_UP); auxKeyFunc(AUX_DOWN, Key_DOWN);

Код функции Key_LEFT будет следующим:

void CALLBACK Key_LEFT(void) { float nor[4]; float pol[3]; // получаем текущие координаты лампы glGetLightfv(GL_LIGHT3, GL_POSITION, nor); // конвертируем их в полярные Normal2Polar(nor[0], nor[1], nor[2], pol); // уменьшаем угол бэта на величину дельта pol[1] -= delta; // конвертируем обратно в нормальные координаты Polar2Normal(pol[0], pol[1], pol[2], nor); // устанавливаем новое положение лампы glLightfv(GL_LIGHT3, GL_POSITION, nor); }

После включение заголовочных файлов объявите две константы:

#define M_PI 3.14159265358979323846 float delta=0.1;

Функции перевода из одной системы координат в другую:

void Polar2Normal(float a, float b, float r, float nor[3]) { nor[0] = r*cos(a)*cos(b); nor[1] = r*sin(a); nor[2] = -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]; }



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