Команда glLoadIdentity заменяет текущую матрицу единичной матрицей (матрицей с единицами по главной диагонали и равными нулю всеми остальными элементами).
1.6.1 Масштабирование
Преобразование масштабирования увеличивает или уменьшает размеры объекта.
Команда масштабирования glScale (arg1, arg2, arg3) с тремя аргументами – коэффициентами масштабирования по каждой из осей.
Если масштабные множители больше единицы объект растягивается в заданном направлении, если меньше объект сжимается. Масштабные множители могут иметь отрицательные значения, при этом изображение переворачивается по соответствующей оси. При двумерных построениях значение коэффициента по оси Z игнорируется.
После команд рисования следует восстановить нормальный масштаб, чтобы каждое следующее обращение к обработчику перерисовки экрана не приводило бы к последовательному уменьшению / увеличению изображения.
1.6.2 Поворот
Для поворота изображения используется команда
glRotate (arg1, arg2, arg3, arg4)
с четырьмя аргументами:
arg1 – угол поворота (в градусах),
arg2, arg3, arg4 – вектор поворота.
Преобразование сдвига смещает точки в новые позиции в соответствии с заданным вектором смещения. Перенос системы координат осуществляется командой
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);
Без источника света изображения не видно. По умолчанию освещение отключено. Что бы инициализировать источник, и включить обработчик расчёта воздействия источника на объекты достаточно выполнить команды:
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 уже стала стандартом и поставляется вместе с главной библиотекой OpenGL. В состав этой библиотеки вошли более сложные функции, например для того чтобы определить цилиндр или диск потребуется всего одна команда. Также в библиотеку вошли функции для работы со сплайнами, реализованы дополнительные операции над матрицами и дополнительные виды проекций.
Это независимая от платформы библиотека. Она реализует не только дополнительные функции OpenGL, но и предоставляет функции для работы с окнами, клавиатурой и мышкой. Для того чтобы работать с OpenGL в конкретной операционной системе, надо провести некоторую предварительную настройку и эта предварительная настройка зависит от конкретной операционной системы. С библиотекой GLUT всё намного упрощается, буквально несколькими командами можно определить окно, в котором будет работать OpenGL, определить прерывание от клавиатуры или мышки и всё это не будет зависеть от операционной системы.