У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 4 Тема- Создание базовых примитивов расширенными методами OpenGL Цель- приобрести

Работа добавлена на сайт samzan.net: 2015-07-05

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 3.2.2025

Лабораторная работа №4

Тема: Создание базовых примитивов расширенными методами OpenGL

Цель: приобрести практические навыки отрисовки примитивов на плоскости при помощи расширенных средств OpenGL (дисплейных списков и массивов вершин).

Задание.

  1.  Используя функции библиотеки OpenGL, отобразить двухмерную систему декартовых координат (оси, стрелки, разметка осей, подписи осей, точка 0).
  2.  Согласно индивидуальному варианту задания (таблица 1) отобразить в построенной в пункте 1 системе координат геометрический объект с указанными атрибутами двумя способами: а) создавая и вызывая дисплейные списки для координатных осей и заданной фигуры; б) используя соответствующие массивы вершин и цветов.

Примечание: размер геометрического объекта должен составлять порядка 70% площади клиентской области окна.

Если требуется построение многоугольника, то он должен быть правильным.

  1.  Дополнительно возможно использование функций управления клавиатурой и/или мышью.

Таблица 1 – Геометрические объекты

Объекты

Атрибуты

Цвет линии

(RGB)

Тип линии

Цвет заливки / толщина линии

  1.  

Квадрат

Черный

Пунктирная

Белый

  1.  

Пятиугольник

Красный

Сплошная

Желтый

  1.  

Ломаная линия

Зеленый

Штрих-пунктирная

4 пиксела

  1.  

Треугольник

Желтый

Сплошная

Белый

  1.  

Соединенные четырехугольники

Синий

Штриховая

2 пиксела

  1.  

Линии

Фиолетовый

Штриховая

3 пиксела

  1.  

Прямоугольник

Голубой

Сплошная

Зеленый

  1.  

Веер соединенных треугольников

Белый

Сплошная

Черный

  1.  

Замкнутая ломаная линия

Светло-синий

Штриховая

5 пиксела

  1.  

Шестиугольник

Светло-зеленый

Штрих-пунктирная

2 пиксела

  1.  

Восьмиугольник

Бордовый

Сплошная

Голубой

  1.  

Цепочка соединенных треугольников

Оранжевый

Пунктирная

1 пиксел

  1.  

Квадрат

Розовый

Сплошная

Желтый

  1.  

Пятиугольник

Серый

Сплошная

Светло-зеленый

  1.  

Ломаная линия

Коричневый

Пунктирная

1 пиксел

  1.  

Треугольник

Темно-зеленый

Сплошная

Салатный

  1.  

Соединенные четырехугольники

Сиреневый

Сплошная

Красный

  1.  

Линии

Бирюзовый

Пунктирная

2 пиксела

  1.  

Прямоугольник

Алый

Сплошная

Желтый

  1.  

Веер соединенных треугольников

Оранжевый

Сплошная

Серый

  1.  

Замкнутая ломаная линия

Грязно-зеленый

Штриховая

4 пиксела

  1.  

Плавно изогнутая линия

Темно-зеленый

Штрих-пунктирная

3 пиксела

  1.  

Восьмиугольник

Темно-синий

Сплошная

Оранжевый

  1.  

Цепочка соединенных треугольников

Фиолетовый

Штриховая

3 пиксела

  1.  

Шестиугольник

Серый

Сплошная

Светло-красный

Содержание отчета:

  1.  титульный лист с подписью;
  2.  задание, № варианта;
  3.  теоретическая справка - описание пользовательских функций и функций OpenGL;
  4.  выводы;
  5.  экранные формы;
  6.  листинг программы.

Срок выполнения работы – 1 занятие.

Теоретические сведения.

Массивы вершин

Если вершин много, то чтобы не вызывать для каждой команду glVertex..(), удобно объединять вершины в массивы, используя команду

void glVertexPointer( GLint size, GLenum type, GLsizei stride, void *ptr )

которая определяет способ хранения и координаты вершин. При этом size определяет число координат вершины (может быть равен 2, 3, 4), type определяет тип данных (может быть равен GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE). Иногда удобно хранить в одном массиве другие атрибуты вершины, и тогда параметр stride задает смещение от координат одной вершины до координат следующей; если stride равен нулю, это значит, что координаты расположены последовательно. В параметре ptr указывается адрес, где находятся данные.

Аналогично можно определить массив нормалей, цветов и некоторых других атрибутов вершины, используя команды

void NormalPointer(GLenum type, GLsizei stride, void*pointer)

void ColorPointer(GLintsize, GLenum type, GLsizei stride, void *pointer)

Для того, чтобы эти массивы можно было использовать в дальнейшем, надо вызвать команду

void glEnableClientState(GLenum array)

с параметрами GL_VERTEX_ARRAY, GL_NORMAL_ARRAY, GL_COLOR_ARRAY соответственно. После окончания работы с массивом желательно вызвать команду

void glDisableClientState(GLenum array)

с соответствующим значением параметра array.

Для отображения содержимого массивов используется команда

void glArrayElement(GLint index)

которая передает OpenGL атрибуты вершины, используя элементы массива с номером index. Это аналогично последовательному применению команд вида glColor..(…), glNormal..(…), glVertex..(…) c соответствующими параметрами. Однако вместо нее обычно вызывается команда

void glDrawArrays(GLenum mode, GLint first, GLsizei count)

рисующая count примитивов, определяемых параметром mode, используя элементы из массивов с индексами от first до first+count-1. Это эквивалентно вызову команды glArrayElement() с соответствующими индексами.

В случае если одна вершина входит в несколько примитивов, то вместо дублирования ее координат в массиве удобно использовать ее индекс.

Для этого надо вызвать команду

void glDrawArrays(GLenum mode, GLsizei count, GLenum type, void *indices)

где indices– это массив номеров вершин, которые надо использовать для построения примитивов, type определяет тип элементов этого массива: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, а count задает их количество.

Списки изображений

Если нужно несколько раз обращаться к одной и той же группе команд,эти команды можно объединить в так называемый список изображений (display list) и вызывать его при необходимости. Для того, чтобы создать новый список изображений надо поместить все команды, которые должны в него войти между командными скобками:

void glNewList(GLuint list, GLenum mode)

void glEndList()

Для различения списков используются целые положительные числа, задаваемые при создании списка значением параметра list, а параметр mode определяет режим обработки команд, входящих в список:

GL_COMPILE команды записываются в список без выполнения

GL_COMPILE_AND_EXECUTE команды сначала выполняются, а затем записываются в список

После того, как список создан, его можно вызвать командой

void glCallList(GLuint list)

указав в параметре list идентификатор нужного списка. Чтобы вызвать сразу несколько списков, можно воспользоваться командой

void glCallLists(GLsizei n, GLenum type, const GLvoid *lists)

вызывающей n списков с идентификаторами из массива lists, тип элементов которого указывается в параметре type. Это могут быть типы GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_INT, GL_UNSIGNED_INT >и некоторые другие. Для удаления списков используется команда

void glDeleteLists(GLint list, GLsizei range)

которая удаляет списки с идентификаторами ID из диапазона list <=ID<= list+range-1.




1. Прикладное программное обеспечение. Создание презентаций MS PowerPoint
2. Демографический переход в России
3. Вопросы- Назовите диагноз с обоснованием
4. Реферат -Тюркский каганат
5. Бизнес-план разработки
6. Вопросы уголовной ответственности медицинских работников
7. Браво дети ~ Рождественские встречи 2014 Конкурс проводится с 4 по 8 января 2014 года в городе Миасс Челяб
8. Економіка та підприємництво 6
9. остальному миру Валовой национальный располагаемый доход Потребление основн
10. Самые богатые люди мира