Учебник Фамилия, имя, отчество




НазваниеУчебник Фамилия, имя, отчество
страница8/12
Дата18.04.2013
Размер1.59 Mb.
ТипУчебник
1   ...   4   5   6   7   8   9   10   11   12

Масштабирование

Так как границы области вывода лежат в пределах от –1 до 1, это может привести к неудобству при подготовке изображений. OpenGL предоставляет удобное средство на этот случай – масштабирование.

Для изменения масштаба используется команда glScalef с тремя аргументами, представляющими собой масштабные множители для каждой из осей. При двумерных построениях значение коэффициента по оси Z безразлично.

Например, если перед командными скобками вставим строку:

glScalef (0.5, 0.5, 1.0);,

то будет нарисована уменьшенная в два раза фигура.

После команд рисования необходимо восстановить нормальный масштаб, т. е. в данном случае добавить строку:

glScalef (2.0, 2.0, 1.0);.

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

Масштабные множители могут иметь отрицательные значения, при этом изображение переворачивается по соответствующей оси.

Поворот

Для поворота используется команда glRotatef с четырьмя аргументами: угол поворота, в градусах, и вектор поворота – три вещественных числа. При положительном значении компоненты вектора поворот осуществляется против часовой стрелки. Поворот действует на все последующие команды воспроизведения, так что при необходимости текущее состояние восстанавливается обратным поворотом.

Нарисуем повернутый на 45 градусов квадрат – то есть ромб:

glRotatef (45, 0.0, 0.0, 1.0);

glBegin (GL_POLYGON);

glVertex2f (-0.6, -0.1);

glVertex2f (-0.6, 0.4);

glVertex2f (-0.1, 0.4);

glVertex2f (-0.1, -0.1);

glEnd;

glRotatef (-45, 0.0, 0.0, 1.0);

Результат работы программы приведен на рис. 3.6.

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



Рис. 3.6. Ромб


Перенос

Перенос точки зрения (системы координат) осуществляется командой glTranslatef с тремя аргументами – величинами переноса для каждой из осей.

glTranslatef (0.4, 0.1, 0,0);


3.5. Построения в пространстве в OpenGL


Простой пример построения в пространстве

Попробуем нарисовать что-нибудь объемное, например, куб. Для придания трехмерности сцене поворачиваем ее по осям:

glTranslatef (0.0, 0.0, -8.0); // перенос объекта – ось Z

glRotatef (30.0, 1.0, 0.0, 0.0); // поворот объекта – ось X

glRotatef (70.0, 0.0, 1.0, 0.0); // поворот объекта – ось Y

Построение куба сводится к построению шести квадратов, отдельно для каждой стороны фигуры:

glBegin (GL_QUADS);

glVertex3f (1.0, 1.0, 1.0);

glVertex3f (-1.0, 1.0, 1.0);

glVertex3f (-1.0, -1.0, 1 0);

glVertex3f (1.0, -1.0, 1.0);

glEnd;


glBegin (GL_QUADS);

glVertex3f (1.0, 1.0, -1.0);

glVertex3f (1.0, -1.0, -1.0);

glVertex3f (-1.0, -1.0, -1.0);

glVertex3f (-1.0, 1.0, -1.0);

glEnd;

glBegin (GL_QUADS);

glVertex3f (-1.0, 1.0, 1.0);

glVertex3f (-1.0, 1.0, -1.0);

glVertex3f (-1.0, -1.0, -1.0);

glVertex3f (-1.0, -1.0, 1.0);

glEnd;

glBegin (GL_QUADS);

glVertex3f (1.0, 1.0, 1.0);

glVertex3f (1.0, -1.0, 1.0);

glVertex3f (1.0, -1.0, -1.0);

glVertex3f (1.0, 1.0, -1.0);

glEnd;

glBegin (GL_QUADS);

glVertex3f (-1.0, 1.0, -1.0);

glVertex3f (-1.0, 1.0, 1.0);

glVertex3f (1.0, 1.0, 1,0);

glVertex3f (1.0, 1.0, -1.0);

glEnd;

glBegin(GL_QUADS);

glVertex3f (-1.0, -1.0, -1.0);

glVertex3f (1.0, -1.0, -1.0);

glVertex3f (1.0, -1.0, 1.0);

glVertex3f (-1.0, -1.0, 1.0);

glEnd;

Результат работы программы приведен на рис. 3.7.



Рис. 3.9. Сфера

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

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

glEnable (GL_LIGHTING); // разрешаем работу с

освещенностью

glEnable (GL_LIGHT0); // включаем источник света

Это минимальные действия для включения источника света. Теперь в сцене присутствует один источник света с именем 0.

При необходимости можно “установить” несколько источников, для этого точно так же используется команда glEnable, например:

glEnable (GL_LIGHT1); // включаем источник света 1

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

glBegin(GL_QUADS);

glNormal3f(0.0, 0.0, 1.0);

glVertex3f(1.0, 1.0, 1.0);

glVertex3f(-1.0, 1.0, 1.0);

glVertex3f(-1.0, -1.0, 1.0);

glVertex3f(1.0, -1.0, 1.0);

glEnd;

glBegin(GL_QUADS);

glNormal3f(-1.0, 0.0, 0.0);

glVertex3f(-1.0, 1.0, 1.0);

glVertex3f(-1.0, 1.0, -1.0);

glVertex3f(-1.0, -1.0, -1.0);

glVertex3f(-1.0, -1.0, 1.0);

glEnd;

glBegin(GL_QUADS);

glNormal3f(0.0, 1.0, 0.0);

glVertex3f(-1.0, 1.0, -1.0);

glVertex3f(-1.0, 1.0, 1.0);

glVertex3f(1.0, 1.0, 1.0);

glVertex3f(1.0, 1,0, -1.0);.

glEnd;

Результат работы программы приведен на рис. 3.8.



Рис. 3.8. Включен источник света


Надстройки над OpenGL

Существует несколько надстроек над OpenGL, представляющих собой набор готовых команд для упрощения кодирования. Стандартной надстройкой, поставляемой вместе с OpenGL, является библиотека glu, физически рас­полагающаяся в файле glu32.dll.

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

Для упрощения построений некоторых поверхностей второго порядка вво­дится серия команд, основой которых являются квадратичные (quadric) объекты – собственный тип этой библиотеки.

Для работы с командами библиотеки glu вводится переменная специального типа:

quadObj : GLUquadricObj;

Сначала необходимо создать quadric-объект:

quadObj := gluNewQuadric;


Режим воспроизведения объекта задается командой gluQuadricDrawStyle, первым аргументом команды указывается имя quadric-объекта. По умолча­нию стиль задается сплошным, так что чаще всего нет надобности вызывать эту команду. Она также является аналогом команды glPolygonMode.

По окончании работы память, используемую quadric-объектами, необходимо освобождать:

gluDeleteQuadric (quadObj); // удаление объекта

Приведем некоторые примеры команд рисования quadric-объектов.

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

gluDisk (quadObj, 0.0, 1.5, 10, 5); // построение диска

Команда gluCylinder предназначена для построения цилиндров и конусов. Параметры команды следующие: имя объекта, радиусы основания и верхней части и два числа, задающих частоту разбиения:

gluCylinder (quadObj, 1.0, 1.0, 1.5, 10, 10); // построение цилиндра

gluCylinder (quadObj, 0.0, 1.0, 1.5, 10, 10); // построение конуса


Команда gluSphere упрощает построение сферы. У нее четыре аргумента, второй аргумент является радиусом сферы, остальные па­раметры традиционны для этой серии команд:

gluSphere (quadObj, 1.5, 10, 10); // построение сферы (рис. 3.9)



Рис. 3.9. Сфера

Помимо стан­дартной библиотеки glu наиболее популярной является библиотека glut. Для программистов, пишущих на языке С, эта библиотека особенно привле­кательна, поскольку является независимой от операционной системы. Ее применение значительно упрощает кодирование программ, поскольку вся черновая работа по созданию окна, заданию формата пиксела, получению контекстов и т.д. выполняется с помощью вызовов библиотечных функций. Программисты, работающие с Delphi, также могут пользоваться этой биб­лиотекой. Однако при программи­ровании на Delphi мы не получим независимости от операционной систе­мы, а из команд библиотеки чаще всего программистов интересует только набор функций для построения некоторых объемных фигур. Библиотека содержит команды воспроизведения куба, сферы, тора, конуса и некоторых правильных многогранников, таких как тетраэдр и додекаэдр.

Библиотека glu предоставляет набор команд, позволяющих использовать NURBS-поверхности. Для работы с NURBS-поверхностями в библиотеке glu имеются переменные специального типа, используемые для идентификации объектов:

theNurb : gluNurbsObj ;

Для манипулирования свойствами таких объектов предусмотрена специаль­ная команда библиотеки. Гладкость кривой или поверхности задается допуском дискретизации: чем меньше это число, тем поверхность получается более гладкой:

gluNurbsProperty (theNurb, GLO_SAMPLING_TOLERANCE, 25.0);

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

Построение кривой осуществляется командой gluNurbsCurve:

gluNurbsCurve (theNurb, 8, @curveKnots, 3, @ctrlpoints, 4, GL_MAP1_VERTEX_3) ;

Первый аргумент – имя NURBS-объекта, вторым аргументом задается ко­личество параметрических узлов кривой, третий аргумент – указатель на массив, хранящий значения этих узлов. Четвертый параметр – смещение, т. е. сколько вещественных чисел содержится в порции данных, далее следу­ет указатель на массив опорных точек. Шестой аргумент равен порядку (степени) кривой плюс единица. Последний аргумент – символическая константа, задающая тип поверхности.


3.6. Визуальные эффекты в OpenGL


Свойства материала

Свойства материала задаются с помощью команды glMaterial. Характе­ристики, определяющие оптические свойства материала, и соответству­ющие им символьные константы являются следующими: рассеянный цвет (GL_AMBIENT), диффузный цвет (GL_DIFFUSE), зеркальный цвет (GL_SPECULAR), излучаемый цвет (GL_EMISSION), степень зеркального отражения (GL_SHININESS).



Рис. 3.10. Классический пример, иллюстрирующий свойство материала

Сфера в первом ряду и первой колонке нарисована с отключенными фоновой и зеркальной составляющими материала. Первый ряд, вторая колонка – диффузное и зеркальное освещение, следующая сфера более блестящая. Последняя сфера первого ряда – включены диффузия и эмиссия.

Фоновая и диффузная составляющие включены для первой сферы второй линии, нет зеркальной составляющей. Вторая и третья сферы – все включено, кроме эмиссии, различаются размером блика. У последней сферы второго ряда отсутствует зеркальная составляющая.

Сферы последней линии отличаются усиленностью цветовой насыщенности составляющих свойств материала.

Туман

Туман является самым простым в использовании спецэффектом, предна­значенным для передачи глубины пространства. Он позволяет имитировать атмосферные эффекты дымки и собственно тумана. При его использовании объекты сцены перестают быть чересчур яркими и становятся более реалистичными, естественными для восприятия.



Рис. 3.11. Пример на использование тумана

Рис. 3.11 демонстрирует использования тумана: пять чайников, располагающихся от наблюдателя на различном удалении, атмосфера на­полнена дымом.

Цвет дыма в примере задается серым, что является обычным значением при использовании тумана:

fogColor: array [0..3] of GLfloat = (0.5, 0.5, 0.5, 1.0);

При инициализации задаем параметры дымки:

glEnable(GL_FOG); // включаем режим тумана

fogMode := GL_EXP; // переменная, хранящая режим тумана

glFogi(GL_FOG_MODE, fogMode); // задаем закон смешения тумана

glFogfv(GL_FOG_COLOR, @fogColor); // цвет дымки

glFogf(GL_FOG_DENSITY, 0.35); // плотность тумана

glHint(GL_FOG_HINT, GL_DONT_CARE); // предпочтений к работе

тумана нет

Текстура

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

Рассмотрим применение одномерной текстуры на примере: на шар накладываются чередую­щиеся красные и синие полоски.

В процедуре MakeTexImage подготавливается массив образа текстуры, а также задаются все связанные с ней параметры:

var

TexWidth : GLint = 16; // ширина текстуры

GenSOn : Boolean = True; // генерировать ли координату s

// параметром процедуры является требуемая ширина текстуры,

// число должно быть степенью двойки

procedure MakeTexImage (TexImageWidth : GLint);

const // параметры текстуры

TexParams : Array [0..3] of GLfloat = (0.0, 0.0, 1.0, 0.0);

var

TexImage : Array [0..128 * 3] of GLUbyte; // массив текстуры

j : GLint; // вспомогательная переменная

begin

j := 0; // чередование красной и синей полосок

While j < TexImageWidth * 3 – 1 do begin // заполнение массива

образа

TexImage [j] := 255; // красный

TexImage [j + 1] := 0; // зеленый

TexImage [j + 2] := 0; // синий

TexImage [j + 3] := 0; // красный

TexImage [j + 4] := 0; // зеленый

TexImage [j + 5] := 255; // синий

Inc (j, 6);

end;

// эти команды должны вызываться обязательно

glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

// собственно создание текстуры

glTexImage1D (GL_TEXTURE_1D, 0, 3, TexImageWidth, 0, GL_RGB,

GL_UNSIGNED_BYTE, @TexImage);

// генерировать ли координату s

If GenSOn

then glEnable (GL_TEXTURE_GEN_S)

else glDisable (GL_TEXTURE_GEN_S);

// уточняем параметры для координаты s, чтобы текстура не выглядела, как штриховка многоугольников

glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

glTexGenfv (GL_S, GL_OBJECT_PLANE, @TexParams); // для поворота полосок

glEnable (GL_TEXTURE_1D); // включаем текстуру

end;

Здесь использован почти минимальный набор действий, которые необходи­мо выполнить, чтобы пользоваться текстурой; единственное, что можно уда­лить в этом коде, это строки, связанные с координатой s, но тогда пропадет возможность разворачивать полоски текстуры (рис. 3.12).




Рис. 3.12. Слева – с генерацией координаты s текстуры, справа – без нее

Массив образа содержит значения RGB, задающие узор полосок. Команда glTexParameter позволяет задавать параметры текстуры. Минимум, что надо сделать – задать значения для фильтров.

Фильтры задают вид текстуры, когда площадь пиксела, на которую она на­кладывается, в одном случае больше, а в другом меньше элемента текстуры. Эти значения заданы равными GL_NEAREST, что соответствует неточному рас­чету текстуры. Другое возможное значение – GL_LINEAR, расчет будет точ­ным, но за счет скорости.

Команда glTexImage1D вызывается каждый раз, когда надо задавать текстуру. Для одномерной текстуры нужно использовать именно эту команду. Ее пер­вый параметр указывает на размерность, значение второго параметра, числа уровней детализации текстуры, следует задавать равным ну­лю. Третий параметр задается равным трем или четырем для сохранения цвета, остальные значения приведут к потере цвета полосок. Дальше идет ширина текстуры; как видно из примера, она не обязательно должна совпа­дать с размером массива. Пятый параметр – ширина границы. Шестой параметр задает формат данных, смысл ос­тальных параметров понятен.

С текстурой связан набор координат, чаще всего требуется работать с координатами s и t.

Группа команд glTexGen предназначена для установки функции, используе­мой для генерации координат текстуры. Если этого не делать, то значение, задаваемое по умолчанию, приведет к тому, что текстура будет вести себя подобно штриховке, т. е. не будет приклеена к поверхности. В примере взяты значения аргументов команды, чаще всего используемые на практике.

Перед построением объектов вызывается команда, связанная с наложением текстуры на quadric-объекты:

gluQuadricTexture (Quadric, TRUE);

Эта команда задает, генерировать ли координаты текстуры для таких объектов. Если удалить эту строку, то при отключенной генерации координаты s текстуры quadric-объекты (сфера и цилиндр) не будут покрыты текстурой.

1   ...   4   5   6   7   8   9   10   11   12

Похожие:

Учебник Фамилия, имя, отчество iconФамилия Имя Отчество Занимаемая

Учебник Фамилия, имя, отчество iconФамилия, имя, отчество члена летного экипажа

Учебник Фамилия, имя, отчество iconФамилия, имя отчество члена летного экипажа

Учебник Фамилия, имя, отчество iconКурс Вакантные места Фамилия, имя и отчество заявителя Основание

Учебник Фамилия, имя, отчество iconРезюме фамилия Имя Отчество
Образование: Высшее: Рудненский индустриальный институт. Специальность: Автоматизация и
Учебник Фамилия, имя, отчество iconОбщеобразовательная школа
Фамилия, имя, отчество контактного лица по вопросам инновационной деятельности в образовательном учреждении
Учебник Фамилия, имя, отчество iconФамилия, имя, отчество
Заместитель начальника корпусно-сварочного цеха ОАО «ссрз имени 111 Интернационала»
Учебник Фамилия, имя, отчество iconФамилия Имя Отчество
Необходимое техническое оборудование: презентация осенних пейзажей,запись "Времен года" Чайковского
Учебник Фамилия, имя, отчество iconАнкета Ваши Фамилия Имя Отчество
Комплекс товарного выращивания осетровых в системе замкнутого водообеспечения (узв)
Учебник Фамилия, имя, отчество iconРезюме Фамилия Имя Отчество
Личными качествами считаю: добросовестность, ответственность, исполнительна, целеустремленная, хорошая работоспособность
Разместите кнопку на своём сайте:
Библиотека


База данных защищена авторским правом ©lib.znate.ru 2014
обратиться к администрации
Библиотека
Главная страница