инженерная графика. Лабораторная работа введение в opengl цель изучения темы. Изучение принципов применения библиотеки Opengl при разработке приложений в C#
Скачать 1.39 Mb.
|
1 Лабораторная работа № 3. ВВЕДЕНИЕ В OPENGL Цель изучения темы. Изучение принципов применения библиотеки OpenGL при разработке приложений в C#. 3.1. OpenGL OpenGL означает Open Graphics Library, что переводится как «откры- тая графическая библиотека». Другими словами, OpenGL − это некая спецификация, включающая в себя несколько сотен функций. Она определяет независимый от языка про- граммирования кросс-платформенный программный интерфейс, с помо- щью которого программист может создавать приложения, использующие двухмерную и трехмерную компьютерную графику. Первая базовая версия OpenGL появилась в 1992 году, она была разработана компанией Silicon Graphics Inc, занимающейся разработками в области трехмерной компью- терной графики. В библиотеку заложен механизм расширений, благодаря которому производители аппаратного обеспечения (например, производители ви- деокарт) могли выпускать расширения OpenGL для поддержки новых спе- цифических возможностей, не включенных в текущую версию библиотеки. Благодаря этому программисты могли сразу использовать эти новые воз- можности в отличие от библиотеки Microsoft Direct3D (в этом случае им бы пришлось ждать выхода новой версии DirectX). Библиотеки OpenGL и DirectX являются конкурентами на платформе MS Windows. Microsoft продвигает свою библиотеку DirectX и стремится замедлить развитие библиотеки OpenGL, что ослабило бы графическую систему конкурирующих ОС, где используется исключительно библиотека OpenGL для реализации вывода всей графики. 2 Мы будем учиться визуализации компьютерной графики именно с применением этой библиотеки. Однако прямой поддержки данной библио- теки в .NET Framework нет, поэтому мы будем использовать библиотеку Tao Framework. 3.2. TAO Framework Tao Framework – это свободно распространяемая библиотека с откры- тым исходным кодом, предназначенная для быстрой и удобной разработки кросс-платформенного мультимедийного программного обеспечения в среде .NET Framework и Mono (см. приложение). На сегодняшний день Tao Framework − оптимальный путь для исполь- зования библиотеки OpenGL при разработке приложений в среде .NET на языке C#. В состав библиотеки на данный момент входят все современные сред- ства, которые могут понадобиться в ходе разработки мультимедиа про- граммного обеспечения: реализация библиотеки OpenGL, реализация биб- лиотеки FreeGlut, содержащей все самые новые функции этой библиотеки, библиотека DevIL (легшая в основу стандарта OpenIL − Open Image Library) и многие другие. Самые интересные библиотеки, включенные в Tao Framework: • OpenGL 2.1.0.12 − свободно распространяемый аппаратно- программный интерфейс для визуализации 2D- и 3D-графики. • FreeGLUT 2.4.0.2 – библиотека с открытым исходным кодом, яв- ляющаяся альтернативой библиотеке GLUT (OpenGL Utility Toolkit). • DevIL 1.6.8.3 (она же OpenIL) – кросс-платформенная библиотека, реализующая программный интерфейс для работы с изображениями. На дан- ный момент библиотека поддерживает работу с изображениями 43 форматов для чтения и 17 форматов для записи. • Cg 2.0.0.0 – язык высокого уровня, созданный для программирова- ния текстурных и вершинных шейдеров. • OpenAL 1.1.0.1 – свободно распространяемый аппаратно-программный интерфейс для обработки аудиоданных. (В том числе 3D-звука и EAX эффек- тов). • PhysFS 1.0.1.2 – библиотека для работы с вводом/выводом файло- вой системы, а также различного вида архивами на основе собственного API. 3 • SDL 1.2.13.0 – кросс-платформенная мультимедийная библиотека, активно использующаяся для написания мультимедийных приложений в операционной системе GNU/Linux. • ODE 0.9.0.0 − свободно распространяемый физический программ- ный интерфейс, главной особенностью которого является реализация си- стемы динамики абсолютно твёрдого тела и системы обнаружения столк- новений. • FreeType 2.3.5.0 – библиотека, реализующая растеризацию шриф- тов. Данная библиотека используется в X11 − оконной системе, которая обеспечивает все стандартные инструменты и протоколы для построения GUI (графического интерфейса пользователя) в UNIX подобных операци- онных системах. • FFmpeg 0.4.9.0 − набор свободно распространяемых библиотек с открытым исходным кодом. Данные мультимедийные библиотеки позво- ляют работать с аудио- и видеоданными в различных форматах. Таким образом, библиотека Tao Framework является мощным и удоб- ным свободно распространяемым инструментом для решения любых мультимедийных задач, преимущественно кросс-платформенного характе- ра. Работая с данной библиотекой, разработчики могут использовать базу алгоритмов и реализованных за многие годы методов, что сокращает время разработки программных продуктов. 3.3. Инициализация OpenGL в C# Проверим работоспособность библиотеки Tao с использованием те- стового приложения: сначала подключим ее к проекту, затем проведем инициализацию библиотеки и инициализацию OpenGL и в качестве про- верки визуализируем сферу с помощью библиотеки FreeGlut, разместив специальный элемент управления, предназначенный для визуализации сцены в окне программы. Создание проекта и подключение библиотеки Tao OpenGL в С# Сначала создайте новый проект, в качестве шаблона установив при- ложение Windows Forms. Назовите его Tao-OpenGL-Initialization-Test. Дождитесь, пока MS Visual Studio закончит генерацию кода шаблона. Теперь перейдите к окну Solution Explorer (Проводник решений). Здесь нас интересует узел Links, который отображает связи с библиотеками, необхо- димыми для работы нашего приложения (рис. 3.1). 4 Рис. 3.1 Назовите главное окно «Тестирование инициализации OpenGL в С#.NET». (Свойства окна, параметр Text). Щелкните по этому узлу правой клавишей мыши, после чего в от- крывшемся контекстном меню выберите «Добавить ссылку» (“Add Link”), как показано на рис. 3.2. Рис. 3.2 В открывшемся окне «Добавить ссылку» перейдите к закладке "Об- зор". После этого перейдите к директории, в которую была установлена биб- лиотека Tao Framework. (По умолчанию “C:\\Program Files\Tao Framework”). 5 Нам потребуется папка bin, в ней хранятся необходимые нам библиотеки. Перейдите в папку bin и выберите три библиотеки, как показано на рис. 3.3. Tao.OpenGL.dll отвечает за реализацию библиотеки OpenGL. Tao.FreeGlut.dll отвечает за реализацию функций библиотеки Glut. Мы будем ее использовать для инициализации рендера, а также для других целей. Tao.Platform.Windows.dll отвечает за поддержку элементов для визуа- лизации на платформе Windows. Рис. 3.3 На рис. 3.4 мы видим все добавившиеся библиотеки в узле «Ссылки» (Links). Теперь перейдите к ис- ходному коду окна. Для рабо- ты с нашими библиотеками необходимо подключить со- ответствующие пространства имен: Рис. 3.4 6 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; // для работы с библиотекой OpenGL using Tao.OpenGl; // для работы с библиотекой FreeGLUT using Tao.FreeGlut; // для работы с элементом управления SimpleOpenGLControl using Tao.Platform.Windows; Теперь вернитесь к конструктору диалогового окна и перейдите к ок- ну Toolbox (панель элементов). Щелкните правой кнопкой на вкладке «Общие» и в раскрывшемся контекстном меню выберите пункт «Выбрать элементы» (Choose Items), как показано на рис. 3.5. Рис. 3.5 В открывшемся окне найдите элемент SimpleOpenGLControl и устано- вите возле него галочку, как показано на рис. 3.6. Затем нажмите ОК. 7 Рис. 3.6 Теперь данный элемент станет доступным для размещения на форме приложения. Перетащите элемент на форму и разместите так, как показано на рис. 3.7. Справа от размещенного элемента установите 2 кнопки – «Ви- зуализировать» и «Выйти». Рис. 3.7 8 Теперь выделите элемент simpleOpenGlControl1, расположенный на форме и перейдите к его свойствам. Измените параметр name на значение “AnT”. Далее элементы simpleOpenGl Control мы будем называть AnT (рис. 3.8). Инициализация OpenGL в C#.NET Теперь необходимо инициализи- ровать работу OpenGl. Сначала в конструкторе класса мы должны инициализировать работу элемента AnT: public Form1() { InitializeComponent(); AnT.InitializeContexts(); } Снова перейдите к конструктору и сделайте двойной щелчок левой клавишей мыши на форме – создастся функция обработчик события за- грузки формы. В ней мы поместим код инициализации OpenGl. Подробное описание данного кода будет рассмотрено в следующих темах, а сейчас мы только протестируем работу библиотек OpenGL и FreeGLUT. private void Form1_Load(object sender, EventArgs e) { // инициализация Glut Glut.glutInit(); Glut.glutInitDisplayMode (Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH); // очистка окна Gl.glClearColor(255, 255, 255, 1); // установка порта вывода в соответствии с размерами элемента anT Gl.glViewport(0, 0, AnT.Width, AnT.Height); // настройка проекции Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); Glu.gluPerspective(45, (float)AnT.Width / (float)AnT.Height, 0.1, 200); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glLoadIdentity(); Рис. 3.8 9 // настройка параметров OpenGL для визуализации Gl.glEnable(Gl.GL_COLOR_MATERIAL); Gl.glEnable(Gl.GL_DEPTH_TEST); Gl.glEnable(Gl.GL_LIGHTING); Gl.glEnable(Gl.GL_LIGHT0); } На окне мы создали 2 кнопки. Обработчик кнопки "Выйти" будет вы- глядеть следующим образом: //обработчик кнопки "выйти" private void button2_Click(object sender, EventArgs e) { Application.Exit(); } Обработчик кнопки «Визуализировать» будет содержать код, реали- зующий визуализацию сеточного каркаса сферы (за отрисовку трехмерной сферы будет отвечать библиотека FreeGLUT). Код, который будет разме- щен в данной функции, отвечает за разные технические аспекты визуали- зации, с которыми мы познакомимся в следующих темах. Код функции: // обработчик кнопки "визуализировать" private void button1_Click(object sender, EventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glColor3ub(255, 0, 0); Gl.glPushMatrix(); Gl.glTranslated(0,0,-6); Gl.glRotated(45, 1, 1, 0); // рисуем сферу с помощью библиотеки FreeGLUT Glut.glutWireSphere(2, 32, 32); Gl.glPopMatrix(); Gl.glFlush(); AnT.Invalidate(); } Откомпилируйте и запустите приложение. Если при компиляции приложения (по кнопке F5) Microsoft Visual Studio выдает ошибку с сообщением о том, что не найдена какая-либо биб- лиотека OpenGL (например, freeglut.dll), необходимо в настройках опера- ционной системы в переменную среды PATH добавить каталог C:\Program 10 Files\ TaoFramework\lib. При невозможности это сделать, допустимо из ка- талога C:\Program Files\TaoFramework\lib скопировать все файлы необхо- димых библиотек (в нашем случае − freeglut.dll) в каталог, уже включен- ный в переменную среды, например C:\WINDOWS\system32. Результат работы приложения показан на рис. 3.9. Если вы правильно набрали исходные коды и выполнили все описанные действия, то после нажатия на кнопке «Визуализировать» вы увидите аналогичную визуали- зацию сферы. Рис. 3.9 Итак, мы протестировали работоспособность библиотеки Tao, иници- ализировав библиотеку OpenGL в C#.NET. Контрольные вопросы 1. Сущность и назначение OpenGL. 2. Назначение Tao Framework. 3. Порядок установки и подключения библиотек TAO. 4. Поддержка OpenGL в VisualC#. 5. Инициализация OpenGL в C#. 11 Лабораторная работа №4. ИНИЦИАЛИЗАЦИЯ OPENGL Цель изучения темы. Изучение принципов инициализации OpenGL и визуализации объектов при разработке приложений в C#. 4.1. Инициализация OpenGL в C# Этот пунк посвящен начальной инициализации OpenGL, которая предшествует визуализации любой трехмерной сцены: будет рассмотрен код приложения и объяснено, каким образом происходят инициализация OpenGL и визуализация объектов. Инициализация OpenGl После того как объект SimpleOpenGLControl прошел инициализацию, стартует загрузка формы. Мы всегда будем отслеживать это событие, так как именно здесь выполняется начальная настройка программы. Для визуализации трехмерной сцены в предыдущей теме мы исполь- зовали следующий код. private void Form1_Load(object sender, EventArgs e) { // инициализация Glut Glut.glutInit(); Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH); // очистка окна Gl.glClearColor(255, 255, 255, 1); // установка порта вывода в соответствии с размерами элемента AnT Gl.glViewport(0, 0, AnT.Width, AnT.Height); // настройка проекции Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); Glu.gluPerspective(45, (float)AnT.Width / (float)AnT.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); } Здесь в первую очередь выполняется инициализация библиотеки Glut. 12 Как видно из кода, для работы с функциями библиотеки OpenGL ис- пользуется класс Gl, находящийся в пространстве имен Tao.OpenGL. Для работы с функциями библиотеки Glut используется класс Glut. Таким образом, по сравнению с использованием этих библиотек в С++ мы всего лишь вызываем методы из классов соответствующих биб- лиотек, где они очень удобно описаны. Мы обязательно должны вызвать функцию glutInit() перед тем, как начнем использовать любые другие функции данной библиотеки, так как эта функция производит инициализацию библиотеки Glut. Далее мы вызываем функцию Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH); Эта функция устанавливает режим отображения. В нашем случае устанавливается режим RGB для визуализации (GLUT_RGB – это псевдо- ним GLUT_RGBA, он устанавливает режим RGBA битовой маски окна). Далее мы устанавливаем двойную буферизацию окна, которая, как прави- ло, используется для устранения мерцания, возникающего в процессе быстрой перерисовки кадров несколько раз подряд. GLUT_DEPTH указы- вает при инициализации окна, будет ли в приложении использоваться бу- фер глубины. После инициализации окна мы устанавливаем цвет очистки окна с помощью функции Gl.glClearColor(255, 255, 255, 1); Перед дальнейшим изучением кода перечислим этапы создания сцены в OpenGL: 1. Позиционирование объема видимости в пространстве (установка координат камеры). 2. Установка в данном пространстве модели (объекта), которая будет попадать в объем видимости нашей камеры. 3. Проецирование, которое определяет форму объема видимости. 4. В рамках порта просмотра мы получаем изображение объекта. Теперь нам необходимо определить значение порта вывода, устанав- ливая значения в функции Gl.glViewport(0, 0, AnT.Width, AnT.Height); Здесь мы указываем библиотеке OpenGL на то, что вывод будет осу- ществляться во всей области элемента AnT (элемент, расположенный на форме для визуализации в него сцены). Определяем тот самый порт про- смотра, в который последним шагом будет визуализироваться модель. 13 После этого происходит настройка проекции. Для этого мы сначала вызываем функцию Gl.glMatrixMode(Gl.GL_PROJECTION); Функция glMatrixMode предназначена для того, чтобы задавать мат- ричный режим: будет определена матрица, над которой в дальнейшем бу- дут производиться операции. В нашем случае это GL_PROJECTION – мат- рица проекций. Следующей командой мы очищаем матрицу с помощью функции glLoadIdentity (функция заменяет текущую матрицу на единичную). Далее мы устанавливаем тип текущей проекции с помощью функции gluPerspective. Gl.glLoadIdentity(); Glu.gluPerspective(45, (float)AnT.Width / (float)AnT.Height, 0.1, 200); Функция gluPerspective определена в библиотеке GLU – OpenGL Utili- ty Library (GLU). Эта библиотека является надстройкой над библиотекой OpenGL, реализующей ряд более продвинутых функций. Она также явля- ется свободно распространяемой и поставляется вместе с библиотекой OpenGL. Данная функция строит пирамиду охвата видимости, основываясь на угле визуального охвата, отношении сторон порта просмотра и установке ближней и дальней плоскости просмотра (рис. 4.1). Рис. 4.1 Теперь, когда проекция определена, мы устанавливаем в качестве те- кущей матрицы объектно-видовую матрицу и очищаем ее. 14 Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glLoadIdentity(); Теперь остается только включить некоторые опции, необходимые для корректной визуализации сцены. Это тест глубины, а также отображение цветов материалов. Gl.glEnable(Gl.GL_DEPTH_TEST); Gl.glEnable(Gl.GL_COLOR_MATERIAL); |