Иллюстрированный самоучитель по Visual Studio.Net

         

Подготовка сцены


Изображение сферы целесообразно создать заранее (в функции init), а затем воздействовать на него матрицей моделирования, коэффициенты которой изменяются в соответствии с алгоритмом случайных девиаций вектора вращения. При разработке кода функции init надо учесть специфику работы с функцией glDrawElements, которая обсуждалась выше. Кроме того, здесь мы производим установку освещенности, технологию и детали которой можно выяснить в сопровождающей документации (MSDN). Введите следующие коды функции инициализации и вставьте их до функции перерисовки:

void Init ()

{

//=== Цвет фона (на сей раз традиционно черный)

glClearColor (0., 0., 0., 0.);

//====== Включаемаем необходимость учета света

glEnable(GL_LIGHTING);

//=== Включаемаем первый и единственный источник света

glEnable(GL_LIGHT());

//====== Включаем учет цвета материала объекта

glEnable(GL_COLOR_MATERIAL);

// Вектор для задания различных параметров освещенности

float v[4] =

{

0.0Sf, 0.0Sf, 0.0Sf, l.f



};

//=== Сначала задаем величину окружающей освещенности glLightModelfv(GL_LIGHT_MODEL_AMBIENT, v);

//====== Изменяем вектор

v[0] = 0.9f; v[l] = 0.9f; v[2] = 0.9f;

//====== Задаем величину диффузной освещенности

glLightfv(GL_LIGHTO, GL_DIFFUSE, v) ;

//======= Изменяем вектор

v[0] = 0.6f; v[l] = 0.6f; v[2] = 0.6f;

//====== Задаем отражающие свойства материчала

glMaterialfv(GL_FRONT, GL_SPECULAR, v);

//====== Задаем степень блесткости материала

glMateriali(GL_FRONT, GL_SHININESS, 40);

//====== Изменяем вектор

v[0] = O.f; v[l] = O.f; v[2] = l.f; v[3] = O.f;

//====== Задаем позицию источника света

glLightfv(GL_LIGHTO, GL_POSITION, v);

//====== Переключаемся на матрицу проекции

glMatrixMode(GL_PROJECTION); glLoadldentity();

//====== Задаем тип проекции

gluPerspective(45, 1, .01, 15);

//=== Сдвигаем точку наблюдения, отодвигаясь от

//=== центра сцены в направлении оси z на 8 единиц

gluLookAt (0, 0, 8, 0, 0, 0, 0, 1, 0) ;

//====== Переключаемся на матрицу моделирования



glMatrixMode(GL_MODELVIEW);

//===== Включаем механизм учета ориентации полигонов

glEnable(GL_CULL_FACE);

//===== Не учитываем обратные поверхности полигонов

glCullFace(GL_BACK);

//====== Настройка OpenGL на использование массивов

glEnableClientState(GL_VERTEX_ARRAY);

glEnableClientState(GL_NORMAL_ARRAY);

glEnableClientState(GL_COLOR_ARRAY);

//====== Захват памяти под динамические массивы

VERT *Vert = new VERT[gnVert];

TRIA *Tria = new TRIA[gnTria];

//====== Создание изображения

Sphere(Vert, Trial;

//====== Задание адресов трех массивов (вершин,

//====== нормалей и цветов),

/1====== а также шага перемещения по ним

glVertexPointer(3, GL_FLOAT, sizeof(VERT), &Vert->v); glNormalPointer(GL_FLOAT, sizeof(VERT), &Vert->n);

glColorPointer(3, GL_UNSIGNED_BYTE, sizeof(VERT),

SVert->c);

srand(time(0)); // Подготовка ГСЧ

gShift = CPoint3D (Rand(gMax),Rand(gMax),Rand(gMax));

//====== Формирование списка рисующих команд

glNewListd, GL_COMPILE);

glDrawElements(GL_TRIANGLES, gnTria*3, GL_UNSIGNED_INT, Tria);

glEndList() ;

//== Освобождение памяти, так как список сформирован

delete [] Vert;

delete [] Tria;

}


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