Metodichka по компьютерной графике. Е. А. Снижко, Н. А. Флерова, А. В. Воронцов программирование компьютерной графики с использованием
Скачать 1.31 Mb.
|
gluPerspective, имеющая следующие 4 параметра: fovy – вертикальный угол конуса обзора; aspect – отношение размера области графического вывода по горизонтали к размеру по вертикали; near – расстояние до передней плоскости отсечения; far – расстояние до задней плоскости отсечения: gluPerspective(fovy, aspect, near, far) Slices=10 Stacks=3 GLU_LINE Команда gluPartialDisk GLU_SILHOUETTE GLU_FILL Slices=10 GLU_FILL Slices=10 Stacks=10 r=0 R=1 H=1.5 r=1 R=1 H=1.5 29 Для задания области отсечения графического вывода используется функция glViewPort. Моделирование камеры. В OpenGL точка обзора по умолчанию располагается в центре координат. Направление зрения – вдоль оси Z противоположно ее направлению (т.е. все, что рисуется, мы видим из центра координат). Для моделирования камеры можно использовать видовые преобразования (матрица MODELVIEW): glMatrixMode(GL_MODELVIEW); //видовая матрица glLoadIdentity(); //установим единичную матрицу glTranslatef(0, 0, -10); //сдвиг по оси Z вглубь экрана glRotatef(27, 1, 0, 0); //поворот вокруг оси X glRotatef(-19, 0, 1, 0); //поворот вокруг оси Y Теперь наблюдатель (камера) как бы находится на расстоянии 10 единиц от центра координат (и значит от плоскости изображения), причем повернута относительно вертикали на 27 градусов, и развернута в горизонтальной плоскости на 19 градусов. При этом камера всегда смотрит в центр координат. Для моделирования камеры, которая направлена в произвольную точку пространства и расположена в заданном месте, удобно использовать функцию библиотеки GLU – gluLookAt, например: glMatrixMode(GL_MODELVIEW); //видовая матрица glLoadIdentity(); //установим единичную матрицу gluLookAt (x, y, z, //местоположение камеры xp, yp, zp, //камера смотрит в эту точку 0, 1, 0); //направление вектора «вверх» Функция имеет 9 параметров: первые три параметра определяют координаты местоположения камеры; вторая тройка параметров задает координаты точки, в которую нацелена камера; последние три параметра – направление вектора «вверх» – используются для поворотов изображения в плоскости проецирования. Например: gluLookAt (x, y, z, xp, yp, zp, 1, 0, 0); определяет поворот изображения на 90 градусов (обычно Вы фотографируете, держа фотоаппарат горизонтально, но иногда бывает удобнее развернуть его вертикально, чтобы сфотографировать, например, высокое дерево – такой поворот и имеется в виду в примере). Направление вектора «вверх» может быть любым, но не должно быть параллельно вектору нормали к плоскости наблюдения. Удобным является выбор вектора «вверх» параллельным оси Y, т.е. (0, 1, 0). Задания к лабораторной работе . Задание 1. Установите перспективу в соответствии с вариантом. Задание 2. Пользуясь командами библиотеки glu изобразите рисунок в соответствии с вариантом. Задание 3. Установите камеру таким образом, чтобы она была направлена в центр Вашего изображения. Задание 4. Реализуйте перемещение камеры относительно объекта: Объезд камеры вокруг объекта; Приближение/удаление камеры относительно объекта; Задание 5. Реализуйте движение объекта относительно камеры: Движение объекта влево/вправо относительно камеры; Вращение объекта вокруг своей оси. Варианты к заданиям лабораторной работы. 1 вариант. Угол вертикального обзора 45 градусов. 30 Расстояние до передней плоскости отсечения: 3 Расстояние до задней плоскости отсечения: 10 Объект «Космический корабль» 2 вариант. Угол вертикального обзора 40 градусов. Расстояние до передней плоскости отсечения: 5 Расстояние до задней плоскости отсечения: 10 Объект «Солнечная система» 3 вариант. Угол вертикального обзора 30 градусов. Расстояние до передней плоскости отсечения: 6 Расстояние до задней плоскости отсечения: 12 Объект «Тележка» 4 вариант. Угол вертикального обзора 25 градусов. Расстояние до передней плоскости отсечения: 3 Расстояние до задней плоскости отсечения: 8 Объект «Настольная лампа» 5 вариант. Угол вертикального обзора 35 градусов. Расстояние до передней плоскости отсечения: 2 Расстояние до задней плоскости отсечения: 9 Объект «Ваза» Дополнительные задания. 1. С помощью квадрик-объектов изобразите баскетбольную корзину и мячик, попадающий в эту корзину из некоторой точки, а затем падающий вниз. 2. С помощью квадрик-объектов изобразите выпуклую поверхность планеты и комету, летящую по параболе к горизонту планеты (комета должна иметь хвост). 3. С помощью квадрик-объектов изобразите мыльные пузыри, выдуваемые из кольца (пузыри растут и разлетаются в случайных направлениях, а затем лопаются). Контрольные вопросы. 1. Что понимается под термином квадрик-объект? 2. Какие библиотеки OpenGL предоставляют возможности использования квадрик- объектов? Какие квадрик-объекты вам известны? 3. Какие действия необходимо описать в программе, чтобы квадрик-объект был изображен? 4. Как определяется положение квадрик-объекта в пространстве? 5. Сколько фигур может быть построено на базе данного квадрик-объекта? 6. Какие стили заполнения квадрик-объектов вам известны? Какая команда используется для изменения стиля заполнения квадрик-объекта? 7. Каким образом устанавливается перспектива с помощью библиотеки GLU? 8. Какая команда библиотеки GLU служит для моделирования камеры? Какие параметры имеет эта команда и каково их назначение? 9. Каково назначение вектора «верх»? 10. Каким образом моделируется камера в отсутствии библиотеки GLU? Лабораторная работа № 6. Освещение. 31 Цель работы. Знакомство с возможностями библиотеки OpenGL для задания параметров освещения сцены; анализ различных вариантов освещения. Порядок выполнения работы. Перед выполнением заданий данной лабораторной работы необходимо повторить сведения, относящиеся к цветовой модели RGB ([7] – лекция 4), изучить теоретический материал, связанный с различными уровнями визуализации ([7] – лекция 15), с учетом свойств материала объектов при их изображении; различия методов Гуро и Фонга ([7] – лекция 16). Необходимые теоретические сведения. OpenGL вычисляет цвет каждого пикселя в результирующей, отображаемой сцене, содержащейся в буфере кадра. Часть этого расчета зависит от того, какое освещение используется в сцене, и как объекты сцены отражают и поглощают свет. В качестве примера этому вспомните, что океан (или море, или река – вообще говоря, любой водоем) имеет различный цвет в солнечный или в облачный день. Присутствие света или облаков определяет, будет ли вода выглядеть ярко синей или грязно зеленой. По правде говоря, большинство объектов вообще не выглядят трехмерными, если они не освещены. Скажем, неосвещенная сфера ничем не отличается от двумерного круга. Освещение любого объекта зависит от двух факторов. Первый - это материал, из которого сделан объект. Второй - это свет, которым он освещен. Модель освещения. OpenGL рассчитывает свет и освещение так, как будто свет может быть разделен на красный, зеленый и синий компоненты. Таким образом, источник света характеризуется количеством красного, зеленого и синего света, которое он излучает, а материал поверхности характеризуется долями красного, зеленого и синего компонентов, которые он отражает в различных направлениях. Уравнения освещенности в OpenGL являются всего лишь аппроксимациями, но зато они работают достаточно хорошо и могут быть вычислены относительно быстро. В модели освещения OpenGL свет исходит от нескольких источников, которые могут включаться и выключаться индивидуально. Часть света обычно исходит из какого- либо определенного направления или позиции, часть распределена по всей сцене. Например, если вы включите лампочку в комнате, большая часть света будет исходить от нее, но часть света падает на поверхности предметов в комнате после того, как он отразился от одной, двух, трех или более стен. Считается, что этот многократно отраженный свет (называемый фоновым светом) распределен настолько сильно, что не существует никакого способа определить его исходное направление, однако он исчезает при выключении определенного источника света. Наконец, в сцене может также присутствовать общий фоновый свет, у которого нет никакого конкретного источника, как будто он был отражен столько раз и распределен так сильно, что его оригинальный источник установить невозможно. В модели OpenGL эффект от источника света присутствует только если есть поверхности поглощающие или отражающие свет. Считается, что каждая поверхность состоит из материала с несколькими свойствами. Материал может излучать свой собственный свет (например, фара автомобиля), он может распределять некоторое количество входящего света во всех направлениях, также он может отражать часть света в определенном направлении (например, зеркало или другая блестящая поверхность). В модели освещения OpenGL предполагается, что освещение может быть разделено на 4 компонента: фоновое (ambient), диффузное (diffuse), зеркальное (specular) и исходящее (эмиссионное – emissive). Все 4 компонента рассчитываются независимо и только затем суммируются. 32 Фоновый, диффузный, зеркальный и исходящий свет. Фоновое излучение – это свет, который настолько распределен средой (предметами, стенами и так далее), что его направление определить невозможно – кажется, что он исходит отовсюду. Лампа дневного света имеет большой фоновый компонент, поскольку большая часть света, достигающего вашего глаза, сначала отражается от множества поверхностей. Уличный фонарь имеет маленький фоновый компонент: большая часть его света идет в одном направлении, кроме того, поскольку он находится на улице, очень небольшая часть света попадает вам в глаз после того, как отразится от других объектов. Когда фоновый свет падает на поверхность, он одинаково распределяется во всех направлениях. Диффузный компонент – это свет, идущий из одного направления, таким образом, он выглядит ярче, если падает на поверхность под прямым углом, и выглядит тусклым, если касается ее всего лишь вскользь. Однако, когда он падает на поверхность, он распределяется одинаково во всех направлениях, то есть его яркость одинакова вне зависимости от того, с какой стороны вы смотрите на поверхность. Вероятно, любой свет, исходящий из определенного направления или позиции, имеет диффузный компонент. Зеркальный свет исходит из определенного направления и отражается от поверхности в определенном направлении. При отражении хорошо сфокусированного лазерного луча от качественного зеркала происходит почти 100 процентное зеркальное отражение. Блестящий метал или пластик имеет высокий зеркальный компонент, а кусок ковра или плюшевая игрушка – нет. Вы можете думать о зеркальности как о том, насколько блестящим выглядит материал. Помимо фонового, диффузного и зеркального цветов, материалы могут также иметь исходящий цвет, имитирующий свет, исходящий от самого объекта. В модели освещения OpenGLисходящий свет поверхности добавляет объекту интенсивности, но на него не влияют никакие источники света, и он не производит дополнительного света для сцены в целом. Хотя источник света излучает единое распределение частот, фоновый, диффузный и зеркальный компоненты могут быть различны. Например, если в вашей комнате красные стены и белый свет, то этот свет, отражаясь от стен будет скорее красным, чем белым (несмотря на то, что падающий на стену свет – белый). OpenGL позволяет устанавливать значения красного, зеленого и синего независимо для каждого компонента света. Цвет материала и света. Модель освещения OpenGL делает допущение о том, что цвет материала зависит от долей падающего красного, зеленого и синего света, которые он отражает. Например, максимально красный шар отражает весь красный свет, который на него падает и поглощает весь зеленый и синий. Если вы посмотрите на такой мяч под белым светом (состоящим из одинакового количества красного, зеленого и синего), весь красный свет отразится, и вы увидите красный мяч. Если смотреть на мяч при красном свете, он также будет выглядеть красным. Если, однако, посмотреть на него под зеленым светом, он будет выглядеть черным (весь зеленый свет поглотится, а красного нет, то есть никакой свет отражен не будет). Также как и свет, материалы имеют разные фоновый, диффузный и зеркальный цвета, которые задают реакцию материала на фоновый, диффузный и зеркальный компоненты света. Фоновый цвет материала комбинируется с фоновым компонентом всех источников света, диффузный цвет с диффузным компонентом, а зеркальный с зеркальным. Фоновый и диффузный цвета задают видимый цвет материала, они обычно близки, если не эквивалентны. Зеркальный цвет обычно белый или серый. Он задет цвет блика на объекте (то есть он может совпадать с зеркальным компонентом источника света). 33 Цветовые компоненты, задаваемые для источников света, означают совсем не то же самое, что для материалов. Для источника света число представляет собой процент от полной интенсивности каждого цвета. Если R, G и B – величины цвета источника света все равны 1.0, свет будет максимально белым. Если величины будут равны 0.5, свет все равно останется белым, но лишь с половиной интенсивности (он будет казаться серым). Если R=G=1 и B=0 (полный красный, полный зеленый, отсутствие синего), свет будет желтым. Для материалов числа соответствуют отраженным пропорциям этих цветов. Так что, если для материала R=1, G=0.5 и B=0, этот материал отражает весь красный свет, половину зеленого и совсем не отражает синего. Другими словами, если обозначить компоненты источника света как (LR, LG, LB), а компоненты материала как (MR, MG, MB) и проигнорировать все остальные взаимодействия, то свет, который поступит в глаз можно определить как (LR–MR, LG–MG, LB–MB). Похожим образом, если два источника света с характеристиками (R1, G1, B1) и (R2, G2, B2) направлены в глаз, OpenGL сложит компоненты: (R1+R2, G1+G2, B1+B2). Если какая-либо из сумм будет больше 1 (соответствуя цвету, который нельзя отобразить), компонент будет урезан до 1. Включение фонового освещения. По умолчанию освещение отключено. Включается оно командой glEnable(GL_LIGHTING). Без освещения работать практически невозможно. Сфера всегда будет показываться как круг, а конус - как круг или треугольник. Если монотонное тело у равномерно освещено, то увидеть его рельеф невозможно. Поэтому необходимо использовать источники света. Когда освещение разрашаное, то можно устанавливать фоновую освещенность. По умолчанию, значение фоновой освещенности равно (0.2, 0.2, 0.2, 1). Фоновое освещение устанавливается с помощью функции glLightModel. Если повысить фоновое освещение до (1,1,1,1), т.е. до максимума, то включать источники света не понадобится. Их действие просто не будет заметно, т.к. объект уже максимально освещен Добавление в функцию main вызов следующей функции позволит установить фоновое освещение. float ambient[4] = {0.5, 0.5, 0.5, 1}; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient); Задание параметров материала. Материал может рассеивать, отражать и излучать свет. Свойства материала устанавливаются при помощи функции glMaterialfv(GLenum face, GLenum pname, GLtype* params) Первый параметр определяет грань, для которой устанавливаются свойства. Он может принимать одно из следующих значений: GL_BACK задняя грань GL_FONT передняя грань GL_FRONT_AND_BACK обе грани Второй параметр функции glMaterialfv определяет свойство материала, которое будет установлено, и может принимать следующие значения. GL_AMBIENT рассеянный свет GL_DIFFUSE тоже рассеянный свет, пояснения смотри ниже GL_SPECULAR отраженный свет GL_EMISSION излучаемый свет GL_SHININESS степень отраженного света GL_AMBIENT_AND_DIFFUSE оба рассеянных света 34 Ambient и diffuse переводятся на русский как "рассеянный". Разница между ними не очень понятна. Я использую только GL_DIFFUSE. Третий параметр определяет цвет соответствующего света, кроме случая GL_SHININESS. Цвет задается в виде массива из четырех элементов - RGBA. В случае GL_SHININESS params указывает на число типа float, которое должно быть в диапазоне от 0 до 128. Создание, позиционирование и включение одного или более источников света. В разговорной речи источники света часто именуются просто лампами. Все параметры лампы задаются с помощью функции glLight, которая имеет следующий прототип: void glLight[if][v]( GLenum light, GLenum pname, GLfloat param) Буква v в названии функции определяет, используется ли векторная версия команды. Первый аргумент определяет номер лампы. Его можно задавать двумя способами. Первый - явно указать GL_LIHGTi, где GL_LIGHTi предопределено в файле gl.h следующим образом: /* LightName */ #define GL_LIGHT0 0x4000 #define GL_LIGHT1 0x4001 #define GL_LIGHT2 0x4002 #define GL_LIGHT3 0x4003 #define GL_LIGHT4 0x4004 #define GL_LIGHT5 0x4005 #define GL_LIGHT6 0x4006 #define GL_LIGHT7 0x4007 Второй способ - GL_LIGHT0 + i, где i номер лампы. Такой способ используется, когда существует необходимость в цикле изменять параметры ламп. Второй аргумент определяет имя параметра, а третий его значение. С помощью следующих функций разрешаем освещение и включаем нулевую лампу. glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); Массивы pos и dir содержат координаты местоположения лампы и направления, куда она светит. Массив dir содержит три координаты - x,y,z. Массив pos - четыре, назначение четвертого мне не очень ясно. Если его значение отличается от нуля, то изображение вполне логичное получается. Если же он ноль, то получается что-то непотребное. По умолчанию цвет всех источников света кроме GL_LIGHT0 – черный. glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir); После настройки параметров источника света его нужно активизировать командой glEnable(). |