Главная страница
Навигация по странице:

  • GL LINE LOOP GL POLYGON

  • GL_QUAD_STRIP GL TRIANGLES

  • GL TRIANGLE FAN GL TRIANGLE STRIP

  • Мировые координаты

  • Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика


    Скачать 0.66 Mb.
    НазваниеРуководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
    Дата21.10.2022
    Размер0.66 Mb.
    Формат файлаdocx
    Имя файла221937-83556.docx
    ТипРуководство
    #747097
    страница7 из 30
    1   2   3   4   5   6   7   8   9   10   ...   30
    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.)

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

    void glMatrixMode (GLenum mode)

    вызов которой со значением параметра mode, равным GL_MODELVIEW, GL_PROJECTION или GL_TEXTURE, вклю­чает режим работы с модельно-видовой матрицей, матрицей проекций, или матрицей текстуры соответственно. Для вызова команд, задающих матрицы того или иного типа, необходимо

    4-1- Работа с матрицами

    57

    сначала установить соответствующий режим.

    Для определения элементов матрицы текущего типа вызыва­ется команда

    void glLoadMatrix [ f d] (GLtype *m)

    где m указывает на массив из 16 элементов типа float или double в соответствии с названием команды, при этом сначала в нем должен быть записан первый столбец матрицы, затем второй, третий и четвертый. Еще раз обратим внимание: в массиве m матрица записана по столбцам. Команда

    void glLoadldentity (void)

    заменяет текущую матрицу на единичную.

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

    void glPushMatrix (void) void glPopMatrix (void)

    Они записывают и восстанавливают текущую матрицу из сте­ка, причем для каждого типа матриц стек свой. Для модельно-видовых матриц его глубина равна как минимум 32, для осталь­ных— как минимум 2.

    Для умножения текущей матрицы на другую матрицу ис­пользуется команда

    void glMultMatrix[f d] (GLtype *m)

    где параметр m должен задавать матрицу размером 4x4. Если обозначить текущую матрицу за М, передаваемую матрицу за Т, то в результате выполнения команды glMultMatrix текущей ста­новится матрица М*Т. Однако обычно для изменения матрицы того или иного типа удобно использовать специальные коман­ды, которые по значениям своих параметров создают нужную матрицу и умножают ее на текущую.

    58

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

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






    Мировые координаты

    Видовые координаты

    Нормализованные координаты


    Параметры области вывода (gIViewport)


    Оконные координаты

    Рис. 4.2. Преобразования координат в OpenGL

    Запомните: все преобразования объектов и камеры в OpenGL производятся с помощью умножения векторов координат на мат­рицы. Причем умножение происходит на текущую матрицу в мо­мент определения координаты командой glVertex и некоторыми другими.

    4.2. Модельно-видовые преобразования

    К модельно-видовым преобразованиям будем относить пере­нос, поворот и изменение масштаба вдоль координатных осей. Для проведения этих операций достаточно умножить на соот­ветствующую матрицу каждую вершину объекта и получить из-

    4-2. Модельно-видовые преобразования

    59

    мененные координаты этой вершины:

    (х'\




    (х\

    У'

    = М

    У

    Z'




    Z

    VI/ VI/

    где М — матрица модельно-видового преобразования. Перспек­тивное преобразование и проецирование производится аналогич­но. Сама матрица может быть создана с помощью следующих команд:

    void glTranslate [ f d] (GLtype x, GLtype y, GLtype z) void glRotate[f d] (GLtype angle,

    GLtype x, GLtype y, GLtype z) void glScale[f d] (GLtype x, GLtype y, GLtype z)

    glTranslate производит перенос объекта, прибавляя к коорди­натам его вершин значения своих параметров.

    glRotate производит поворот объекта против часовой стрелки на угол angle (измеряется в градусах) вокруг вектора(х,у,г).

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

    Все эти преобразования изменяют текущую матрицу, а пото­му применяются к примитивам, которые определяются позже. В случае, если надо, например, повернуть один объект сцены, а другой оставить неподвижным, удобно сначала сохранить те­кущую видовую матрицу в стеке командой glPushMatrix, затем вызвать glRotate с нужными параметрами, описать примитивы, из которых состоит этот объект, а затем восстановить текущую матрицу командой glPopMatrix.

    Кроме изменения положения самого объекта, часто бывает необходимо изменить положение наблюдателя, что также при­водит к изменению модельно-видовой матрицы.

    Это можно сделать с помощью команды

    1   2   3   4   5   6   7   8   9   10   ...   30


    написать администратору сайта