Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
Скачать 0.66 Mb.
|
float mat_diffl [] = {0.8 ,0.8 ,0.8}; float mat_difi2[] = {0.0 ,0.0 ,0.9}; float mat_amb[]= {0.2,0.2,0.2}; float mat_spec [] = {0.6 ,0.6 ,0.6} ; float shininess =0.7 * 128, CurAng=0, RingRad = l, RingH eight =0.1; GLUquadricObj* QuadrObj ; GLuint Texld ; GLfloat TetrVertex [4][3] , TetrNormal [4] [3] ; // Вычисление, нормали к плоскости, // задаваемой точками а ,Ь , с void get norm (float a [3] , float b [3] , float c[3], float *n) { float mult=0; n[0] = (b[l]-a[l])*(c[2]-a[2])-(b[2]-a[2]) * (с[1]-а[1]); n[l] = (c[0]-a[0])*(b[2]-a[2])-(b[0]-a[0]) * (с[2]-а[2]); n[2] = (b[0]-a[0])*(c[l]-a[l])-(c[0]-a[0]) * (b[l]-a[l]); // Определение нужного направления нормали: // от точки (0,0,0) for (i=0;i <3;i++) mult+=a [ i ] *n [ i ] ; if (mult<0) for (j=0;j<3;j++) n[j]=-n[j ]; } // Вычисление координат вершин тетраэдра void InitVertexTetr () { float alpha = 0; int i ; TetrVertex[0][0]=0; TetrVertex[0][l] = 1.3; TetrVertex [0] [2] =0; // Вычисление координат основания тетраэдра for (i=l;i<4;i++) { TetrVertex [i][0] = 0.94* cos (alpha); TetrVertex[i][l] = 0; Tetr Vertex [i][2] = 0.94* sin (alpha); alpha+ = 120.0*3.14/180.0; } } // Вычисление нормалей сторон тетраэдра void InitNormsTetr () { getnorm ( TetrVertex [0] , TetrVertex [ 1] , 188 Приложение Б. Демонстрационные программы TetrVertex [2] , TetrNormal [0]) ; getnorm ( TetrVertex [0] , TetrVertex [2] , TetrVertex [3] , TetrNormal [ 1 ]) ; getnorm (TetrVertex [0] , TetrVertex [3] , TetrVertex [1] , TetrNormal [2]) ; getnorm ( TetrVertex [ 1] , TetrVertex [2] , TetrVertex [3] , TetrNormal [3]) ; // Создание списка построения тетраэдра void MakeTetrList () { _ int i ; gINewList (TETR _LIST,GL_COMPILE) ; // Задание сторон тетраэдра g 1В e g i n (GL_TRIANGLES); for (i=l;i <4;i++) { glNormal3fv (TetrNormal [i -1]); glVertex3fv (TetrVertex [0]) ; glVertex3fv( TetrVertex [i ]) ; if (i! = 3) glVertex3fv( TetrVertex [ i +1]); else glVertex3fv( TetrVertex [1]) ; } glNormal3fv( TetrNormal [3]) ; glVertex3fv( TetrVertex [1]) ; glVertex3fv (TetrVertex [2]) ; glVertex3fv (TetrVertex [3]) ; glEnd(); glEndList () ; } void DrawRing() { // Построение цилиндра (кольца), расположенного Б.4- Пример 3: Текстурирование и анимация 189 // параллельно оси z // Второй и третий параметры задают // радиусы оснований, четвертый высоту, // последние два—число разбиений вокруг и // вдоль оси z. При этом дальнее основание // цилиндра находится в плоскости z=Q gluCylinder (QuadrObj , RingRad , RingRad , RingHeight ,30 ,2); } void Texturelnit () { char st rFile [] = " texture .bmp" ; IMAGE img; // Выравнивание в * .bmp no байту glPixelStorei (GLJJNPACK_ ALIGNMENT, 1); // Создание идентификатора для текстуры glGenTextures (1 ,&TexId ); // Загрузка изображения в память if (!LoadBMP(strFile , &img)) return ; ; // Начало описания свойств текстуры glBindTexture (GL_TEXTURE_2D, Texld ) ; // Создание уровней детализации и инициализация // текстуры gluBuild2DMipmaps(GL_TEXTURE_2D,3 , img. width, img. height, GL_RGB, GL_UNSIGNED_BYTE, img . d at a ); // Разрешение наложения этой текстуры на // quadric—объекты gluQuadricTexture (QuadrObj , GLJTRUE); // Задание, параметров текстуры // Повтор изображения по параметрическим 190 Приложение Б. Демонстрационные программы // осям s и t glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // He использовать интерполяцию при выборе точки // на текстуре glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MN_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FIJTER1 GL_NEAREST); // Совмещать текстуру и материал объекта glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODlIATE); } void Init(void) { InitVertexTetr () ; InitNormsTetr () ; MakeTetrList () ; // Определение свойств материала glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, mat_amb) ; glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, mat_spec) ; glMaterialf (GL_FRONT, GL_SHININESS, shininess); // Определение свойств освещения glLightfv(GL_LIGHTO, GL_DIFFUSE, light_col); glEnable (GL_LIGIfflNG); glEnable (GL_LIGHT0); Б.4- Пример 3: Текстурирование и анимация 191 // Проводить удаление невидимых линий и // поверхностей glEnable (GL_DEPTH_TEST); // Проводить нормирование нормалей glEnable (GL_NORMALEZE) ; // Материалы объектов отличаются только цветом // диффузного отражения glEnable (GL_COLOR_MATERIAL); glColorMaterial (GL_FRONT_AND_BACK, GL_DIFFUSE); // Создания указателя на quadric—объект // для построения колец QuadrObj=gliiNewQiiadric (); // Определение свойств текстуры Texturelnit (); // Задание перспективной проекции glMatrixMode (GL_PROJECTION); gluPerspective (89.0 , 1.0, 0.5, 100.0); // Далее, будет проводиться только // преобразование объектов сцены glMatrixMode (GL_MODELVIEW); } |