Смекни!
smekni.com

Трехмерная графика OpenGL (стр. 2 из 3)

Команда glLoadIdentity заменяет текущую матрицу единичной матрицей (матрицей с единицами по главной диагонали и равными нулю всеми остальными элементами).


1.6 Аффинные преобразования

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

Преобразование масштабирования увеличивает или уменьшает размеры объекта.

Команда масштабирования glScale (arg1, arg2, arg3) с тремя аргументами – коэффициентами масштабирования по каждой из осей.

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

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

1.6.2 Поворот

Для поворота изображения используется команда

glRotate (arg1, arg2, arg3, arg4)

с четырьмя аргументами:

arg1 – угол поворота (в градусах),

arg2, arg3, arg4 – вектор поворота.

1.6.3 Сдвиг

Преобразование сдвига смещает точки в новые позиции в соответствии с заданным вектором смещения. Перенос системы координат осуществляется командой

glTranslate (arg1, arg2, arg3)

arg1, arg2, arg3 – величины переноса по каждой из осей.

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

1.7 Закрашивание объектов сцены

В трёхмерном пространстве поверхность объектов характеризуется материалом. Материал может отражать, поглощать и пропускать свет различной длины волн. В зависимости от характеристик материала и от свойств источника света мы видим объекты различными. Свойства материала задаются с помощью команды glMaterialfv(). Характеристики свойств материала, определяют соответствующие им символьные константы, которые представлены в таблице 1.3.

Таблица 1.3. Характеристики свойств материала

GL_AMBIENT рассеянный свет
GL_DIFFUSE Параметр, указывающий насколько сильно этот цвет отражается поверхностью при её освещении
GL_EMISSION излучаемый свет
GL_SHININESS степень отраженного света

Зеркальный цвет задаёт цветовую гамму бликов материала, степень зеркального отражения определяет, насколько близка поверхность к идеальному зеркалу (определяется числом из интервала [0,128]).

Свойства материала задаются для внешней и внутренней стороны фигуры.

glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,@MaterialFront);

glMaterialfv (GL_BACK, GL_AMBIENT_AND_DIFFUSE,@MaterialBack);

Существует несколько режимов рисования многоугольников.

Чтобы изменить метод отображения многоугольника используется команда:

glPolygonMode (GLenum face, Glenum mode)

Параметр mode определяет, как будут отображаться многоугольники, а параметр face устанавливает тип многоугольников, к которым будет применяться эта команда и могут принимать следующие значения:

Таблица 1.4. Значения параметров face и mode

GLenum face GL_FRONT для лицевых граней
GL_BACK для обратных граней
GL_FRONT_AND_BACK для всех граней
Glenum mode GL_POINT Отображаются вершины многоугольников
GL_LINE представляется набором отрезков
GL_FILL закрашиваются текущим цветом с учетом освещения и этот режим установлен по умолчанию.

Пример:

GlPolygonMode (GL_FRONT, GL_POINT);

GlPolygonMode (GL_ BACK, GL_LINE);

GlPolygonMode (GL_FRONT_AND_BACK, GL_FILL);

1.8 Источники света

Без источника света изображения не видно. По умолчанию освещение отключено. Что бы инициализировать источник, и включить обработчик расчёта воздействия источника на объекты достаточно выполнить команды:

glEnable (gl_lighting);

glEnable (gl_light0);

Источник света по умолчанию располагается в пространстве с координатами (0,0,¥), можно создавать источник света в любой точке пространства изображений.

Параметры источника света задаются с помощью команды,

glLightfv (source, parameter, pointer_to_array).

Первый параметр команды – идентификатор источника

Второй аргумент – символическая константа, задающая атрибут

Третий – ссылка на структуру, содержащую задаваемые значения для данного атрибута.

Таблица 1.5. Константы, задающие свойства окружающей среды и позицию источника света

GL_Position задаёт позицию источника света, источник света не перемещается за системой координат (x, y, z, cos J)
GL_AMBIENT рассеянный свет
GL_DIFFUSE Параметр, указывающий насколько сильно этот цвет отражается поверхностью при её освещении
GL_SPECULAR отраженный свет
GL_EMISSION излучаемый свет
GL_SHININESS степень отраженного света
GL_AMBIENT_AND_DIFFUSE задаёт поглощение цвета поверхностью в рассеивающей составляющей
GL_SPOT_direction направление света (x, y, z)
GL_SPOT_Cutoff задаёт максимальный угол излучения источника света [0,90] и 180.

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

glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, 1).

Второй аргумент 0 или 1 (вкл. или выкл.).

1.9 Наложение текстуры

Создание текстуры в памяти

После того как образ подготовлен, можно создавать текстуру в памяти. Для этого в OpenGL предусмотрены две команды: одна для одномерного и вторая для двумерного вариантов образа (обе работают только в режиме RGBA).

glTexlmage1D (void glTexlmage2D (

GLenum target, GLenum target,

GLint level, GLint level,

GLint components, GLint components,

GLsizei width, GLsizei width,

GLint border, GLsizei height,

GLenum format, GLint border,

GLenum type, GLenum format,

const GLvoid* pixels) GLenum type,

const GLvoid* pixels)

При создании текстуры можно определить несколько образов с различным разрешением. Если текстура имеет размер 2nx2m, то можно определить max {n, m} + 1 уменьшенных массивов. Первый имеет размер 2nx2m, второй – 2n-1x2m-1, и т.д., пока последний не будет иметь размер 1x1. Команды glTexImage*D предоставляют возможность определить р = max {n, m} таких массивов, в каждом из которых хранится уменьшенный образ исходного изображения. Наличие таких массивов позволит OpenGL использовать меньший образ для меньшего объекта, а больший для большего. Другими словами, чем меньше объект, тем меньше его деталей удается рассмотреть.

Параметры текстуры

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

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

Для учета особенностей текстуры необходимо настроить параметры текстуры, что можно сделать с помощью команды

glTexParameter [i, f, v] (target, pname, param)

target определяет, с какой текстурой предполагается работать, – одномерной или двумерной

pname определяет символическое имя параметра текстуры:

раrат определяет значение для параметра рпаme

1.10 Использование дополнительных библиотек

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

Библиотека GLU

Библиотека GLU уже стала стандартом и поставляется вместе с главной библиотекой OpenGL. В состав этой библиотеки вошли более сложные функции, например для того чтобы определить цилиндр или диск потребуется всего одна команда. Также в библиотеку вошли функции для работы со сплайнами, реализованы дополнительные операции над матрицами и дополнительные виды проекций.

Библиотека GLUT

Это независимая от платформы библиотека. Она реализует не только дополнительные функции OpenGL, но и предоставляет функции для работы с окнами, клавиатурой и мышкой. Для того чтобы работать с OpenGL в конкретной операционной системе, надо провести некоторую предварительную настройку и эта предварительная настройка зависит от конкретной операционной системы. С библиотекой GLUT всё намного упрощается, буквально несколькими командами можно определить окно, в котором будет работать OpenGL, определить прерывание от клавиатуры или мышки и всё это не будет зависеть от операционной системы.