Представленная ниже статья Э.Максименко описывает необходимые профессионалам технологические подробности продукта, а одновременно с ней публикуемая, фактически — вводная, статья А.Камнева «C3D Vision. Визуализатор для САПР» представляет общую проблематику и характеризует C3D Vision в целом.
Следует подчеркнуть, что стандарт OpenGL не связан с оконной системой, ввиду чего он получил весьма широкое распространение в открытых системах. Спецификация OpenGL использует расширение GLX, которое принадлежит протоколу ядра X Window System и обеспечивает взаимодействие OpenGL и X Window. Данное расширение организует прямой рендеринг в обход X-сервера, что позволяет реализовывать эффективные приложения, работающие в распределенной X-среде. Все эти возможности использованы в настоящем инструменте от компании C3D Labs. Применяя открытую модульную архитектуру, C3D Vision предлагает доступ к собственному API при наличии мощного и гибкого функционала и широкого перечня вспомогательных компонентов.
Визуализация данных в C3D Vision
C3D Vision представляет собой набор функциональных «кирпичей», из которых с минимальными трудозатратами строятся полноценные графические приложения. В модуле визуализации C3D заложена возможность масштабирования архитектуры, благодаря чему разработчик может создавать собственные классы объектов, наследуя их от уже имеющихся, и тем самым закладывать в них свои свойства и правила. По мере необходимости можно задавать классы вплоть до отрисовочного представления объекта в сцене.Графические приложения, созданные на базе C3D Vision, работают с геометрическими представлениями сцены, а именно с отрезками, поверхностями, ребрами и прочими объектами, которые отрисовываются в активном окне. Непосредственное взаимодействие пользователя с графическим приложением имеет некое представление отображения сцены. В случае если представление не имеет иерархической структуры, а, предположим, представлено простым линейным массивом объектов, то это затрудняет применение эффективных методов, например отсечения невидимых объектов или поиска объектов сцены. Очевидно, что применение представления сцены с иерархической структурой дает ряд преимуществ. В этом случае функциональные возможности объектов сцены очень похожи и их можно выделить в отдельные группы, которые объединяются в группы более высокого уровня. В свою очередь, применение иерархических принципов неизбежно приводит к известному графическому стандарту PHIGS (Programmer’s Hierarchical Interactive Graphics System) — рис. 1.
Рисунок 1. Обобщённая схема представления сцены в C3D Vision
Такой подход гарантирует высокую гибкость в работе визуализатора и дает возможность детально настраивать его для обеспечения максимальной производительности рендеринга. Однако применение сегментации сцены обусловлено не только удобством работы с разделенными на составляющие объектами, но также необходимостью реализации других задач, в том числе:
- изменение параметров сегментов — перемещение и вращение объектов, переключение и проверка видимости, настройка материалов и источников освещения и т.д.;
- перестроение дерева модели любым удобным образом — создание и удаление сегментов или объединение с другими сегментами графа;
- обход графа сцены с выполнением необходимых действий для каждого сегмента;
- отрисовка всей сцены при помощи OpenGL.
Сегментация сцены
Для того чтобы разработчик мог работать с объектами по определенному шаблону и имел возможность при необходимости создавать собственные типы объектов, в C3D Vision реализована сегментация сцены в виде направленного ациклического графа. Подобная организация графа позволяет создавать логическое представление сцены для более эффективного рендеринга (рис. 2).Рисунок 2. Представление сцены в виде направленного ациклического графа
Рисунок 3. Модель роторного экскаватора с поворотной башней и подъемным рабочим органом: 1 — гусеничная платформа; 2 — опорно-поворотный механизм; 3 — поворотная платформа; 4 — противовес; 5 — башня; 6 — кабина; 7 — роторный рабочий орган
Рисунок 4. Сегментация сцены роторного экскаватора
С помощью такого подхода можно решить ряд полезных задач по управлению местоположением объектов внутри сцены. Достаточно преобразовать матрицу одного промежуточного сегмента, чтобы изменилось местоположение в сцене сразу у всех входящих сегментов, а следовательно, у всей геометрии. Таким образом, если решается задача перемещения автомобиля, то всё содержимое в нем — кресла, руль, педали, водитель с пассажирами — тоже перемещается без организации каких-либо препятствий для выполнения иных локальных задач. Здесь необходимо подчеркнуть, что любые действия над сегментом в основном распространяются на его подсегменты.
Как уже отмечалось ранее, ссылочная геометрия может быть применена для экономии памяти. Граф сцены обычно включает достаточно большое количество подграфов, а те, в свою очередь, несколько потомков, образующих дочерние подграфы. Наконец, последние могут иметь собственную геометрию. Если рассмотреть множество всех существующих моделей, то становится очевидным, что большинство из них не отличается по геометрии. Тот же самый автомобиль имеет четыре колеса одинаковой формы и размеров, поэтому рационально хранить такую геометрию в одном экземпляре, а для определения различий в местоположении колес использовать индивидуальные матрицы. С учетом изложенного в C3D Vision реализована возможность присвоения ссылок на геометрию тому или иному сегменту графа сцены (рис. 5).
Рисунок 5. Сегментация сцены с применением ссылочной геометрии
При помощи сегментации сцены можно решить и некоторые глобальные задачи, имеющие отношение ко всему графу сцены в целом. В первую очередь это оптимизация рендеринга. Очевидно, что чем больше объектов необходимо отрисовать, тем больше машинного времени потребуется, чтобы рассчитать и отобразить изменения сцены на мониторе. Нетрудно заметить, что в течение длительного промежутка времени большое количество объектов находится за пределами области экрана или внутри других объектов. Поэтому вычислением таких объектов можно пренебречь, сделав их невидимыми и просто убрав из вывода на экран. Безусловно, это положительно скажется на производительности рендеринга сцены, ведь если объект не попадает в область видимости виртуальной камеры, то и нет необходимости отправлять его на отрисовку в видеоадаптер. С помощью графа сцены можно легко находить такие объекты. Для этого в каждом сегменте вычисляются ограниченный прямоугольник или сфера. Далее к нему добавляются все дочерние подграфы и сегменты, и уже непосредственно перед отрисовкой сцены вычисляется пересечение ограничивающей сферы сегмента сцены с так называемой пирамидой видимости. В результате строится сортированный список всех видимых сегментов графа сцены. Данный механизм отсечения незначительных элементов сцены характерен для режима оптимизации Frustum Culling.
Таким образом, оценивая преимущества, предоставляемые пользователю базовым функционалом сегментации сцены, можно отметить следующее:
- представление пользовательских форм сводится к определенному шаблону, что упрощает создание пользователем собственных форм, поскольку исключает использование более низкого уровня представления;
- за счет использования концепции графа пользователь может создавать сегменты сцены в виде слоев с их последующей настройкой. Фактически граф сцены представляет собой набор слоев, каждый из которых может быть задан невидимым, полупрозрачным или заблокированным (доступным только для чтения). Надо отметить, что между слоями и группами может не быть никакого внутреннего различия в структурном представлении, так как и слои и группы представлены сегментами сцены;
- логическая связь между объектами модели (кресла в машине) представляется как расширение модели (машины), при этом сегментация сцены может описывать и пространственные отношения различных объектов;
- в больших приложениях при проектировании модели предъявляются повышенные требования к использованию оперативной и видеопамяти, так как их экономное расходование является определяющим в вопросах оптимизации вычислений. Для этих целей в C3D Vision был реализован механизм работы со сценой при помощи ссылочной геометрии;
- применение иерархического подхода в построении графа сцены открывает возможности для решения глобальных задач, например таких, как пространственное разбиение геометрии BVHs, включая эффективное отсечение и быстрое определение столкновений объектов сцены.
Освещение сцены
Реализация света в модуле C3D Vision выполняет ту же роль, что и реальные источники света, поскольку она делает объекты видимыми. Именно источники освещения определяют, какая часть модели будет участвовать в проекции сцены на плоскость, будь то экран компьютера или дисплей мобильного телефона. Самих источников освещения может быть несколько, а соответствующие им объекты C3D Vision способны имитировать различные эффекты освещения. Все объекты смоделированы на основе поведения реальных источников света. Важная особенность — сцена должна иметь хотя бы один источник света, чтобы объекты виртуальной сцены стали видимыми.На сегодняшний день в C3D Vision реализовано несколько типов источников освещения:
- Point Light — реализует освещение сцены, аналогичное ближнему источнику света, при этом источник освещения занимает определенное местоположение и испускает свет из этого положения (функция SetPosition). Объекты на сцене также освещаются в зависимости от их положения и расстояния относительно источника света. Можно не только задать параметры затухания, определяющие интенсивность ослабления источника света в зависимости от расстояния, но и установить значение константы или линейной/квадратичной интерполяции для затухания источника света.
- Direction Light — реализует освещение сцены, аналогичное удаленному источнику света. Направление источника света, как и в случае с ближним источником света, определяется с помощью функции SetPosition, но уже без указания конкретного местоположения.
- Spot Light — имеет местоположение и направление и реализует освещение сцены, подобное источнику Point Light. В данном случае свет проецируется в конусообразную область (функция SetSpotCutoffAngle), а ее значение устанавливается в радианах.
Виртуальная камера
Вследствие большого распространения телевидения и различных видеоигр, в наше время всё больше людей воспринимают изображение как пространство, отраженное в видоискателе виртуальной камеры. Но в OpenGL реализации подобного рода камеры не существует. Поэтому, чтобы сформировать иллюзию движения или вращения в сцене относительно зрителя, такую реализацию необходимо создать.С помощью камеры в C3D Vision можно получить практически любое изображение. Камера является устройством, которое захватывает и отображает мир наблюдателю. Путем манипуляции через представленный функционал камеры можно задать уникальные настройки и действия, в частности вращение вокруг всей сцены по орбите или относительно начала координат, панорамирование, масштабирование, вращение вокруг оси взгляда и т.д.
Модуль визуализации C3D имеет ряд инструментов, которые могут управлять местоположением камеры. Все эти инструменты являются наследниками от библиотечного класса Process, который принимает события от мыши и клавиатуры и интерпретирует действия пользователя при работе с данными устройствами как действия непосредственно с камерой. Помимо реализации уже готовых инструментов, разработчику программного обеспечения на базе C3D Vision предоставлена возможность создавать на основе класса Process собственные программные инструменты, необходимые для управления камерой.
Заключение
В данной статье были рассмотрены основные принципы построения сцены, а также ключевые особенности функционала программной библиотеки C3D Vision. Тем не менее значительная часть предоставляемых возможностей осталась за пределами анализа: поддержка шейдеров, выбор объектов сцены и их детализация с применением технологии LOD, позволяющей на большом удалении от камеры использовать более простые полигональные модели, а также поддержка полупрозрачных объектов, pixel culling и многое другое. Освещение данных вопросов требует особого внимания, поэтому они будут рассмотрены в последующих статьях.Стоит отметить, что одной из наиболее важных особенностей C3D Vision является возможность масштабирования программного кода, то есть создание пользователем собственных объектов и интерактивных процессов, позволяющих расширить инструментальные возможности исходной библиотеки. Модуль визуализации C3D Vision базируется на геометрическом ядре C3D Modeler. Это означает, что при использовании в проекте математической части из набора C3D Toolkit для разработчиков инженерного ПО ее сопряжение с объектами C3D Vision поддерживается напрямую, что существенно облегчает создание приложений.
Модуль визуализации C3D Vision постоянно развивается, совершенствуется его базовый функционал и разрабатываются новые фичи, исходя из реальных запросов и потребностей отрасли САПР. Это дает основания полагать, что компонент C3D Vision будет оставаться востребованным для решения текущих задач разработчиков программного обеспечения и не потеряет своей актуальности в будущем.
Более подробно ознакомиться с C3D Vision и уточнить условия его использования можно на сайте www.c3dlabs.com