/*

Демонстрация источника света и материалов.

Для активации управления камерой нажмите 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);


⇐ вернуться назад | | далее ⇒