Принципы программирования и приоритеты использования библиотеки OреnG1, ее архитектура, описание математического аппарата и проекции. Разработка процедуры визуализации трехмерной сцены, подсистемы управлениями событиями и руководства пользователя.
Аннотация к работе
Курсовой проект был создан с помощью среды разработки Visual Studio 6.0 на языке C c использованием библиотеки OPENG1. В Visual Studio содержатся инструменты для всех этапов разработки программного обеспечения (разработка, тестирование, развертывание, интеграция и управления) и для разработчиков любого уровня квалификации, от новичков до опытных специалистов. Производители оборудования на основе этой спецификации создают реализации - библиотеки функций, соответствующих набору функций спецификации. Производители должны пройти специфические тесты (conformance tests - тесты на соответствие) прежде чем реализация будет классифицирована как OPENG1 реализация. Таким образом, разработчикам программного обеспечения достаточно научиться использовать функции, описанные в спецификации, оставив эффективную реализацию последних разработчикам аппаратного обеспечения.Любое аффинное преобразование в трехмерном пространстве может быть представлено в виде суперпозиции вращений, растяжений, отражений и переносов. Каждая точка пространства (кроме начальной точки О) может быть задана четверкой одновременно не равных нулю чисел (hx, hy,hz,h); эта четверка чисел определена однозначно с точностью до общего множителя. Первый тип проекции может быть задан командами void g1Ortho(G1double left, G1double right, G1double bottom, G1double top, G1double near, G1double far) и void g1UORTHO2D(G1double left, G1double right, G1double bottom, G1double top). Перспективная проекция определяется командой void g1UPERSPECTIVE(G1double ang1ey, G1double aspect, G1double znear, G1doub1e zfar), которая задает усеченный конус видимости в левосторонней системе координат. Угол видимости вдоль оси x задается параметром «aspect», который обычно задается как отношение сторон области вывода (как правило, размеров окна).Для задания параметров текущего материала используются команды void g1Material[i f](G1enum face, G1enum pname, G1type param) void g1Material[i f]v(G1enum face, G1enum pname, G1type *params). Какой именно параметр будет определяться значением «param», зависит от значения pname: - G1_AMBIENTПАРАМЕТР params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют рассеянный цвет материала (цвет материала в тени). G1_SPECULAR параметр «params» должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют зеркальный цвет материала. G1_SHININESS параметр params должен содержать одно целое или вещественное значение в диапазоне от 0 до 128, которое определяет степень зеркального отражения материала. G1_EMISSION параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют интенсивность излучаемого света материала.Вся модель состоит из довольно большого числа примитивов, таких как цилиндр, конус, прямоугольник, сфера. Первым рисуем сферу (в начале координат), после нее-цилиндр, затем этим фигуры совмещаем нужным образом, делаем это при помощи функции «g1Translated». За тем рисуем прямоугольник, который пододвигаем к концу цилиндра и развернуть на 90 градусов относительно оси х (g1Translated, g1Rotated). За тем рисуем колеса паровоза которые соединяем с цилиндрами, сначала четыре правых за тем четыре левых, так же с помощью функций g1Translated, g1Rotated.включать/выключать источник света; включать/выключать эффект прозрачности; включать/выключать эффект отражения; включать/выключать камеры; Light 0n/Off - включить или выключить первый источник света;Любое windows-положение основано на событиях и их обработке, другими словами поведение программы управляется событиями. Данный проект тоже является windows приложением, и, следовательно, обработка событий занимает важное место. К основным событиям, играющим важную, для корректной работы программы, роль относятся следующие: - WM_DESTROY - освобождение занятых ресурсов; WM_TIMER - используется для создания таймера; В обработчике события «WM_SIZE» выполняется код, необходимый для изменения сцены относительно размеров окна, в обработчике события «WM_DESTROY» освобождение занятых ресурсов.Программа называется «Трехмерная модель Паровоз».Данная программа предназначается для представления трехмерной модели паровоза. Приложение дает следующие возможности: - рассматривать 3d-модель;Во-первых происходит инициализация OPENG1, она происходит в два этапа. openg1 программирование проекция визуализация В методе «PRECREATEWINDOW» устанавливается стиль окна, после чего - формат пикселей, это делается функцией usr_BSETUPPIXELFORMAT, в котором в свою очередь выполняются CHOOSEPIXELFORMAT и SETPIXELFORMAT, которые проверяют формат и устанавливают его соответственно. Создается контекст воспроизведения, за это отвечает wg1CREATECONTEXT, эта функция создает новый контекст воспроизведения OPENG1, который совместим с устройством, предоставленным дескриптором hdc. За инициализацию отвечает метод usr_BINITOPENG1. При завершении работы программы нужно освободить занятые ресурсы, за это отвечает метод user_DESTORYOPENG1.
План
Содержание
Введение
1. Программирование с использованием библиотеки OPENG1
1.1 Принципы OPENG1
1.2 Основные приоритеты OPENG1
1.3 Архитектура OPENG1
1.4 Описание математического аппарата и проекции
1.5 Материалы
2. Разработка приложения для построения динамической изображения трехмерной модели объекта «Паровоз»
2.1 Разработка процедуры визуализации трехмерной сцены
2.2 Разработка интерфейса пользователя
2.3 Разработка подсистемы управлениями событиями
3. Информационное и программное обеспечение
3.1 Общие сведения о программе
3.2 Функциональное назначение
3.3 Логическая структура и функциональная декомпозиция проекта
3.4 Требования к техническому программному обеспечению
3.5 Руководство пользователя
4. Заключение и выводы
Список литературы
Приложение 1
Приложение 2
Приложение 3
Приложение 4
Приложение 5
Введение
Курсовой проект был создан с помощью среды разработки Visual Studio 6.0 на языке C c использованием библиотеки OPENG1.
Среда разработки Microsoft Visual Studio 6.0 - это набор инструментов и средств, предназначенных для помощи разработчикам программ любого уровня квалификации в решении сложных задач и создания новаторских решений. Роль Visual Studio заключается в том, чтобы улучшить процесс разработки и упростить разработку высокоэффективных программ.
В Visual Studio содержатся инструменты для всех этапов разработки программного обеспечения (разработка, тестирование, развертывание, интеграция и управления) и для разработчиков любого уровня квалификации, от новичков до опытных специалистов.
На базовом уровне, OPENG1 - это просто спецификация, то есть документ, описывающий набор функций и их точное поведение. Производители оборудования на основе этой спецификации создают реализации - библиотеки функций, соответствующих набору функций спецификации. Реализация использует возможности оборудования там, где это возможно. Если аппаратура не позволяет реализовать какую-либо возможность, она должна быть эмулирована программно. Производители должны пройти специфические тесты (conformance tests - тесты на соответствие) прежде чем реализация будет классифицирована как OPENG1 реализация. Таким образом, разработчикам программного обеспечения достаточно научиться использовать функции, описанные в спецификации, оставив эффективную реализацию последних разработчикам аппаратного обеспечения.
Эффективные реализации OPENG1 существуют для Windows, Unix-платформ, PLAYSTATION 3 и Mac OS. Эти реализации обычно предоставляются изготовителями видеоадаптеров и активно используют возможности последних. Существуют также чисто программные реализации спецификации OPENG1, одной из которых является библиотека Mesa. Из лицензионных соображений Mesa является «неофициальной» реализацией OPENG1, хотя полностью с ней совместима на уровне кода.
OPENG1 ориентируется на следующие две задачи: Скрыть сложности адаптации различных 3D-ускорителей, предоставляя разработчику единый API.
Скрыть различия в возможностях аппаратных платформ, требуя реализации недостающей функциональности с помощью программной эмуляции.
Основным принципом работы OPENG1 является получение наборов векторных графических примитивов в виде точек, линий и многоугольников с последующей математической обработкой полученных данных и построением растровой картинки на экране и/или в памяти. Векторные трансформации и растеризация выполняются графическим конвейером (graphics pipeline), который по сути представляет собой дискретный автомат. Абсолютное большинство команд OPENG1 попадают в одну из двух групп: либо они добавляют графические примитивы на вход в конвейер, либо конфигурируют конвейер на различное исполнение трансформаций.
1. Программирование с использованием библиотеки OPENG1
1.1 Принципы OPENG1
Основная идея OPENG1: графическая библиотека должна быть аппаратно независимой, но в то же время использовать аппаратные ускорители, если они доступны. Кроме того, этот язык с самого начала предусматривал механизм расширения и гибкости - по мере того как расширения становились "общепринятыми", они становились частью следующего релиза.
Для любого протокола, будь то сетевой протокол или язык описания сцен, важным является вопрос уровня абстракции - то есть того, на каком уровне работает данная система или протокол, что является входными данными и что выходными, какие компоненты будут взаимодействовать в качестве поставщиков и приемников данных. Говоря попросту, нужно определиться по вопросу "что мы делаем и чего не делаем".
Создатели OPENG1 планировали свой язык с явным намерением создать "виртуальный графический акселератор", так чтобы примитивы OPENG1 максимально соответствовали примитивам современных графических карт и требовали минимум кода для трансляции из одной системы команд в другую. Фактически большинство современных графических процессоров (обычно называемых видеокартами, хотя к видео они имеют лишь касательное отношение) напрямую воспринимают OPENG1 как язык входного уровня без какой-либо (или с минимумом) трансляции.
OPENG1 оперирует графическими примитивами "начального уровня", такими как точки трехмерного пространства (вертексы, вершины), отрезки прямых, выпуклые полигоны и растровые изображения. Поддерживаются аффинные и проективные преобразования, вычисление освещения. К "продвинутым" функциям можно отнести мэппинг текстур (натягивание битовых карт на трехмерные поверхности) и антиалиасинг (сглаживание цветовых переходов - как локальное, в рамках отдельного объекта, так и глобальное, по всей сцене). Предполагается, что приложение более высокого уровня будет выполнять операции, которых недостает в OPENG1,- например, декомпозицию невыпуклых полигонов.
С точки зрения программиста, OPENG1 - это система вызовов процедур с передачей им параметров, то есть этот язык представляет собой Call Level API. Ключевым моментом с точки зрения производительности, особенно в сетевом окружении, является наличие двух режимов: пошагового и пакетного. Пакетный группирует команды описания объектов и режимы в пакет, называемый списком отображения (display list). Подобная техника применяется, например, при описании страниц в POSTSCRIPT или, в несколько другом контексте, при создании хранимых процедур в SQL. Смысл ясен - инкапсуляция функциональности (в данном случае - объектов для последующего многократного использования). При этом можно провести несколько оптимизаций: предварительно один раз проверить синтаксис, а также кэшировать готовый объект при передаче по сети на целевой машине.
Недостаток списка отображения проявляется при частом внесении в него изменений - при этом, понятно, ни один метод оптимизации не будет работать. Для работы с такими "изменчивыми" объектами и сценами в OPENG1 предусмотрен режим прямого отображения, когда каждое предложение интерпретируется в порядке поступления, не дожидаясь закрывающего список тега или какой-то подобной команды на отрисовку. В практике оба метода нашли широкое применение.
1.2 Основные приоритеты OPENG1
При реализации авторы ставили себе пять ориентиров, важных с точки зрения получаемых результатов.
1.Производительность. С самого начала в OPENG1 была заложена "крайне желательная" возможность отрисовки динамических сцен. Для получения нужных результатов в систему введено множество параметров, или, как говорят, режимов рисования. Если некоторый режим или комбинация режимов на данном оборудовании не в состоянии обеспечить интерактивного взаимодействия и необходимой частоты обновления сцены, то пользователь или сама программа должны быть в состоянии отключать так много дополнительных функций, сколько нужно для получения "живой" картинки.
2.Ортогональность. По возможности все функции OPENG1 являются ортогональными, то есть независимыми. Вы можете использовать их в произвольной комбинации, например использование мэппинга не ограничивает возможностей применения светотени.
3.Полнота. Насколько это представляется возможным, OPENG1 соответствует набору функций, предоставляемому современными аппаратными средствами графической акселерации. OPENG1 старается избегать всего, что должно быть реализовано программно. С другой стороны, по крайней мере, гарантируется получение рабочей картинки, даже если производительность и не позволяет получить ее со всеми подробностями. То есть, если что-то работает на одной платформе, то этот же код будет работать и на другой - хотя, возможно, и с другим результатом.
4.Интероперабельность. В сетевом окружении важно передавать данные между разными платформами. Поэтому OPENG1 заранее ориентирован на работу в режиме клиент-сервер, даже если и клиент и сервер расположены на одном компьютере.
5.Расширяемость. Поскольку OPENG1 рассчитан на максимальное соответствие возможностям аппаратуры (а аппаратура, как известно, имеет тенденцию развиваться), то в OPENG1 также встроены механизмы включения новых функций. С другой стороны, нестабильный интерфейс затрудняет жизнь разработчиков, поэтому новые возможности накапливаются достаточное время и применяются согласованно с выходом новой версии.
1.3 Архитектура OPENG1
Более глубоко погружаясь в технологию OPENG1, мы обнаружим стройную и гармоничную архитектуру, общий вид которой показан на рисунке.
Рисунок 1 - Архитектура OPENG1
Точно так же, как процессор имеет два типа конвейеров - для целочисленных вычислений и чисел с плавающей точкой, OPENG1 имеет два конвейера для пиксельных данных и вертексных операций, то есть для операций с векторными данными. Каждый из потоков обрабатывается отдельно, до тех пор пока это возможно - то есть до стадии мэппинга, когда пиксельные растры как фактуры "натягиваются" на плоскости и более сложные поверхности.
Первый этап - аппроксимация кривых и поверхностей вычислением полиномов от входных значений. Второй проход оперирует с примитивами типа точек, отрезков и полигонов - они преобразуются по правилам аффинных преобразований, совмещаются и сцена отсекается в подготовке к растрированию.
Растрирование в качестве результата создает список объектов (точек, отрезков и треугольников) в двумерной плоскости. Над отдельными объектами может быть выполнена операция раскрашивания, градиентной заливки или применения мэппинга, то есть наложения фактуры.
Готовые фрагменты окончательно обрабатываются перед тем, как они реально будут внесены в frame buffer. В частности, фрагменты сортируются зависимо от значений "глубины" - и эти значения сравниваются с известными на предмет рекомпозиции. Применение блендинга приводит к тому, что прозрачные фрагменты принимают цвет, состоящий из их собственного и цветов "ниже лежащих" фрагментов. Дополнительно может быть реализовано маскирование и другие эффекты.
Пиксельный процессор в ходе растрирования встраивает двумерные битовые фрагменты прямо в кадр. Часть готового кадра также может быть прочитана для повторного использования как массив пикселей - так что данные, отображаемые в буфере, могут стать частью других сцен.