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

  • ИСПОЛЬЗОВАНИЕ МАССИВОВ ВЕРШИН. ПРЕОБРАЗОВАНИЯ КООРДИНАТ Цель работы

  • Необходимые теоретические сведения Перед выполнением работы следует ознакомиться с теорети- ческим материалом по теме «Аффинные преобразования» (лекция 7) [7]. Массивы вершин

  • Включение/выключение режима.

  • Объявление массива вершин

  • Заполнение массива вершин

  • Команды рисования

  • Геометрические преобразования.

  • Матрица моделирования

  • Преобразование переноса

  • Преобразование масштабирования

  • ТРЕХМЕРНЫЕ ПОСТРОЕНИЯ. БУФЕР ГЛУБИНЫ. ВИДОВЫЕ ПАРАМЕТРЫ. ПАРАЛЛЕЛЬНАЯ И ПЕРСПЕКТИВНАЯ ПРОЕКЦИИ Цель работы

  • Необходимые теоретические сведения

  • Место команд в программе.

  • Е. А. Снижко, Н. А. Флерова


    Скачать 0.57 Mb.
    НазваниеЕ. А. Снижко, Н. А. Флерова
    Дата02.11.2018
    Размер0.57 Mb.
    Формат файлаpdf
    Имя файлаelr00490.pdf
    ТипПрактикум
    #55262
    страница3 из 7
    1   2   3   4   5   6   7
    Дополнительные задания
    1.
    В установленном графическом окне построить N точек, окрашенных случайным образом и распределенных случайным образом по всей площади окна.
    2.
    Фонтан. В некоторой окрестности заданной точки появ- ляется и пропадает данное количество точек различного размера и цвета.
    3.
    При нажатии клавиш управления курсором (при движе- нии мыши) появляется и гаснет некоторое данное количество то- чек случайного размера и цвета.
    4.
    Для области размером N*N точек (размер точки задан) реализовать алгоритм дизеринга с использованием трех заданных цветов.
    5.
    Бенгальский огонь. В некоторой окрестности данной точ- ки рисуются линии случайного размера, цвета и направления
    (длина линий ограничена).
    6.
    Бенгальский огонь в движении. Картинка, построенная в результате предыдущей задачи, изменяется при нажатии клавиш управления курсором.
    Контрольные вопросы
    1.
    Что такое командные скобки, каково их назначение?
    2.
    Какие константы библиотеки OpenGL могут быть пара- метрами функции glBegin?
    3.
    Что такое антиэлайзинг, для чего он служит?
    4.
    Какие режимы существуют для рисования линий?
    5.
    Какие режимы существуют для изображения треугольни- ков, чем они различаются?
    6.
    Что такое выпуклые и невыпуклые многоугольники?
    7.
    Каким образом можно построить невыпуклый много- угольник?
    8.
    Чем различаются лицевые и обратные грани?
    9.
    Какая команда изменяет способ тонирования?
    10.
    Какие режимы вывода многоугольников вам известны? В каком месте программы должна быть записана команда, изме- няющая режим вывода многоугольников?

    28
    Лабораторная работа № 3
    ИСПОЛЬЗОВАНИЕ МАССИВОВ ВЕРШИН.
    ПРЕОБРАЗОВАНИЯ КООРДИНАТ
    Цель работыпродемонстрировать возможности использо- вания специальных массивов OpenGL для моделирования графи- ческих объектов, дать понятие о векторной форме команд; иссле- довать возможности библиотеки для перемещения, масштабиро- вания и поворотов объектов.
    Необходимые теоретические сведения
    Перед выполнением работы следует ознакомиться с теорети- ческим материалом по теме «Аффинные преобразования»
    (лекция 7) [7].
    Массивы вершин. Поскольку описывать сложные объекты вершинами – достаточно трудоемкое занятие в OpenGL имеется возможность использования массива вершин. Особенности мас- сивов в среде Delphi рассмотрены в приложении 3.
    Включение/выключение режима. Работа с использованием массивов OpenGL – это особый режим работы, для включения и отключения которого существуют команды, аналогичные
    glEnable и glDisable: glEnableClientState(<константа>); — включает режим glDisableClientState(<константа>); — выключает режим
    Параметром обеих команд является символьная константа, определяющая тип массива:
    GL_VERTEX_ARRAY,
    GL_COLOR_ARRAY и др.
    Объявление массива вершин:
    GLfloat aVertex [<количество элементов-вершин>] [<число параметров>];
    Первый индекс массива aVertex определяет необходимое число вершин, координаты которых будут храниться в массиве.
    Индексация вершин производится от 0 до значения, на единицу меньшего, чем указанное количество; второй индекс определяет число параметров процедуры glVertex – 2, 3 или 4. Соответствен- но вызов процедуры glVertex будет записан в векторной форме, например:

    29 glVertex2fv(aVertex[5]); отобразит вершину в двумерной системе координат, соответст- вующую 5-му элементу массива вершин.
    GLfloat aColors [<количество элементов с данными цвета- ми>] [<число параметров>];
    Первый индекс определяет количество элементов изображе- ния, для которых задаются цвета, второй индекс может прини- мать значения 3 (RGB) или 4 (RGBA).
    Заполнение массива вершинможет производиться как в теле процедуры рисования, так и в отдельной процедуре.
    Для формирования указателей на массивы используются процедуры glVertexPointer(<
    число координат
    >, GL_FLOAT, 0, aVertex); glColorPointer(<
    число компонент цвета
    >,
    GL_FLOAT, 0, aColors);
    Второй параметр указывает тип элементов массива (другие варианты: GL_SHORT, GL_INT, GL_DOUBLE); третий – 0 – озна- чает, что все элементы расположены последовательно; последний параметр обеих процедур представляет собой указатель на соот- ветствующий массив.
    Команды рисования. После того как указатели на массивы сформированы, можно использовать команды рисования на осно- ве массивов. Простейшей такой командой является команда glArrayElement(<индекс элемента>);
    Она заменяет команду описания вершин и стоит внутри ко- мандных скобок примитива. Например: glBegin(GL_POLYGON); glArrayElement(0); glArrayElement(1); glArrayElement(2); glArrayElement(3); glEnd;
    Следующая команда позволяет нарисовать сразу несколько однотипных объектов:

    30 glDrawArrays(<примитив>, <начальный индекс>, <коли- чество элементов>);
    Команда имеет три параметра: первый параметр определяет примитив и задается константой примитива (см. предыдущую л.р.); второй параметр – начальный индекс массива; третий пара- метр – количество элементов массива. Например: glDrawArrays(GL_POLYGON, 0, 64); рисует полигон из 64 вершин, заданных в массиве. Обратите внимание, что здесь не требуется командных скобок.
    Геометрические преобразования. В процессе построения изображения координаты вершин подвергаются различным пре- образованиям, таким как сдвиг (перенос), поворот, масштабиро- вание, преобразования проецирования. Данная лабораторная ра- бота посвящена простейшим преобразованиям координат. Про- екции будут рассмотрены позднее.
    По умолчанию камера находится в начале координат и на- правлена вдоль отрицательного направления оси Oz.
    Матрица моделирования. Для преобразований координат в
    OpenGL применяется матрица моделирования (modelview matrix).
    Она служит для задания положения объекта и его ориентацию.
    Константа для матрицы моделирования: GL_MODELVIEW.
    Все координаты внутри OpenGL хранятся при помощи одно- родных координат, т.е. в виде четырехмерных векторов (x, y, z,
    w). Если координата z не задана, то она полагается равной нулю.
    Если координата w не задана, то она полагается равной единице.
    При выполнении преобразования координат текущая матри- ца моделирования умножается на матрицу выбранного геометри- ческого преобразования.
    Текущая матрица моделирования задается при помощи про- цедуры glMatrixMode (GL_MODELVIEW);
    Процедура glLoadIdenity(); устанавливает текущую матрицу равной единичной.

    31
    Для задания матрицы моделирования ее сначала устанавли- вают равной единичной, а затем последовательно применяют к текущей матрице различные геометрические преобразования.
    Преобразование переноса:
    glTranslatef (TYPE x, TYPE y, TYPE z); реализует сдвиг объекта на величину (x, y, z).
    Преобразование поворота:
    glRotatef (TYPE angle, TYPE x, TYPE y, TYPE z); обеспечивает поворот объекта на угол angle в направлении про- тив часовой стрелки вокруг прямой с направляющим вектором
    (x, y, z).
    Чтобы осуществить поворот на плоскости относительно на- чала координат, следует использовать вектор (x, y, z)=(0, 0, 1).
    Преобразование масштабирования:
    glScalef (TYPE kx, TYPE ky, TYPE kz); осуществляет частичное масштабирование объекта вдоль каждой из координатных осей на значения, определяемые соответствую- щими параметрами.
    Если последовательно указано несколько преобразований, то в результате текущая матрица будет последовательно умножена на матрицы соответствующих преобразований.
    Команды преобразований помещаются перед командными скобками и/или после них.
    Все объекты в OpenGL рисуются в точке отсчета системы координат (опорная точка), а команды геометрических преобра- зований изменяют положение системы координат, а не объекта относительно неподвижной системы.
    Особенность команд преобразования координат заключается в том, что каждое повторное обращение к обработчику перери- совки экрана будет повторно применять преобразования к изо- бражаемым объектам. Кроме того, бывает необходимо применить преобразование не ко всем объектам сцены, а лишь к некоторым из них. Поэтому важно возвращать систему в исходное положе- ние. Например, если при изображении некоторого объекта систе- ма координат была сначала перенесена, а затем повернута:

    32 glTranslatef(-0.3, 0.5,0.0); glRotatef(60, 0, 0, 1); то после рисования необходимо выполнить команды обратных преобразований в обратном порядке: glRotatef(-60, 0, 0, 1); glTranslatef(0.3, -0.5,0.0);
    Описанный выше способ восстановления положения системы координат достаточно громоздок и неэффективен в вычислитель- ном плане, поскольку обратные преобразования выполняются через перемножение матриц. Другой способ позволяет запоми- нать состояние матрицы моделирования и восстанавливать его в нужный момент. Для этого используются команды glPushMatrix и glPopMatrix , которые оперируют со стеком, т.е. можно запоми- нать несколько величин, а при каждом восстановлении содержи- мое стека поднимается вверх на единицу данных (восстановление осуществляется в обратном порядке!).
    Команды glPushMatrix и glPopMatrix устанавливаются соот- ветственно до и после командных скобок.
    Задания к работе
    1. Создать массив вершин, содержащий координаты пра- вильного
    N
    -угольника. Используя сформированный массив, на- рисовать: а) полигон; б) набор четырехугольников; в) набор треугольников; г) набор линий.
    Все объекты должны быть изображены каркасно.
    2. Нарисовать треугольник, прямоугольник и линию. Полу- чить новое изображение, на котором:

    треугольник следует смасштабировать с коэффициентами
    (kx, ky) и перенести на вектор p;

    линию повернуть на угол
    α
    относительно начала коорди- нат;

    прямоугольник повернуть относительно точки с коорди- натами (x, y) на угол
    β

    33 3. Используя примитив для рисования линий и операции геометрических преобразований, изобразить фигуру, соответст- вующую варианту задания.
    Варианты к заданиям
    Вариант 1
    Вариант 4
    N=5
    (kx,ky)=(2, 1.5)
    p=(12, 5)
    α
    =30
    (x, y)=(3, 3)
    β
    =-15
    N=4
    (kx,ky)=(2.5, 0.5)
    p=(2, 5)
    α
    =-30
    (x, y)=(13, 7)
    β
    =35
    Вариант 2
    Вариант 5
    N=7
    (kx,ky)=(3, 0.5)
    p=(-5, 10)
    α
    =-70
    (x, y)=(-5, -5)
    β
    =45
    N=8
    (kx,ky)=(1.2, 1.5)
    p=(3, 15)
    α
    =40
    (x, y)=(-3, 8)
    β
    =-25
    Вариант 3
    N=6
    (kx,ky)=(-0.5, 1.5)
    p=(10, -5)
    α
    =45
    (x, y)=(-10, 3)
    β
    =-30
    Дополнительные задания
    1.
    Изобразить выпуклый многоугольник, заданный масси- вом вершин, и точку белого цвета вне этого многоугольника.
    Точка может перемещаться по экрану при помощи клавиш управления курсором. При нажатии клавиши цвет точ- ки становится: красным – точка внутренняя; зеленым – гранич- ная; белым – внешняя.
    2.
    Изобразить на экране отрезок прямой линии и некоторую точку вне этой линии. Пользуясь аффинными преобразованиями, построить точку, симметричную данной, относительно линии.
    3.
    Изобразить растущий прямоугольник, пользуясь только аффинными преобразованиями.

    34 4.
    Изобразить мишень, состоящую из 10 концентрических окружностей. Раскрасить мишень таким образом, чтобы каждое кольцо было окрашено в свой цвет.
    5.
    Написать программу для изображения гистограммы, зна- чения категорий для которой хранятся в числовом массиве. Гис- тограмма должна а) полностью изображаться на экране; б) располагаться в заданной области окна.
    Контрольные вопросы
    1.
    Для чего применяется массив вершин?
    2.
    Каким образом производится объявление и заполнение массива вершин?
    3.
    Какие команды служат для работы с массивом вершин?
    4.
    Что необходимо сделать, прежде чем начать работать с массивом вершин?
    5.
    Что такое матрица переноса и для чего она служит?
    6.
    Какие существуют виды преобразований и какие команды openGL им соответствуют?
    Лабораторная работа № 4
    ТРЕХМЕРНЫЕ ПОСТРОЕНИЯ. БУФЕР ГЛУБИНЫ.
    ВИДОВЫЕ ПАРАМЕТРЫ. ПАРАЛЛЕЛЬНАЯ
    И ПЕРСПЕКТИВНАЯ ПРОЕКЦИИ
    Цель работы –выяснить особенности трехмерного модели- рования, построения объемных изображений как проекций на экранной плоскости; дать понятие о параметрах вида.
    Необходимые теоретические сведения
    Перед выполнением лабораторной работы следует ознако- миться с теоретическими сведениями, относящимися к возмож- ностям трехмерного моделирования с использованием библиоте- ки OpenGL. Рекомендуется внимательно изучить теоретический материал, относящийся к различным способам проецирования
    (лекция 15) [7] .
    Трехмерные координаты. В предыдущих лабораторных работах для рисования фигур использовалась версия команды

    35
    glVertex с двумя параметрами. Координата по оси Z предполага- лась равной нулю.
    Для изображения в пространстве используется команда
    glVertex с тремя параметрами: glVertex3f(<координата x>, <координата y>, <координата z>).
    Значение координаты Z лежит в пределах от –1 до 1.
    По умолчанию считается, что наблюдатель расположен в точке
    (0, 0, 0), что следует иметь в виду. Чтобы вершины с положи- тельными координатами Z были изображены, следует сдвинуть систему координат в глубь экрана.
    OpenGL воспроизводит только те части примитивов, коорди- наты которых не превосходят по модулю единицу. Примитивы с одинаковыми координатами рисуются по принципу «каждый по- следующий рисуется поверх предыдущего». Такое изображение не всегда дает правильные результаты, в частности если не вклю- чена поддержка буфера глубины.
    Буфер глубины. Буфер глубины используется для передачи пространства. При воспроизведении каждого пикселя в этот бу- фер записывается информация о значении координаты Z пикселя, так называемая оконная Z. Если на пиксель приходится несколь- ко точек, на экран выводится точка с наименьшим значением этой координаты.
    Для правильного построения изображений (в соответствии с глубиной) необходимо включить режим тестирования глубины с помощью команды glEnable(GL_DEPTH_TEST);
    Код сцены следует начинать с очистки двух буферов: буфера кадра и буфера глубины: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    Точно так же, как перед очередным построением, необходи- мо очистить поверхность рисования; для корректного воспроиз- ведения требуется очистить буфер пространства.
    Проекции. Изображение трехмерных объектов на экране строится с помощью проекций: параллельной (ортографической) и перспективной.

    36
    При изображении трехмерных объектов следует иметь в ви- ду, что оно строится в пределах единичного куба (координаты по каждой из осей изменяются в пределах от –1 до 1), причем начало координат (центр куба) находится в центре окна, а ось Z направ- лена перпендикулярно плоскости экрана в сторону наблюдателя.
    Способ проецирования определяется выбором команды для уста- новки параметров: glFrustum – выбирается перспективный способ проецирования, glOrtho – выбирается параллельный способ проецирования.
    При параллельном проецировании сохраняется параллель- ность прямых. Например, при изображении куба в параллельной проекции задняя и передняя грани будут равны.
    При использовании перспективной проекции параллельные линии объекта изображаются сходящимися в некоторой удален- ной («в глубь» экрана) точке, что и создает перспективу.
    Параметры проецирования относятся к параметрам вида.
    Видовые параметры. Кроме типа проекции изображения на экран, к видовым параметрам относят параметры, определяющие область воспроизведения в пространстве. Все, что выходит за пределы этой области, будет отсекаться при воспроизведении.
    Именно эти параметры и являются аргументами команд glFrus-
    tum и glOrtho:
    1)
    координата плоскости отсечения слева;
    2)
    координата плоскости отсечения справа;
    3)
    координата плоскости отсечения снизу;
    4)
    координата плоскости отсечения сверху;
    5)
    расстояние от наблюдателя до ближней плоскости отсе- чения;
    6)
    расстояние от наблюдателя до дальней плоскости отсечения.
    Следует иметь в виду, что для команды glFrustum 5-й и 6-й параметры всегда положительны, а для команды glOrtho могут быть и отрицательными.
    Устанавливать видовые параметры не обязательно при каж- дой перерисовке экрана, достаточно делать это лишь при измене- нии размеров окна (или при создании нового окна).
    Старайтесь переднюю и заднюю плоскости отсечения распо- лагать таким образом, чтобы расстояние между ними было ми- нимально возможным: чем меньший объем ограничен этими

    37 плоскостями, тем меньше вычислений приходится производить
    OpenGL.
    Как правило, при установке видовых параметров производят и перенос системы координат таким образом, чтобы все точки изображения попадали в область воспроизведения. Обратите внимание на то, что в этом случае (проецирование + перенос) об- ласть видимости расширяется.
    Чтобы изображенная фигура выглядела пространственной, систему координат разворачивают вокруг оси X и вокруг оси Y.
    Место команд в программе. Для того чтобы при каждой по- следующей перерисовке экрана не происходило изменение раз- меров сцены, связанное с переносом и проецированием, следует использовать видовые команды по определенным правилам.
    Первый способ – использование команды glLoadIdentity: glLoadIdentity;
    //Сброс всех матриц в 1 glFrustum(-1, 1, -1, 1, 3, 10);
    //видовые параметры glTranslatef(0.0, 0.0, -5.0);
    //начальный сдвиг
    //системы координат glRotatef(30.0, 1.0, 0.0, 0.0);
    //поворот относительно оси X glRotatef(70.0, 0.0, 1.0, 0.0);
    //поворот относительно оси Y glBegin(…);
    …..
    // команды рисования glEnd;
    Второй способ – использование команд glPushMatrix и
    glPopMatrix: glPushMatrix;
    //запоминаем текущую матрицу glFrustum(-1, 1, -1, 1, 3, 10);
    //видовые параметры glTranslatef(0.0, 0.0, -5.0);
    //начальный сдвиг
    //системы координат glRotatef(30.0, 1.0, 0.0, 0.0);
    //поворот относительно оси X glRotatef(70.0, 0.0, 1.0, 0.0);
    //поворот относительно оси Y glBegin(…);
    …..
    // команды рисования glEnd; glPopMatrix;
    //восстанавливаем текущую матрицу
    1   2   3   4   5   6   7


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