/*
Демонстрация источника света и материалов.
Для активации управления камерой нажмите ESC.
*/
GLobj cam; // камера пользователя GLobj lcam; // камера исто :ника света int linp=0; // управление позицией источника света // параметры источника света float cutoff=15; // угол рассеивания // распределение интенсивности float spotexponent=7 0 ;
// параметры цвета света float lamb[4] = (1.0, 0.35, 0.50, 1} ; float ldif[4]={0.5,0.5,0.50,1} ; float lspec[4]=(0.1,0.1,0.1,1};
// параметры материала float mamb[4]=(1.0,0.35,0.50,1}; float mdif[4]={0.5,0.5,0.50,1}; float mspec[4] = {0.1,0.1, 0.1, 1} ; float memis[4]={0.3,0.3,0.3,1} ;
float *mtmp=mamb; // вспомогательная переменная
void example_init ( ) f
gl.set(5); // настройка OpenGl // разрешаем обработку глубины glEnable(GL_DEPTH_TEST);
// разрешаем освещение и 0 источник света glEnable(GL_LIGHTING) ; glEnable(GL_LIGHT0) ;
// устанавливаем цвет света glLightfv(GL_LIGHT0,GL_AMBIENT, lamb); glLightfv(GL_LIGHT0,GL_DIFFUSE, ldif); glLightfv(GL_LIGHT0,GL_SPECULAR,lspec);
// компилируем сферу в список отображения GLUquadricObj *obj; obj=gluNewQuadric() ; glNewList(1,GL_COMPILE) ; glColor3f(1,1,1) ; glPolygonMode(GL_FRONT, GL_FILL) ; gluSphere(obj,15,30,30); glColor3f(0.9,0.9,0.9) ; glPolygonMode(GL_FRONT,GL_LINE); gluSphere(obj, 15, 30, 30) ; glEndList(); gluDeleteQuadric(obj);
}
// обработка ввода void input()
{
switch(in.vkey)
{
case VK_F1: linp=(linp)?0:1; break;
// выбираем изменяемый параметр материала case VK_F2: mtmp=mamb; break; case VK_F3: mtmp=mdif; break; case VK_F4: mtmp=mspec; break; case VK_F5: mtmp=memis; break;
// меняем цвет текущего параметра материала
case ' U': mtmp[0]+=0.1; break; case ’J’: mtmp[0]-=0.1; break; case 'I': mtmp[1]+=0.1; break; case 'K': mtmp[1]-=0.1; break; case 'O': mtmp[2]+=0.1 ; break; case 'L1: mtmp[2]-=0.1; break;
// меняем угол рассеивания case 'Y': cutoff+=l; break; case 'H': cutoff-=l; break;
// меняем распределение интенсивности case 'N': spotexponent+=4; break; case 'M': spotexponent-=4; break;
// разрешаем или запрещаем освещение case 'Z':glEnable(GL_LIGHTING);break; case 'XglDisable(GL_LIGHTING) ; break; default:;
}
// корректируем данные minmax(mtmp[0],0.0,1.0); minmax(mtmp[1],0.0,1.0); minmax(mtmp[2],0.0,1.0); minmax(cutoff,0.0,90.0); minmax(spotexponent,0.0,128.0);
// управление камерой или источником света if(linp)lcam.input(&in); else cam.input(&in); in.vkey=-l;
>
void example_deinit() f
glDeleteLists(l,1); gl.deinit();
}
void draw() // вывод сцены
f
glLoadldentity();
glClear(GL_C0L0R_BU FFE R_BIT|GL_DEPTH_BUFFER_BIT); input ();
cam.transform();
lcam.lightpos(); // позиционируем источник света // конфигурируем источник света glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,cutoff); glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,spotexponent); // устанавливаем свойства материала glMaterialfv(GL_FRONT,GL_AMBIENT,mamb); glMaterialfv(GL_FRONT,GL_DIFFUSE,mdif); glMaterialfv(GL_FRONT,GL_SPECULAR,mspec); glMaterialfv(GL_FRONT,GL_EMISSION,memis);
// выводим источник света без освещения // сохраняем настройки освещения glPushAttrib(GL_LIGHTING_BIT);