Metodichka по компьютерной графике. Е. А. Снижко, Н. А. Флерова, А. В. Воронцов программирование компьютерной графики с использованием
Скачать 1.31 Mb.
|
Порядок выполнения работы. Перед выполнением лабораторной работы следует ознакомиться с необходимыми теоретическими сведениями, относящимися к возможностям трехмерного моделирования с использованием библиотеки OpenGL. Рекомендуется внимательно изучить теоретический материал, относящийся к различным способам проецирования ([7] – лекция 15). Задания лабораторной работы рекомендуется выполнять в порядке их следования, в соответствии с вариантом, указанным преподавателем. Необходимые теоретические сведения. Трехмерные координаты. В предыдущих лабораторных работах для рисования фигур использовалась версия команды glVertex с двумя параметрами. Координата по оси Z предполагалась равной 0. Для изображения в пространстве используется команда glVertex с тремя параметрами: glVertex3f(<координата x>, <координата y>, <координата z>). Значение координаты Z лежит в пределах от –1 до 1. По умолчанию считается, что наблюдатель расположен в точке (0, 0, 0), что следует иметь в виду. Чтобы вершины с положительными координатами Z были изображены, следует сдвинуть систему координат вглубь экрана. OpenGL воспроизводит только те части примитивов, координаты которых не превосходят по модулю 1. Примитивы с одинаковыми координатами рисуются по принципу: каждый последующий рисуется поверх предыдущего. Такое изображение не всегда дает правильные результаты, в частности, если не включена поддержка буфера глубины. Буфер глубины. Буфер глубины используется для передачи пространства. При воспроизведении каждого пиксела в этот буфер записывается информация о значении координаты Z пиксела, так называемая оконная Z. Если на пиксел приходится несколько точек, на экран выводится точка с наименьшим значением этой координаты. Для правильного построения изображений (в соответствии с глубиной) необходимо включить режим тестирования глубины с помощью команды: glEnable(GL_DEPTH_TEST); Код сцены следует начинать с очистки двух буферов: буфера кадра и буфера глубины: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Точно так же, как перед очередным построением необходимо очистить поверхность рисования, для корректного воспроизведения требуется очистить буфер пространства. 23 Проекции. Изображение трехмерных объектов на экране строится с помощью проекций: параллельной (ортографической) и перспективной. При изображении трехмерных объектов следует иметь в виду, что изображение строится в пределах единичного куба (координаты по каждой из осей изменяются в пределах от –1 до 1), причем начало координат (центр куба) находится в центре окна, а ось Z направлена перпендикулярно плоскости экрана в сторону наблюдателя. Способ проецирования определяется выбором команды для установки параметров вида: glFrustum – выбирается перспективный способ проецирования glOrtho – выбирается параллельный способ проецирования При параллельном проецировании сохраняется параллельность прямых. Например, при изображении куба в параллельной проекции задняя и передняя грани будут равны. При использовании перспективной проекции параллельные линии объекта изображаются сходящимися в некоторой удаленной («вглубь» экрана) точке, что и создает перспективу. Параметры проецирования относятся к параметрам вида. Видовые параметры. Кроме типа проекции изображения на экран, к видовым параметрам относят параметры, определяющие область воспроизведения в пространстве. Все, что выходит за пределы этой области, будет отсекаться при воспроизведении. Именно эти параметры и являются аргументами команд glFrustum и glOrtho: 1) координата плоскости отсечения слева; 2) координата плоскости отсечения справа; 3) координата плоскости отсечения снизу; 4) координата плоскости отсечения сверху; 5) расстояние от наблюдателя до ближней плоскости отсечения; 6) расстояние от наблюдателя до дальней плоскости отсечения. Следует иметь в виду, что для команды glFrustum 5-й и 6-й параметры всегда положительны, а для команды glOrtho значения этих параметров могут быть и отрицательными. Устанавливать видовые параметры не обязательно при каждой перерисовке экрана, достаточно делать это лишь при изменении размеров окна (или при создании нового окна). Старайтесь переднюю и заднюю плоскости отсечения располагать таким образом, чтобы расстояние между ними было минимально возможным: чем меньший объем ограничен этими плоскостями, тем меньше вычислений приходится производить 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 24 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; //восстанавливаем текущую матрицу Матрица проецирования. Для корректного выполнения операций проецирования используется матрица проецирования. Текущую матрицу проецирования можно установить с помощью команды: glMatrixMode(GL_PROJECTION); После выполнения этой команды следует установить матрицу проецирования в единичную с помощью команды glLoadIdentity. Как правило, параметры вида помещаются в обработчике изменения размеров окна, стартовые сдвиги и повороты обычно располагаются здесь же, а код воспроизведения сцены заключается между командами glPushMatrix и glPopMatrix. Иногда поступают иначе: код воспроизведения начинается с glLoadIdentity, а далее идут стартовые трансформации и собственно код сцены. Задания к лабораторной работе. Задание 1. Постройте изображения трех плоских фигур в пространстве (в соответствии с вариантом). Оцените полученный результат: правильно ли изображены фигуры, если нет - объясните почему. Задание 2. Установите режим проверки буфера глубины в программе к заданию 1. Сравните полученный результат с предыдущим. Задание 3. Установите видовые параметры в соответствии с вариантом и параллельную проекцию; постройте изображение куба с координатами вершин, равными по модулю 1 (куб изображается с помощью 6 квадратов). Оцените результат. Задание 4. Установите перспективную проекцию и постройте каркасное изображение куба Задание 5. Поверните оси координат в соответствии с вариантом и постройте изображение куба. Оцените результат. Почему части куба отсечены? Измените видовые параметры таким образом, чтобы куб изображался без отсечений. Измените код программы таким образом, чтобы каждая грань куба изображалась своим цветом. Задание 6. Напишите программу, в которой изображение куба изменяется при нажатии клавиш (в соответствии с вариантом). Варианты заданий. В ари ан т 1 Фигуры (заданы вершинами) Параметры вида Поворот осей К заданию 6 25 Треугольник: (0, 0.3, 0.2) (0.3, 0.3, 0) (0, 0, 0.7) Квадрат: (-0.5, 0.5, 0.3) (-0.5, -0.5, 0.3) (0.5, -0.5, 0.3) (0.5, 0.5, 0.3) Треугольник: (0, 0, 0.3) (0.4, 0, 0.5) (-0.5, 05, -1) -0.7, 0.7 -0.85, 0.85 3, 10 Вокруг OX: 30 Вокруг OY: 70 Изменяется способ изображения: каркасное или заливка цветом В ари ан т 2 Фигуры (заданы вершинами) Параметры вида Поворот осей К заданию 6 Четырехугольник: (-0.5, -0.5, -0.5) (-0.5, 0.5, -0.5) (0.8, 0.5, -0.5) (0.5, -0.8, -0.5) Треугольник: (-1, -1, 1) (-1, 1, 1) (1, 0, -1); Треугольник: (-0.7, -0.7, -0.7) (0, 0, 0) (0, 0, 1) -0.9, 0.8 -0.8, 0.9 5, 10 Вокруг OX: 45 Вокруг OY: 45 Изменяется масштаб: увеличение или уменьшение объекта В ари ан т 3 Фигуры (заданы вершинами) Параметры вида Поворот осей К заданию 6 Треугольник: (1, 1, 0) (1, 0, 1) (0, 1, 1) Четырехугольник: (0.8, 0.7, 1) (-0.8, 0.7, 1) (-0.8, -0.7, -0.8) (0.8, -0.7, -0.8) Треугольник: (0, 0.5, -0.5) (-0.5, 0, -0.5) (0.5, 0, 0.5) -0.85, 0.85 -0.7, 0.7 6, 12 Вокруг OX: -25 Вокруг OY: 60 Куб поворачивается при нажатии на некоторую клавишу на заданный угол В ари ан т 4 Фигуры (заданы вершинами) Параметры вида Поворот осей К заданию 6 Треугольник: (1, 1, 1) (-1, 0, -1) (1, -1, 1) Треугольник: (-0.7, -0.7, 0) (-0.7, 0.7, 0) (0.7, 0, 0) Треугольник: (0, 0, -0.9) (-1, -0.8, 0.5) (1, 1, 1) -0.8, 0.8 -0.9, 0.9 3, 8 Вокруг OX: -15 Вокруг OY: 65 Куб перемещается: удаление или приближение 26 В ари ан т 5 Фигуры (заданы вершинами) Параметры вида Поворот осей К заданию 6 Квадрат: (-0.6, -0.6 , -0.2) (0.6, -0.6, -0.2) (0.6, 0.6, -0.2) (-0.6, 0.6, -0.2) Квадрат: (-0.5, 0.8, -0.8) (-0.5, 0.8, 0.8) (-0.5, -0.8, 0.8) (-0.5, -0.8, -0.8) Треугольник: (-1, -1, 0) (0, 1, 1) (1, 0, 0) -1, 0.9 0.9, 1 2, 9 Вокруг OX: 35 Вокруг OY: 50 Изменяется способ проецирования: прямая или перспективная проекции Дополнительные задания. 1. Напишите программу для построения тетраэдра в выбранной проекции, пользуясь командой рисования ленты треугольников. Реализуйте изображение тетраэдра а) каркасно; б) с заливкой так, чтобы лицевые грани изображались красным цветом, а обратные – синим. 2. Изобразите октаэдр. Реализуйте вращение октаэдра относительно его центра симметрии. 3. Изобразите трехмерную лестницу, пользуясь операцией сдвига. 4. Изобразите винтовую лестницу. Контрольные вопросы. 1. Для чего применяется буфер глубины? 2. Каким образом выводятся фигуры при отключенном тесте глубины? 3. Какие способы проецирования существуют? 4. Чем отличаются различные способы проецирования? 5. Какой способ проецирования целесообразно использовать для построения реалистичных изображений? 6. Какой способ проецирования удобен при построении чертежей? 7. Что такое видовые параметры и как они применяются? 8. С какой целью в командах, устанавливающих видовые параметры, используются плоскости отсечения? Лабораторная работа № 5. Квадрик-объекты. Камера. Цель работы. Исследование возможностей моделирования графических объектов с использованием квадрик-объектов библиотеки OpenGL; установка и использование камеры; исследование и сравнительный анализ результатов, полученных при перемещении камеры и при перемещении объекта. Порядок выполнения работы. Перед выполнением работы следует ознакомиться с теоретическим материалом, относящимся к данной работе. Задания следует выполнять последовательно в соответствии с вариантом, указанным преподавателем. В задании 2 требуется изобразить сложный трехмерный объект с использованием квадрик-объектов библиотеки glu OpenGL. Рекомендуется использовать при моделировании изображения квадрик-объекты различных типов. Необходимые теоретические сведения. Для работы со стандартными трехмерными объектами в OpenGL используются команды библиотеки GLU, которая реализована в виде модуля glu32.dll. Эта библиотека 27 содержит несколько функций управления проекциями, функции работы с полигонами, кривыми и сплайновыми поверхностями и другие функции. Квадрик-объекты. Для изображения цилиндров и конусов используется примитив gluCylinder. Для изображения сферы – gluSphere. Для изображения диска – gluDisk. Для изображения части диска - gluPartialDisk. Перечисленные примитивы являются квадрик-объектами (quadric objects) и изображают соответствующие геометрические тела с помощью аппроксимации плоскими гранями. Поэтому, при задании таких объектов указывают число разбиений объекта на грани по различным направлениям, причем, чем больше число разбиений, тем более гладким получится изображение объекта. Для работы с командами библиотеки GLU вводится переменная специального типа 5 : GLUquadricObj *quadricObj Функция gluCylinder имеет 6 параметров: quadricObj – указатель на квадрик-объект; R – первый радиус (центр этого основания цилиндра расположен в начале координат); r – второй радиус; H – длина; slices – число продольных граней (число вершин многоугольника, являющегося основанием цилиндра); stacks – число разбиений по длине: gluCylinder(quadricObj, R, r, H, slices, stacks) Функция gluSphere имеет 4 параметра: quadricObj – указатель на квадрик-объект; R – радиус сферы; slices – число параллелей; stacks – число меридианов: gluSphere(quadricObj, R, slices, stacks) Функция gluDisk рисует диск или кольцо и имеет 5 параметров: quadricObj – указатель на квадрик-объект; r – внутренний радиус; R – внешний радиус; slices – число секторов; stacks – число концентрических колец: gluDisk(quadricObj, r, R, slices, stacks) Функция gluPartialDisk рисует часть диска или кольца и имеет 7 параметров: первые пять параметров имеют тот же смысл, что и в предыдущей функции; A – начальный угол; SA – угол развертки (диск располагается в плоскости xOy, его центр совпадает с началом координат, начальный угол отсчитывается по часовой стрелке от положительного направления направления оси Y, углы измеряются в градусах): gluPartialDisk(quadricObj, r, R, slices, stacks, A, SA) Для того чтобы нарисовать квадрик-объект, сначала следует вызвать функцию gluNewQuadric (которая создает в динамической памяти указатель на объект), а после рисования объекта – освободить память вызовом функции gluDeleteQuadric. Между указанными функциями заключается блок рисования квадрик-объекта: GLUquadricObj *quadricObj quadricObj=gluNewQuadric(); ……. // рисуем объект quadricObj gluDeleteQuadric (quadricObj); Объекты данного типа располагаются в пространстве в центре координат с учетом матрицы GL_MODELVIEW. Поэтому, чтобы нарисовать изображение объекта в нужном месте, необходимо соответствующим образом изменить эту матрицу, например, с помощью функций glTranslate и glRotate. Указанные команды располагаются внутри блока рисования квадрик-объекта. На базе одного квадрик-объекта можно строить сколько угодно фигур, не обязательно для каждой из них создавать собственный объект, если их параметры идентичны (например, при рисовании нескольких сфер, нескольких дисков, цилиндра и конуса). Однако следует иметь в виду, что рисуются объекты всегда в начале координат, поэтому необходимо корректно использовать команды glPushMatrix и glPopMatrix при преобразованиях системы координат. 5 В Delphi переменную-указатель на квадрик-объект объявляют так quadricObj: GLUquadricObj; 28 Рис. 1 Различные варианты использования команд gluDisk и gluPartialDisk. Рис. 2 Результат работы команды gluSphere в каркасном режиме. По умолчанию каждый квадрик-объект рисуется со сплошным заполнением. Изменить стиль показа можно вызовом функции gluQuadricDrawStyle, указав стиль показа: GLU_POINT – в виде точек, расположенных в вершинах многоугольников; GLU_LINE – каркасное изображение; GLU_FILL – сплошное заполнение; GLU_SILHOUETTE – силуэт, контур (разновидность каркасного). Рис. 3 Результат работы команды gluCilinder. Рис. 4 Результат работы команды gluCilinder. В дополнительной библиотеке GLUT (заголовочный файл glut.h) имеются команды рисования сферы (каркасное изображение сферы – glutWireSphere, сплошное изображение – glutSolidSphere), конуса (glutWireCone, glutSolidCone), тора (glutWireTorus, glutSolidTorus), чайника (glutWireTeapot, glutSolidTeapot). Здесь же имеются команды для рисования правильных многогранников: тетраэдра (glutWireTetrahedron, glutSolidTetrahedron), куба (glutWireCube, glutSolidCube), октаэдра (glutWireOctahedron, glutSolidOctahedron), додекаэдра (glutWireDodecahedron, glutSolidDodecahedron), икосаэдра (glutWireIcosahedron, glutSolidIcosahedron). Библиотека GLU содержит удобные команды для задания перспективы и моделирования камеры. Перспектива. При выполнении предыдущей лабораторной работы использовались параллельная (glOrtho) и центральная (glFrustum) проекции для задания перспективы. В библиотеке GLU для этой цели служит функция |