Введение обработчиков сообщений Windows
Инициализация переменных
В конструктор класса вставьте код установки начальных значений переменных, с помощью которых пользователь сможет управлять сценой Open GL:
COpenGL:: COpenGL() { //====== Контекст передачи пока отсутствует m_hRC = 0; //====== Начальный разворот изображения m_AngleX = 35 .f; m_AngleY = 20 .f; //====== Угол зрения для матрицы проекции m_AngleView = 45 .f; //====== Начальный цвет фона m_clrFillColor = RGB (255.245.255); //====== Начальный режим заполнения //====== внутренних точек полигона m_FillMode = GL_FILL; //====== Подготовка графика по умолчанию DefaultGraphic (); //=== Начальное смещение относительно центра сцены //=== Сдвиг назад на полуторный размер объекта m_zTrans = -1.5f*m_fRangeX; m_xTrans = m_yTrans = 0.f; // Начальные значения квантов смещения (для анимации) m_dx = m_dy = 0.f; //=== Мыть не захвачена m_bCaptured = false; //=== Правая кнопка не была нажата m_bRightButton = false; //=== Рисуем четырехугольниками m_bQuad = true; //====== Начальный значения параметров освещения m_LightParam[0] = 50; // X position m_LightParam[1] = 80; // Y position m_LightParam[2] = 100; // Z position m_LightParam[3] = 15; // Ambient light m_LightPararn[4] = 70; // Diffuse light m_LightParam[5] = 100; // Specular light m_LightParam[6] = 100; // Ambient material m_LightParam[7] = 100; // Diffuse material m_LightParam[8] = 40; // Specular material m_LightParam[9] = 70; // Shininess material m_LightParam[10] = 0; // Emission material }
Функция перерисовки
Перерисовка изображения OpenGL состоит в том, что обнуляется буфер цвета и буфер глубины – буфер третьей координаты. Затем в матрицу моделирования (GL_MODELVIEW), которая уже выбрана в качестве текущей, загружается единичная матрица (glLoadldentity). После этого происходит установка освещения, с тем чтобы на него не действовали преобразования сдвига и вращения. Лишь после этого матрица моделирования домножается на матрицу трансляции и матрицу вращений. Чтобы рассмотреть изображение, достаточно иметь возможность вращать его вокруг двух осей (X и Y). Поэтому мы домножаем матрицу моделирования на две матрицы вращений (glRotatef). Сначала вращаем вокруг оси X, затем вокруг оси Y:
HRESULT COpenGL::OnDraw (ATL_DRAWINFO& di) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadldentity{); //====== Установка параметров освещения SetLight (); //====== Формирование матрицы моделирования glTranslatef(m_xTrans,m_yTrans,m_zTrans); glRotatef (m_AngleX, l.0f, 0.0f, 0.0f); glRotatef (m_AngleY, 0.0f, l.0f, 0.0f); //====== Вызов рисующих команд из списка glCallList(1); //====== Переключение буферов SwapBuffers(m_hdc); return S_OK; }