Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Структура приложений, использующих OpenGL
Обработка событий мыши и клавиатуры
При необходимости реализации взаимодействия с пользователем в программе могут обрабатываться события от мыши и клавиатуры.
В ниже приведенном примере клавиши "Insert" и "Delete" изменяют угол поворота вокруг оси OХ, клавиши "Home" и "End" – вокруг оси OY, клавиши "Page Up" и "Page Down" – вокруг оси OZ.
Object Pascal (Delphi)
В приложениях на Object Pascal с использованием VCL (Delphi) для этого может использоваться обработчик события формы OnKeyDown. Для определения нажатой клавиши используются коды виртуальных клавиш операционной системы. Виртуальный код нажатой клавиши передаётся в обработчик события через параметр-переменную Key. Виртуальные коды клавиш объявлены как константы в модуле Windows.pas и начинаются с символов "VK_".
В процедуре используются глобальные переменные AngleX, AngleY, AngleZ для сохранения значения новых углов поворота изображения ( пример 3.6).
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_INSERT: inc(AngleX, AngleDl); VK_DELETE: dec(AngleX, AngleDl); VK_HOME: inc(AngleY, AngleDl); VK_END: dec(AngleY, AngleDl); VK_PRIOR: inc(AngleZ, AngleDl); VK_NEXT: dec(AngleZ, AngleDl); end; InvalidateRect(Handle, nil, False); end;Листинг 3.6. Пример обработки нажатия клавиш для поворота изображения вокруг осей координат на Object Pascal (Delphi)
В конце процедуры выполняется системная процедура InvalidateRect, которая информирует операционную систему о необходимости обновления изображения формы. Это приводит к возникновению события формы OnPaint, в обработчике которого формируется изображение, но уже с новыми значениями углов поворота изображения вокруг осей координат.
Библиотека OpenTK
В приложениях с использованием библиотеки OpenTK на С# (WinForms) для этого можно использовать обработчик события KeyDown компонента GLControl. Виртуальный код клавиши передается в обработчик события в качестве свойства KeyCode параметра события, который имеет тип KeyEventArgs. Ниже приведен пример 3.7 обработчика события KeyDown.
private void glControl1_KeyDown(object sender, KeyEventArgs e) { switch(e.KeyCode) { case Keys.Insert: AngleX += AngleDl; break; case Keys.Delete: AngleX -= AngleDl; break; case Keys.Home: AngleY += AngleDl; break; case Keys.End: AngleY -= AngleDl; break; case Keys.Prior: AngleZ += AngleDl; break; case Keys.Next: AngleZ -= AngleDl; break; } glControl1.Invalidate(); }Листинг 3.7. Пример обработки нажатия клавиш для поворота изображения вокруг осей координат в программе на C# с использованием библиотеки OpenTK
Для обновления изображения в конце события вызывается метод Invalidate компонента GLControl. В результате будет выполнен делегат события Paint и обновлено содержание компонента GLControl.
Завершение работы c библиотекой OpenGL
Для корректного завершения работы с библиотекой OpenGL необходимо выполнить освобождение ресурсов, выделенных при инициализации работы библиотеки. Обычно это выполняется при завершении приложения.
Object Pascal (Delphi)
В приложениях Object Pascal для завершения работы с OpenGL необходимо выполнить следующую последовательность действий:
- Освободить текущий контекст воспроизведения с помощью функции wglMakeCurrent. Для этого ей в качестве параметров передаются нулевые значения.
- Удалить контекст воспроизведения, дескриптор которого был сохранен в глобальной переменной hrc. Удаление контекста воспроизведения выполняется с помощью функции wglDeleteContext.
- Удалить контекст устройства операционной системы с помощью функции ReleaseDC. В качестве параметров функции передаются дескриптор окна приложения (свойство формы Handle) и дескриптор устройства (переменная hr). Глобальная переменная hr была инициализирована при запуске программы на этапе инициализации библиотеки OpenGL.
Эти действия можно выполнить в обработчике события закрытия формы OnDestroy.
Фрагмент кода, выполняющий эти действия приведен ниже ( пример 3.8).
procedure TForm1.FormDestroy(Sender: TObject); begin if not wglMakeCurrent(0, 0) then raise Exception.Create( 'Невозможно освободить текущий контекст воспроизведения !'); if not wglDeleteContext(hrc) then raise Exception.Create('Ошибка удаления контекста воспроизведения !'); if ReleaseDC(Form1.Handle, dc)=0 then raise Exception.Create('Ошибка удаления контекста устройства'); end;Листинг 3.8. Пример завершения работы с библиотекой OpenGL на Object Pascal (Delphi)
Библиотека OpenTK (С#)
При использовании библиотеки OpenTK завершение работы с библиотекой OpenGL выполняет сама библиотека OpenTK. При этом она выполняет операции, аналогичные приведённым в листинге 3.8 для приложения на Object Pascal (Delphi).
Краткие итоги
В лекции рассмотрена структура приложений, использующих библиотеку OpenGL для формирования изображений, на языке программирования C# с использованием библиотеки OpenTK и на языке программирования Object Pascal. Рассмотрено назначение вторичного буфера и теста глубины. В созданных приложениях реализована обработка клавиатуры для изменения изображения.
Библиотека OpenTK скрывает практически весь процесс инициализации библиотеки OpenGL.
В Object Pascal весь процесс инициализации OpenGL необходимо реализовать непосредственно в программе, при этом есть возможность полного контроля данного процесса.