OpenGL. Графический конвейер. Геометрические преобразования
На лекции Введение в OpenGL Что такое OpenGL Архитектура OpenGL Графический конвейер Геометрические преобразования OpenGL и геометрические преобразования
Введение в OpenGL
Фотореализм vs. Скорость Фотореализм трассировка лучей излучательность Скорость Метод растеризации
Что такое OpenGL? OpenGL – кросс-платформенная библиотека функций для создания интерактивных 2D и 3D приложений Является отраслевым стандартом с 1992 года Основой стандарта стала библиотека IRIS GL, разработанная фирмой Silicon Graphics Inc. Основная функция: интерактивная визуализация трехмерных моделей
Почему OpenGL? Аналогичные библиотеки: DirectX (Direct3D), Java 3D OpenGL Стабильность (с 1992 г.) Переносимость Независимость от оконной и операционной системы Легкость применения Простой интерфейс, реализации для различных ЯП Низкие затраты на обучение Подходит для обучения студентов!
Литература Ю.М. Баяковский, А.В. Игнатенко, А.И. Фролов. Графическая библиотека OpenGL.
Литература (2) Ю. Тихомиров. OpenGL. Программирование трехмерной графики, БХВ – Петербург, 2002 Эдвард Энджел. Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е изд., Вильямс, 2001
Литература (3) Ву Мейсон, Нейдер Джеки, Девис Том, Шрайнер Дейв. OpenGL. Руководство по программиста. Диа-Софт, Френсис Хилл. OpenGL. Программирование компьютерной графики. Для профессионалов. Питер. 2002
Организация OpenGL Состоит из набора библиотек пример для Win32 Прикладная программа GLU GL GLUT Win32 API Буфер кадра
Сопутствующие API AGL, GLX, WGL Связь между OpenGL и оконной системой GLU (OpenGL Utility Library) Часть OpenGL NURBS, tessellators, quadric shapes, etc GLUT (OpenGL Utility Toolkit) Переносимый оконный API Неофициальная часть OpenGL Прикладная программа GLU GL GLUT Win32 API Буфер кадра
С какими геометрическими моделями работает OpenGL? OpenGL работает с моделями, заданными в граничном полигональном представлении Поверхность приближается набором полигональных граней (face, polygon) Границы граней описываются ребрами (egde) Часть отрезка, формирующего ребро, заканчивается вершинами (vertex)
Конвейер Обработка вершин и сборка примитивов Растеризация и обработка фрагментов Операции над пикселями Передача данных в буфер кадра Текстуры Источники света Атрибуты вершин Вершина любого объекта в момент определения немедленно передается в конвейер, и проходит все его ступени 3D координаты -> экранные
Как рисовать объекты с помощью OpenGL? Объекты на экране рисуются путем последовательной передачи в конвейер вершин примитивов, которые составляют объект команды передача данных Обработка данных на каждом этапе конвейера может быть настроена через команды изменения состояния
Типы примитивов OpenGL GL_POINTS GL_LINESGL_LINE_STRIPGL_POLIGON GL_TRIANGLES GL_QUADS GL_TRIANGLE_STRIP GL_QUAD_STRIPE
Атрибуты вершин Каждая вершина кроме положения в пространстве может иметь несколько других атрибутов Материал Цвет Нормаль Текстурные координаты Внимание: всегда используется ТЕКУЩИЙ набор атрибутов OpenGL – конечный автомат
Пример кода Цветной треугольник glBegin(GL_TRIANGLES); glColor2f(0.0f,1.0f); glVertex2f(150.0f, 50.0f); glVertex2f(50.0f, 150.0f); glVertex2f(200.0f, 200.0f); glEnd(); Таким образом можно задать любой объект! Теперь задача в том, чтобы показать этот объект на экране
Преобразования координат в OpenGL Каждая вершина объекта задается в локальных координатах модели Необходимо определить набор геометрических преобразований, таких, что каждая вершина преобразуется в точку на плоскости экрана Три последовательных преобразования: модельное преобразование видовое преобразование проективное преобразование
Графический конвейер
Геометрические преобразования
Что такое геометрические преобразования? Модель Например, описание поверхности трехмерного объекта Некоторое подмножество точек декартова пространства Зачем применять преобразования к модели? Создание моделей (сцен) из компонент Вспомните CSG Редактирование моделей Преобразования в процессе синтеза изображений Получение проекции на 2D экран
Типы преобразований Будем рассматривать два класса: Нелинейные преобразования Линейные преобразования Важный класс!
Нелинейные преобразования Произвольное преобразование точек модели M=T(M)
Линейные преобразования Линейное преобразование применяется к каждой точке (вершине) модели. Не изменяет топологию!
Преобразование в матричной форме
Однородные координаты Какой смысл имеет использование 4х компонент вектора? Позволяет использовать матричную запись для всех линейных преобразований (если использовать матрицы 3x3, невозможно представить перенос) Позволяет описать так называемой перспективное деление
Типичные линейные преобразований Общие линейные преобразования w != 1 (после преобразования) Также называются проективными Прямые переходят в прямые Аффинные преобразования w = 1 Сохраняется параллельность линией Пример: сдвиг Преобразование подобия Сохраняются углы Пример: равномерное масштабирование Изометрия Сохраняются расстояния Пример: поворот, перенос
Сдвиг Аффинное преобразование
Масштабирование Преобразование подобия
Параллельный перенос Изометрия
Поворот (2D) Изометрия
Наши обозначения Перенос T(a,b,c) Поворот R(theta) или R(axis, theta) Масштабирование S(a,b,c) Сдвиг Sh(a,b,c)
Суперпозиция преобразований Записывать так Произносить так а b Повернуть вокруг центра
Задача (1,1)(3,1) (2,2) (6,0) (4,2.5) (4,0) T(-1,-1) Sh(-1, 0) S(1,2.5) T(4,0)
Решение задачи T(-1,-1) Sh(-1, 0) S(1,2.5) T(4,0) P= T(4,0) * S(1,2.5) * Sh(-1, 0) * T(-1,-1) * P
Проективные преобразования Важнейший класс преобразований Все современные дисплеи визуализируют изображение => необходимо преобразовать 3D данные в 2D ! Для выполнения таких преобразований применяются проективные преобразования. Описываются матрицей 4x4 (линейным преобразованием)
Типы проекций Много разновидностей Применяются в дизайне и т.п. Основные виды Параллельные Ортографические Косоугольные Перспективные 1,2,3-х точечные
Ортографическая проекция
Изометрия
Фотография
Перспективная проекция
Перспективная проекция : запись в матричном виде
Запись в матричном виде: Перспективное деление Применяем матрицу M per Необходима нормализация (перспективное деление) Четверная компонента не равна 1 ! Результат уже не в декартовых координатах. Однородные координаты!
Подведем итоги В графическом конвейере OpenGL используются линейные и проективные геометрические преобразования Преобразования описываются матрицами 4x4 Операции производятся над векторами в однородных координатах
Геометрические преобразования в OpenGL
Графический конвейер
Модельное преобразование Переводит модель, заданную в локальных (собственных) координатах, в глобальное (мировое пространство) Модель «собирается» из частей, с помощью модельных преобразований (обычно композиция переносов, поворотов, масштабирования) На выходе – модель в единых мировых координатах
Виртуальная камера Определяет положение наблюдателя в пространстве Параметры Положение Направление взгляда Направление «вверх» Параметры проекции Положение, направление взгляда и направление «вверх» задаются матрицей видового преобразования
Видовое преобразование Для чего нужно еще одно преобразование? Проективные преобразования описывают «стандартные» проекции, т.е. проецируют фиксированную часть пространства Что если мы хотим переместить наблюдателя? Варианты: Изменить матрицу проекции чтобы включить в нее информации о камере Применить дополнительное преобразование, «подгоняющее» объекты под стандартную камеру Стандартная камера в OpenGL: Наблюдатель в (0, 0, 0) Смотрит по направлению (0, 0, -1) Верх (0, 1, 0)
Видовое преобразование «Подгоняет» мир под стандартную камеру, преобразует мировую систему координат в видовые координаты (которые подходят для «стандартной» камеры На выходе – модель, готовая к проекции на экран
Проективное преобразование Выполняет 3D преобразование, подготавливая модель к переходу на 2D После перспективного преобразования необходимо отбросить координату z и получить значения в оконных координатах (обычно от –1 до 1)
Проективное преобразование vs. проекция Матрица проекции вырожденная Фактически, информация от координате z теряется Часто необходимо выполнять дополнительные действия уже ПОСЛЕ проецирования Например, удаление невидимых линий/поверхностей Поэтому часто (e.g. в OpenGL) используется перспективное преобразование вместо проекции Перспективное преобразование невырожденно и позволяет анализировать глубину! Перспективное преобразование преобразует некоторую область пространства в каноническую пирамиду видимости
Отсечение
Преобразование в экранные координаты Отбрасываем координату z Умножаем на высоту/ширину окна Получаем экранные координаты
Модельно-видовое преобразование OpenGL не имеет раздельных матриц для видового и модельного преобразования Поэтому нужно задавать сразу произведение:
Матрицы преобразований void glMatrixMode(Glenum mode); mode={GL_MODELVIEW|GL_PROJECTION} void glLoadIdentity(); void glMultMatrixd(GLdouble c[16]); Выбираем матрицу преобразований для изменения: Две основные операции над матрицами:
Матрицы преобразований (2) void glTranslated(GLdouble x, GLdouble y, GLdouble z); void glScaled(GLdouble x, GLdouble y, GLdouble z); void glRotated(GLdouble angle, GLdouble ax, GLdouble ay, GLdouble az); void gluPerspective(GLdouble fov, GLdouble aspect, GLdouble znear, GLdouble zfar);
Видовое преобразование gluLookAt( eye x, eye y, eye z, aim x, aim y, aim z, up x, up y, up z ) Настройка виртуальной камеры eye – координаты наблюдателя aim – координаты цели up – направление вверх
Модельно-видовое преобразование (2) glMatrixMode(GL_MODELVIEW); gluLookAt(..); glTranslate(…); glRotate(…); glTranslate(…); glBegin(…); … glEnd(); Виртуальная камера Модельное преобразование Геометрия Внимание! При определении геометрии к ней применяется текущий набор матриц преобразования!
Проективное преобразование glMatrixModel(GL_PROJECTION); gluPerspective(…)
Как работает gluPerspective X Y Z 0 O1O1 O2O2 A1A1 B1B1 C1C1 D1D1 A2A2 B2B2 C2C2 D2D2 void gluPerspective(GLdouble fov, GLdouble aspect, GLdouble znear, GLdouble zfar); fov = D 1 OA 1 (в градусах) aspect = C 1 D 1 /D 1 A 1 znear = |OO 1 | zfar = |OO 2 |
Итоги OpenGL Кросс-платформенная библиотека функций для создания интерактивных 2D и 3D приложений Определение геометрии glVertex, glBegin, glEnd Геометрические преобразования Типы преобразований Нелинейные преобразования Линейные преобразования (проективные) Аффинные преобразования Преобразования подобия Изометрические преобразования Однородные координаты Много применений: унификация операций с матрицами, перспективное деление и т.п. Комбинация, иерархия преобразований Сборка модели из локальных компонент Графический конвейер: от локальной модели до точки на экране Локальные, мировые, экранные координаты