Главная страница

Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика


Скачать 0.66 Mb.
НазваниеРуководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
Дата21.10.2022
Размер0.66 Mb.
Формат файлаdocx
Имя файла221937-83556.docx
ТипРуководство
#747097
страница27 из 30
1   ...   22   23   24   25   26   27   28   29   30
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); }

1   ...   22   23   24   25   26   27   28   29   30


написать администратору сайта