Лабораторная работа N 7. Визуализация средствами графической библиотеки OpenGL Введение Цель задания - получить практический опыт использования библиотеки OpenGL на платформе MS Visual Studio .NET и реализация кода на языке C#. Описание задания Примерный алгоритм решения задачи такой: 1. В среде MS Visual Studio .NET выбрать шаблон создания оконного приложения Windows Forms. 2. Подключить к проекту библиотеки Tao.OpenGL.dll, Tao.FreeGlut.dll, Tao.Platform.Windows.dll 3. Добавить в папку проекта \Debug библиотеку freeglut.dll 4. Добавить ссылку на библиотеки. 5. Подключить эти библиотеки в пространство имен. 6. Разместить на форме элемент: SimpleOpenGLControl (область вывода графики) 7. Инициализировать работу элемента simpleOpenGlControl1 8. Добавить код, реализующий визуализацию полигональной модели, средствами библиотеки GLUT. 9. Добавить код, отображающий сцену в окне приложения. 10. Реализовать систему освещения Примеры выполнения работы Для работы с графикой необходимо подключить фреймворк taoframework http://sourceforge.net/projects/taoframework/ Элементами управления можно вращать куб в 3 измерениях. Рис. 1. Отображение Осей X Y Z Рис. 2. Поворот вокруг оси Y Рис. 3. Поворот вокруг оси X Рис. 4. Поворот вокруг оси Y и Z Варианты задания Задание 1. Размещение простейших примитивов на сцене 2. Создание сложных объектов: полигональная сетка 3. Текстуирование, UV-маппинг 4. Анимация Вариант 1 2 3 1 2 3 4 1 5 2 6 3 7 1 8 2 9 3 10 1 11 12 2 3 1 1 1 2 2 2 3 3 3 1 1 1 1 2 1 2 1 1 1 1 1 2 1 2 2 1 2 1 2 2 2 2 2 1 2 1 1. Размещение простейших примитивов на сцене 1.1. Сцена 1 1.2. Сцена 2 1.3. Сцена 3 2. Создание сложных объектов: полигональная сетка 2.1. Фигура 1 2.2. Фигура 2 2.3. Фигура 3 3. Использование текстур. Проецирование текстуры на поверхность (UVW-mapping). 3.1. Создать полигональный куб и наложить на его грани текстуру игральной кости. 3.2. Создать полигональную модель пирамиды и наложить на нее текстуру кирпич. 4. Анимация 4.1. Создать сцену из неподвижного стола и катающегося по нему шарика. Шарик должен иметь текстуру. Шарик должен кататься по кругу. 4.2. Создать сцену из неподвижного стола и перемещающегося по нему куба. Куб должен иметь текстуру. Куб должен перемещаться по квадратному пути. Методические указания Использование библиотеки OpenGl на платформе .NET Продемонстрируем создание трехмерного графического приложения c использованием технологии OpenGL на платформе .NET. Дистрибутив библиотеки Tao Framework можно получить с сайта разработчиков [1]. После инсталяции в папке c:\Program Files будет создана папка \TaoFramework, в которой можно найти сами библиотеки, дкументацию, примеры и исходные коды (рис. 1). 1. The Tao Framework | Download The Tao Framework software for free at SourceForge.net. – URL: http://sourceforge.net/projects/taoframework/ Рис. 1. Вид папки TaoFramework после инсталяции В Microsoft Visual C# создадим новый проект, в качестве шаблона выбрав приложение Windows Forms. Назовем его WindowsFormsApplication_OpenGL1. Рис. 2. Окно создания проекта Сразу после генерации кода шаблона, дайте команду Файл – Сохранить все. В диалоговом окне укажите папку сохранения проекта. Рис. 3. Диалоговое окно сохранения проекта Для реализации этого проекта будут использованы три библиотеки Tao Framework из папки c:\Program Files\TaoFramework \bin 1. Tao.OpenGL.dll - отвечает за реализация библиотеки OpenGL 2. Tao.FreeGlut.dll - отвечает за реализацию функций библиоеки Glut. Мы будем ее использовать для инициализации рендера , а так же для различных других целей. 3. Tao.Platform.Windows.dll - отвечает за поддержку элементов непосредственно для визуализации непосредственно на платформе Windows. Кроме этого, понадобится библиотека freeglut.dll из папки c:\Program Files\TaoFramework\lib Эти библиотеки необходимо добавить в папку проекта \Debug (рис. 4). Рис. 4. Папка Debug проекта WindowsFormsApplication_OpenGL1 Теперь необходимо перейти к окну Solution Explorer (Обозреватель решений). Здесь, нас интересует узел Links, который отображает связи с библиотеками, необходимыми для работы разрабатываемого приложения (рис.5). Щелкните по этому узлу правой клавишей мыши, после чего, в открывшемся контекстном меню выберите «Добавить ссылку» (“Add Link”). Рис. 5. Окно "Обозреватель решений" В открывшемся окне «Добавить ссылку», открыть закладку "Обзор", перейти в директорию \Debug, в которую были скопированы библиотеки Tao Framework и отметиь эти библиотеки. Рис. 6. Окно ссылок После этого, необходимо открыть панель кода (клавиша F7) и подключить эти библиотеки в пространство имен. Рис. 7. Пространство имен Следующий шаг – размещение на форме элементов: SimpleOpenGLControl (область вывода графики) и кнопок управления button1 и button2. Элементы перетаскиваются из "Панели элементов" на форму (рис. 8). Рис. 8. Размещение элементов на форме Если элемент SimpleOpenGlControl отсутствует на панели элементов необходимо щелкнуть правой кнопкой на вкладке «Общие», и в раскрывшемся контекстном меню выбрать пункт «Выбрать элементы» (Select elements) (рис. 9). В открывшемся диалоговом окне "Выбор элементов панели элементов" отметить компонент SimpleOpenGLControl. Рис. 9. Активизация элемента SimpleOpenGlControl После этого данный элемент станет доступным для размещения на форме приложения. Инициализация OpenGL в C# .NET . Следующий шаг – инициализция работы OpenGl. Для этого в конструкторе класса необходимо инициализировать работу элемента simpleOpenGlControl1: namespace WindowsFormsApplication_OpenGL1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); simpleOpenGlControl1.InitializeContexts(); } } } Затем, в режиме конструктора, необходимо создать шаблоны функций обработчиков событий – загрузка (Load) формы и щелчек (Click) по кнопкам button1 и button2. Для создания шаблонов достаточно сделайть двойной щелчок левой клавишей мыши на форме и кнопках. В результате на странице кода появятся соответсвующие шаблоны. namespace WindowsFormsApplication_OpenGL1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); simpleOpenGlControl1.InitializeContexts(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { } } } Обработчик события Form1_Load содержит команды инициализации. private void Form1_Load(object sender, EventArgs e) { // инициализация Glut Glut.glutInit(); Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH); // очитка окна Gl.glClearColor(0.76f, 0.84f, 0.98f, 1); // установка порта вывода в соотвествии с размерами элемента simpleOpenGlControl Gl.glViewport(0, 0, simpleOpenGlControl1.Width, simpleOpenGlControl1.Height); // Область вывода // настройка проекции Gl.glMatrixMode(Gl.GL_PROJECTION); // Матрица проекций Gl.glLoadIdentity(); // Замена текущей матрицы на единичную // Тип текущей проекции (проекция 3d на 2-ух мерный экран Glu.gluPerspective(45, (float)simpleOpenGlControl1.Width / (float)simpleOpenGlControl1.Height, 0.1, 200); // Устанавливаем определенную проекцию в качестве текущей матрицы и очищаем ее Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glLoadIdentity(); // настройка параметров OpenGL для визуализации Gl.glEnable(Gl.GL_DEPTH_TEST); // Тест глубины Gl.glEnable(Gl.GL_LIGHTING); Gl.glEnable(Gl.GL_LIGHT0); Gl.glEnable(Gl.GL_COLOR_MATERIAL); // Отображение цветов материалов } Обработчик события button1_Click() содержит код, реализующий визуализацию сеточного каркаса куба, средствами библиотеки GLUT. private void button1_Click(object sender, EventArgs e) { // Очистка буфера цвета и буфера глубины Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); // // Gl.glLoadIdentity(); Gl.glColor3i(100, 0, 0); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); Glu.gluPerspective(45, (float)simpleOpenGlControl1.Width / (float)simpleOpenGlControl1.Height, 0.1, 200); Glu.gluLookAt(8, 8, 10, 0, 0, 2, 0, 0, 1); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPushMatrix(); // Перемещение текущей матрицы в стек матриц //Glut.glutSolidCube(4.0); Glut.glutWireCube(4.0); Gl.glPopMatrix(); Gl.glFlush(); simpleOpenGlControl1.Invalidate(); // Обновить отображаемый кадр (перерисовка) } Обработчик события button2_Click() содержит команду выхода из приложения. private void button2_Click(object sender, EventArgs e) { Application.Exit(); } Рис. 10. Результат выполнения программы Таким образом, на этом простом примере продемонстрировано использование библиотеки OpenGL для создания простейшей 3D сцены. Для доступа к OpenGL на платформе C# .NET был использован набор библиотек Tao Framework. Ссылки и литература 1. Меженин А.В. Методы и средства распознавания образов и визуализации [Электронный ресурс]: Учебное пособие. – СПб.: НИУ ИТМО, 2012. –120 с. – Доступ из системы дистанционного обучения НИУ ИТМО.