Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Задание графических примитивов




Все геометрические примитивы в OpenGL задаются в терминах вершин. Каждая вершина задаётся набором чисел, определяющих её координаты в пространстве.

OpenGL работает с однородными координатами (x, y, z, w). Если координата z не задана, то она считается равной нулю. Если координата w не задана, то она считается равной единице.

Под линией в OpenGL подразумевается отрезок, заданный своими начальной и конечной вершинами.

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

Все геометрические объекты в OpenGL задаются посредством вершин, а сами вершины задаются процедурой

 

glVertex{2 3 4}{s i f d}[v](TYPE x, …),

 

где реальное количество параметров определяется первым суффиксом (2, 3 или 4), а суффикс v означает, что в качестве единственного аргумента выступает массив, содержащий необходимое количество координат. Например:

 

glVertex2s(1, 2);

glVertex3f(2.3, 1.5, 0.2);

GLdouble vect[] = {1.0, 2.0, 3.0, 4.0};

glVertex4dv(vect);

 

Для задания геометрических примитивов необходимо как-то выделить набор вершин, определяющих этот объект. Для этого служат процедуры glBegin() иglEnd(). Процедура glBegin(GLenum mode) обозначает начало списка вершин, описывающих геометрический примитив. Тип примитива задаётся параметром mode, который принимает одно из следующих значений:

GL_POINTS – набор отдельных точек;

GL_LINES – пары вершин, задающих отдельные точки;

GL_LINE_STRIP – незамкнутая ломаная;

GL_LINE_LOOP – замкнутая ломаная;

GL_POLYGON – простой выпуклый многоугольник;

GL_TRIANGLES – тройки вершин, интерпретируемые как вершины отдельных треугольников;

GL_TRIANGLE_STRIP – связанная полоса треугольников;

GL_TRIANGLE_FAN – веер треугольников;

GL_QUADS – четвёрки вершин, задающие выпуклые четырёхугольники;

GL_QUAD_STRIP – полоса четырёхугольников.

Процедура glEnd() отмечает конец списка вершин.

Между командами glBegin() и glEnd() могут находится команды задания различных атрибутов вершин: glVertex(), glColor(), glNormal(),glCallList(), glCallLists(), glTexCoord(), glEdgeFlag(), glMaterial(). Между командами glBegin() и glEnd() все остальные команды OpenGL недопустимы и приводят к возникновению ошибок.

Рассмотрим в качестве примера задание окружности:

glBegin(GL_LINE_LOOP);

for (int i = 0; I < N; i++)

{

float angle = 2 * M_PI * i / N;

glVertex2f(cos(angle), sin(angle));

}

glEnd();

Хотя многие команды могут находиться между glBegin() и glEnd(), вершины генерируются при вызове glVertex(). В момент вызова glVertex()OpenGL присваивает создаваемой вершине текущий цвет, координаты текстуры, вектор нормали и т. д. Изначально вектор нормали полагается равным (0, 0, 1), цвет полагается равным (1, 1, 1, 1), координаты текстуры полагаются равными нулю.

 

OpenGL. Координатные преобразования: устройство и использование.

 

Преобразования координат и проекции

В OpenGL используются как основные три системы координат: левосторонняя, правосторонняя и оконная. Первые две системы являются трехмерными и отличаются друг от друга направлением оси z: в правосторонней она направлена на наблюдателя, а в левосторонней – в глубь экрана. Расположение осей x и y аналогично описанному выше. Левосторонняя система используется для задания значений параметрам команды gluPerspective(), glOrtho(), которые будут рассмотрены ниже, а правосторонняя или мировая система координат во всех остальных случаях. Отображение трехмерной информации происходит в двумерную оконную систему координат.

Для задания различных преобразований объектов сцены в OpenGL используются операции над матрицами, при этом различают три типа матриц: видовая, проекций и текстуры. Все они имеют размер 4x4. Видовая матрица определяет преобразования объекта в мировых координатах, такие как параллельный перенос, изменение масштаба и поворот. Матрица проекций задает как будут проецироваться трехмерные объекты на плоскость экрана (в оконные координаты), а матрица текстуры определяет наложение текстуры на объект.

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

void glMatrixMode(GLenum mode)

 

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

Для определения элементов матрицы текущего типа вызывается команда

void glLoadMatrix[f d](GLtype *m)

где m указывает на массив из 16 элементов типа float или double в соответствии с названием команды, при этом сначала в нем должен быть записан первый столбец матрицы, затем второй, третий и четвертый.

Команда

void glLoadIdentity(void)

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

void glPushMatrix(void)

void glPopMatrix(void)

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

Для умножения текущей матрицы слева на другую матрицу используется команда

void glMultMatrix[f d](GLtype *m)

где m должен задавать матрицу размером 4x4 в виде массива с описанным расположением данных. Однако обычно для изменения матрицы того или иного типа удобно использовать специальные команды, которые по значениям своих параметров создают нужную матрицу и перемножают ее с текущей. Чтобы сделать текущей созданную матрицу, надо перед вызовом этой команды вызвать glLoadIdentity().

В целом, для отображения трехмерных объектов сцены в окно приложения используется следующая последовательность действий:Координаты объекта => Видовые координаты => Усеченные координаты => Нормализованные координаты => Оконные координаты

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...