Создание сферы
Подготовка сцены
Изображение сферы целесообразно создать заранее (в функции 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; }