1 Графическое программирование Моделирование 2D сцен с применением OpenGl 1. Интерфейс OpenGL. 2. Синтаксис команд OpenGL. 3. Подключение и работа с библиотеками GL и GLU. 4. Визуализация двумерных объектов. Преподаватель: Татьяна Олеговна Перемитина, к.т.н., доцент каф.АОИ ТУСУР Проверка домашнего задания Используя алгоритм Коэна-Сазерленда, выявить видимые, невидимые и отсекаемые отрезки АВ, СD, EF, GH, IJ, KL. Если известны: А(0000), В(0010), С(0001), D(1001), E (0110), F(0010), G(0000), H(0000), I(1000), J(0010), K(1001), L(1010). Отобразите расположение отрезков относительно окна отсечения. Алгоритм Коэна-Сазерленда Отрезки Коды концов АВ 0000 0010 СD 0001 1001 EF 0110 0010 GH 0000 0000 IJ 1000 0010 KL 1001 1010 Пусть X - код точки-начала отрезка, Y - код точки-конца отрезка, тогда возможны три случая: 1.X = Y = 0000. Этот случай означает, что обе точки лежат внутри прямоугольника (т. е. отсечение не требуется). 2.X and Y ≠ 0. В этом случае точки лежат по одну сторону от какой-либо отсекающей линии (с внешней ее стороны). Следовательно, отрезок полностью лежит вне окна. 3.Если не выполнены условия 1 или 2, то необходимо находить точки пересечения с некоторыми из отсекающих прямых. Для этого разбивают отрезок найденными точками пересечения и затем применяют тот же анализ кодов концов для полученных новых отрезков. Алгоритм Коэна-Сазерленда Случай 1 G = H=0: Отрезок GH Отрезки Коды концов АВ 0000 0010 СD 0001 1001 EF 0110 0010 GH 0000 0000 IJ 1000 0010 KL 1001 1010 Алгоритм Коэна-Сазерленда Случай 2 X and Y≠0: Отрезок KL Отрезок DC Отрезок EF Алгоритм Коэна-Сазерленда Случай 3 Отсекаемые отрезки: Отрезок AB; Отрезок IJ. Алгоритм Коэна-Сазерленда Отрезки Коды концов Результаты логического умножения АВ 0000 0010 0000 СD 0001 1001 0001 Целиком невидим EF 0110 0010 0010 Целиком невидим GH 0000 0000 0000 Целиком видим IJ 1000 0010 0000 KL 1001 1010 1000 Примечание Целиком невидим Алгоритм Коэна-Сазерленда OpenGL (Open Graphic Library) – библиотека графических функций, интерфейс для графических прикладных программ. Интерфейс OpenGL GLU ПИКЛАДНАЯ GL ПРОГРАММА БУФЕР Win32 API GLUT •Graphics Library (GL) •Graphics Library Utility (GLU) •Graphics Library Utility Toolkit (GLUT) КАДРА Соглашение о наименовании функций glBegin(<тип>); // указываем тип примитива glVertex[2 3][ i f v](...); // первая вершина ……………………………// остальные вершины glVertex[2 3][ i f v](...); // последняя вершина glEnd; В OpenGL левый нижний угол области вывода имеет координаты [-1; -1], правый верхний [1; 1]. Визуализация двумерных объектов Значение <тип> Описание GL_POINTS Каждый вызов glVertex задает отдельную точку GL_LINES Каждая пара вершин задает отрезок GL_LINE_STRIP Рисуется ломанная GL_LINE_LOOP Рисуется ломанная, причем ее последняя точка соединяется с первой Визуализация двумерных объектов GL_TRIANGLES Тройки вершин образуют треугольник GL_TRIANGLE_STRIP Связанные треугольники GL_TRIANGLE_FAN Связанные треугольники с общей первой вершиной GL_QUADS Каждые четыре четырехугольники GL_QUAD_STRIP Связанные четырехугольники GL_POLYGON Один выпуклый многоугольник вершины образуют Визуализация двумерных объектов Область вывода После применения матрицы проекций на вход следующего преобразования подаются усеченные координаты, для которых значения всех компонент (xc, yc, zc, wc)T находятся в отрезке [-1,1]. После этого находятся нормализованные координаты вершин по формуле: (xn, yn, zn)T=(xc/wc, yc/wc, zc/wc)T. Область вывода: glViewPort(x, y, width, height: GLint). Матрицы OpenGl glMatrixMode(mode); Mode: Видовая: GL_MODELVIEW, Проекций: GL_PROJECTION, Tекстуры: GL_TEXTURE glLoadIdentity = glPushMatrix glPopMatrix Преобразования OpenGL Масштабирование: glScale[2 3] [I f d] (α, β ,γ); α – относительно оси абсцисс, β – ординат; γ –аппликат. Поворот: glRotate[2 3] [I f d] (α , x, y, z); Значения x, y, z 0,1 Сдвиг: glTranslate[2 3] [I f d] (dx, dy, dz); Визуализация двумерных объектов Визуализация двумерных объектов Визуализация двумерных объектов Визуализация двумерных объектов Визуализация двумерных объектов Quadric-объекты библиотеки GLU Шаг 1. Создаем указатель на quadric объект с помощью команды gluNewQuadric. • • Шаг 2. Вызываем одну из команд gluSphere(), gluCylinder(), gluDisk(), gluPartialDisk(). •Шаг 3. По окончанию использования объекта, вызвать процедуру gluDeleteQuadric(). Quadric-объекты Quadric-объекты gluQuadricDrawStyle(quadObj, style), определяющая стиль отображения объекта. GLU_FILL – отображение примитивов со сплошной заливкой; GLU_LINE – примитивы отображаются при помощи линий; GLU_SILHOUETTE – примитивы отображаются как силуэт, где линии только на стыках граней; GLU_POINT – примитивы отображаются при помощи точек. Спасибо за внимание!