Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
Скачать 0.66 Mb.
|
GLRC()void DrawFigures (void)gluLookAt (0.0 , 0.0, 2.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // Сохраняем видовую матрицу, так как дальше // будет проводиться поворот колец glPushMatrix () ; // Производим несколько поворотов на новый угол // (это быстрее, чем умножать предыдущую видовую // матрицу на матрицу поворота с фиксированным // углом поворота) glRotatef (-CurAng, l, 1, 0); glRotatef (CurAng, 1, 0, 0); // Для рисования колец каждое из них надо // преобразовать отдельно, поэтому сначала // сохраняем видовую матрицу, затем восстанавливаем glPushMatrix () ; glTranslatef (0 ,0, - RingHeight /2); DrawRing () ; glPopMatrix () ; glPushMatrix () ; glTranslatef (0 , RingHeight/2 ,0); glRotatef (90,1,0,0); DrawRing () ; glPopMatrix () ; glPushMatrix () ; glTranslatef (-RingHeight/2 ,0 ,0); glRotatef (90,0,1,0); DrawRing () ; glPopMatrix () ; // Восстанавливаем матрицу для поворотов тераэдра glPopMatrix () ; // Выключаем режим наложения текстуры glDisable (GL_TEXTURE_2D); // Проводим повороты glRotatef (CurAng, l, 0, 0); Б.4- Пример 3: Текстурирование и анимация 193 glRotatef (CurAng / 2, 1, 0, 1); // Чтобы тетраэдр вращался вокруг центра, его // надо сдвинуть вниз по оси oz glTranslatef (0, -0.33, 0); // Задаем цвет диффузного отражения для тетраэдра glColor3fv(mat_diff2); // Проводим построение тетраэдра glCallList (TETR_LIST); } void Display (void) { // Инициализация (очистка) текущего буфера // кадра и глубины glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Построение объектов DrawFigures (); // Перестановка буферов кадра glutSwapBuffers (); } void Redraw (void) { // Увеличение текущего угла поворота CurAng+=l; // Сигнал для вызова процедуры создания изображения // (для обновления) glutPostRedisplay (); } int main(int argc , char **argv) { Рис. Б.З. Результат работы программы Б.5. Б. 5. Класс для работы с OPENGL в WIN32 195 Б.5. Класс для работы с OpenGL в Win32 Программа Б.6. Файл glrc.li. #ifndef _GLRC_H_ #define _GLRC_H_ // заголовки OpenGL ^include class GLRC { public : // создание из идентификатора окна GLRC( HWND wnd ); // деструктор GLRC() ; // удаление, (также вызывается из деструктора) void Destroy () ; // Создание контекста рисования. // Необходимо вызвать до использования OpenGL bool Create (); // Создан ли контекст рисования? bool IsCreated (); // Является ли контекст рисования текущим? bool IsCurrentQ const; // Делает контект текущим bool MakeCurrent () ; { _ if (m_created) Б. 5. Класс для работы с OPENGL в WIN32 197 Destroy () ; } void GLRC:: Destroy () { wglDeleteContext (m_glrc) ; : : ReleaseDC (m_wnd, m_dc) ; m_created = false ; } bool GLRC::MakeCurrent() { assert ( m_created ); if (IsCurrent ()) |