Главная » Просмотр файлов » Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC)

Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (1124366), страница 5

Файл №1124366 Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC)) 5 страницаЮ.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (1124366) страница 52019-05-11СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 5)

Также можно указывать какой тип граней отображать на экране. Для этого сначала надо установить соответствующий ре­жим вызовом команды glEnable (GL_CULL_FACE), а затем вы­брать тип отображаемых граней с помощью команды

void glCullFace (GLenum mode)

Вызов с параметром GL_FRONT приводит к удалению из изображения всех лицевых граней, а с параметром GL_BACK — обратных (установка по умолчанию).

Кроме рассмотренных стандартных примитивов в библиоте­ках GLU и GLUT описаны более сложные фигуры, такие как сфера, цилиндр, диск (в GLU) и сфера, куб, конус, тор, тетра­эдр, додекаэдр, икосаэдр, октаэдр и чайник (в GLUT). Автома­тическое наложение текстуры предусмотрено только для фигур из библиотеки GLU (создание текстур в OpenGL будет рассмат­риваться в главе 6).

3.4- Дисплейные списки

47

Например, чтобы нарисовать сферу или цилиндр, надо снача­ла создать объект специального типа GLUquadricObj с помощью команды

GLUquadricObj * gluNewQuadric (void ) ;

а затем вызвать соответствующую команду:

void gluSphere (GLUquadricObj * qobj , GLdouble radius , GLint slices , GLint stacks)

void gluCylinder (GLUquadricObj * qobj , GLdouble baseRadius , GLdouble topRadius , GLdouble height , GLint slices , GLint stacks)

где параметр slices задает количество разбиений вокруг оси z, a stacks — вдоль оси ъ.

Более подробную информацию об этих и других командах построения примитивов можно найти в приложении А.

3.4. Дисплейные списки

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

void glNewList (GLuint list , GLenum mode) void glEndList ()

48 Глава 3. Рисование геометрических объектов

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

GL COMPILE —команды записываются в список без выпол­нения;

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

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

void glCallList (GLuint list)

указав в параметре list идентификатор нужного списка.

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

void glCallLists (

GLsizei n, GLenum type, const GLvoid * lists)

вызывающей п списков с идентификаторами из массива 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. Пример:

glNewList(l, GL_COMPILE); glBegin (GLJTRIANGLES);

glVertex3f (l.Of , l.Of, l.Of); glVertex3f (10.Of , l.Of, l.Of); glVertex3f (10-Of , 10.Of, l.Of);

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

49

glEnd(); glEndList ()

glCallList (1);

Дисплейные списки в оптимальном (скомпилированном) ви­де хранятся в памяти сервера, что позволяет рисовать прими­тивы в такой форме максимально быстро. В то же время боль­шие объемы данных занимают много памяти, что влечет, в свою очередь, падение производительности. Такие большие объемы (больше нескольких десятков тысяч примитивов) лучше рисо­вать с помощью массивов вершин.

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

Если вершин много, то, чтобы не вызывать для каждой ко­манду 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 glNormalPointer ( GLenum type , GLsizei stride ,

50

Глава 3. Рисование геометрических объектов

void ^pointer ) void glColorPointer ( GLint size , 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 с соот­ветствующими параметрами. Однако вместо нее обычно вызы­вается команда

void glDrawArrays (GLenum mode, GLint first ,

GLsizei count)

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

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

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

3.6. Контрольные вопросы

51

void glDrawElements (GLenum mode, GLsizei count,

GLenum type, void* indices)

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

Важно отметить, что использование массивов вершин поз­воляет оптимизировать передачу данных на сервер OpenGL, и, как следствие, повысить скорость рисования трехмерной сцены. Такой метод определения примитивов является одним из самых быстрых и хорошо подходит для визуализации больших объемов данных.

3.6. Контрольные вопросы

  1. Что такое функция обратного вызова и как функции об­ратного вызова могут быть использованы для работы с OpenGL?

  2. Для чего нужна функция обновления изображения и что она делает?

  3. Что такое примитив в OpenGL?

  4. Что такое атрибут? Перечислите известные вам атрибуты вершин в OpenGL.

  5. Что в OpenGL является атомарным примитивом? Какие типы примитивов вы знаете?

  6. Для чего в OpenGL используются команды glEnable и glDisable ?

52

Глава 3. Рисование геометрических объектов

  1. Что такое операторные скобки и для чего они используются в OpenGL?

  2. Что такое дисплейные списки? Как определить список и как вызвать его отображение?

  3. Поясните организацию работы с массивами вершин и их отличие от дисплейных списков.

10) Поясните работу команды glDrawElementsQ.

3.6. Контрольные вопросы

53

i

о •.

з • 1

GL POINTS

3 4 GL LINES

M.

GL LINE STRIP

5



C*

GL LINE LOOP

GL POLYGON

GL_QUADS


A>±

GL_QUAD_STRIP

GL TRIANGLES


.25^

GL TRIANGLE FAN

GL TRIANGLE STRIP

Рис. З.1. Примитивы OpenGL.

Глава 4.

Преобразования объектов

В OpenGL используются как основные три системы коорди­нат: левосторонняя, правосторонняя и оконная. Первые две си­стемы являются трехмерными и отличаются друг от друга на­правлением оси z: в правосторонней она направлена на наблю­дателя, в левосторонней — в глубину экрана. Ось х направлена вправо относительно наблюдателя, ось у — вверх.

Левосторонняя система используется для задания значений параметрам команды gluPerspectiveQ, glOrtho(), которые будут рассмотрены в пункте 4.3. Правосторонняя система координат используется во всех остальных случаях. Отображение трехмер­ной информации происходит в двухмерную оконную систему координат.

Строго говоря, OpenGL позволяет путем манипуляций с мат­рицами моделировать как правую, так и левую систему коорди­нат. Но на данном этапе лучше пойти простым путем и запом­нить: основной системой координат OpenGL является правосто­ронняя система.

55

56

Глава 4- Преобразования объектов

(в)

Рис. 4.1. Системы координат в OpenGL. (a) — правосторонняя, (б) — левосторонняя, (в) — оконная.

4.1. Работа с матрицами

Для задания различных преобразований объектов сцены в OpenGL используются операции над матрицами, при этом раз­личают три типа матриц: модельно-видовая, матрица проекций и матрица текстуры. Все они имеют размер 4x4. Видовая матри­ца определяет преобразования объекта в мировых координатах, такие как параллельный перенос, изменение масштаба и поворот. Матрица проекций определяет, как будут проецироваться трех­мерные объекты на плоскость экрана (в оконные координаты), а матрица текстуры определяет наложение текстуры на объект.

Умножение координат на матрицы происходит в момент вы­зова соответствующей команды OpenGL, определяющей коорди­нату (как правило, это команда glVertex.)

Для того чтобы выбрать, какую матрицу надо изменить, ис­пользуется команда:

Характеристики

Тип файла
Документ
Размер
3,41 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6549
Авторов
на СтудИзбе
300
Средний доход
с одного платного файла
Обучение Подробнее