2.2 Графические примитивы Все графические примитивы задаются с помощью вершин (vertices) – координат, определяющих точки, концы сегментов линий и углы многоугольников.
Графические примитивы: точки, линии, многоугольники.
Вершина задается с помощью функции glVertex3d (x, y, z).
Для каждого типа примитива набор вершин заключается в операторные скобки – команды glBegin() и glEnd(). Аргумент функции glBegin() определяет тип описываемого вершинами графического примитива.
В роли аргумента могут выступать следующие значения:
GL_POINTS – отдельные точки;
GL_LINES – каждая пара вершин задает отрезок;
GL_LINES_STRIP – серия соединенных отрезков;
GL_LINE_LOOP – серия соединенных отрезков, последняя точка соединяется с первой;
GL_TRIANGLES – тройка вершин задает треугольник;
GL_TRIANGLE_STRIP – рисуются треугольники с общей стороной;
GL_TRIANGLE_FAN – рисуются треугольники с общей стороной, другой способ соединения сторон;
GL_QUADS – четыре вершины задают четырехугольник;
GL_QUAD_STRIP – четырехугольники с общей стороной;
GL_POLYGON – рисуется простой правильный многоугольник.
Для изменения размера отображаемой точки используется команда glPointSize(), аргументом которой является нужный размер в пикселах.
Функция glLineWidth() задает толщину отображаемой линии.
По умолчанию многоугольники рисуются со сплошной закраской, но их можно рисовать в виде контура или в виде точек в вершинах. Закраска многоугольника может быть сплошной или фактурной по некоторому заданному образцу. Если соседние многоугольники имеют общие границы или вершины, пикселы на границах или вершинах рисуются всего один раз – они принадлежат только одному многоугольнику – с той целью, чтобы у частично прозрачных многоугольников границы не рисовались дважды.
Многоугольники имеют две стороны – лицевую и оборотную, которые могут быть отрисованы различно, в зависимости от того, какая сторона сейчас видна. Это позволяет получать такой разрез сплошных объектов, где ясно различаются внутренние и внешние части. По умолчанию обе поверхности рисуются одинаково. Для изменения режима по умолчанию или рисования только контура или вершин используется функция glPolygonMode(face, mode). Первый аргумент определяет сторону отрисовки: лицевую, внутреннюю или обе одновременно. Второй аргумент задает режим отрисовки: точками, линиями или заполнением.
2.3 Векторы нормали Вектор нормали – перпендикулярный к поверхности вектор. Для плоских поверхностей это направление одинаково для всех точек, но для кривых поверхностей оно может быть различным. OpenGL позволяет определять нормали для каждой вершины или каждого многоугольника. Вершины одного многоугольника могут иметь одинаковые или различные нормали.
Векторы нормалей для объектов определяют ориентацию их поверхностей в пространстве – в частности, относительно источников света. Эти векторы используются OpenGL для расчета, сколько света получает объект в вершинах.
Функция glNormal() используется для установки текущей нормали, определяемой значением аргумента. Последующие вызовы glVertex() связывают определяемые вершины с текущей нормалью.
В любой точке поверхности есть два перпендикулярных вектора, направленных в противоположных направлениях. Нормалью считается тот, что ориентирован вовне от моделируемой поверхности. Векторы нормали нормируются каждый раз при выполнении модельных преобразований – при повороте и параллельном переносе. Можно автоматически нормализовать векторы нормали с помощью команды glEnable(GL_NORMALIZE).
2.4 Модельные преобразования В OpenGL определены три команды модельных преобразований: glTranslate(), glRotate(), glScale(). Эти функции трансформируют объект (или систему координат, если думать об изменении системы координат, а не объекта) посредством сдвига, вращения и масштабирования.
Перенос.
void glTranslate{fd} (TYPE x, TYPE y, TYPE z);
Умножает текущую матрицу на матрицу, передвигающую (переносящую) объект на расстояния x, y, z, переданные в качестве аргументов команды, по соответствующим осям (или перемещает локальную координатную систему на те же расстояния).
Поворот.
void glRotate{fd} (TYPE angle, TYPE x, TYPE y, TYPE z);
Умножает текущую матрицу на матрицу, которая поворачивает объект (или локальную координатную систему) в направлении против часовой стрелки вокруг луча из начала координат, проходящего через точку (x, y, z). Параметр angle задает угол поворота в градусах.
Масштабирование.
void glScale{fd} (TYPE x, TYPE y, TYPE z);
Умножает текущую матрицу на матрицу, которая растягивает, сжимает или отражает объект вдоль координатный осей. Каждая x -, y- и z- координата каждой точки объекта будет умножена на соответствующий аргумент x, y или z команды glScale*(). При рассмотрении преобразования с точки зрения локальной координатной системы, оси этой системы растягиваются, сжимаются или отражаются с учетом факторов x, y и z, и ассоциированный с этот системой объект меняется вместе с ней.
glScale*() – это единственная из трех команд модельных преобразований, изменяющая размер объекта: масштабирование с величинами более 1.0 растягивает объект, использование величин меньше 1.0 сжимает его. Масштабирование с величиной -1.0 отражает объект относительно оси или осей. Единичными аргументами (то есть аргументами, не имеющими эффекта) являются (1.0, 1.0, 1.0). Следует ограничивать использование glScale*() теми случаями, когда это действительно необходимо. Использование glScale*() снижает быстродействие расчетов освещенности, так как вектора нормалей должны быть нормализованы заново после преобразования.
|