Что такое детализация моделей
Детализация модели
Уровни детализации, которым можно придерживаться при BIM-проектировании здания, разбиты на 5 основных частей: LOD 100, LOD 200, LOD 300, LOD 400, LOD 500.
LOD состоит из двух составляющих: геометрической – LOD (G) и атрибутивной – LOD (I).
Низкая детализация: LOD 100, LOD 200.
Высокая детализация: LOD 300, LOD 350, LOD 400.
Цифровая копия здания: LOD 500 — образуется при моделировании здания по исполнительной документации или по результатам цифрового (лазерного) сканирования реального здания. Максимально приближена к фактическим параметрам здания (но, естественно, не на 100%).
Выбор уровня детализации при моделировании обуславливается набором задач, которые ставятся для модели на текущем этапе. Важно соблюсти баланс — выполнить достаточный для строительства/эксплуатации уровень детализации и в то же время не перегрузить модель несущественными атрибутивными параметрами и графическими элементами. Описание модели и её наполнение данными должно исходить из принципов целесообразности и рационализма.
Для конкретного проектируемого объекта нужный уровень детализации элементов здания прописывается в Техническом Задании на проектирование BIM-модели (IER). Причем, для разных элементов или систем здания, требуемый уровень детализации может быть различным, поэтому требования по LOD прописываются, как правило, в матричной (табличной) форме. В такой таблице в одном направлении указываются элементы и системы здания, а в другом — их параметры.
OpenSceneGraph: Уровни детализации (LOD) и фоновая загрузка объектов
Введение
Одной из интереснейших задач, решаемых посредством трехмерной графики является создание «больших миров» — протяженных сцен, содержащих большое число объектов с возможностью неограниченного перемещения по сцене. Решение этой задачи упирается в понятные ограничения, присущие аппаратному обеспечению компьютера.
Типичный пример: «большой мир» при визуализации железной дороги на движке OSG. Не хватает только лангольеров, пожирающих мир за поездом.
1. Использование уровней детализации (LOD)
Техника использования уровней детализации позволяет отображать один и тот же объект более или менее детально, в зависимости от расстояния от него до наблюдателя. Использование этой техники основано на том простом соображении, что мелкие детали трехмерной модели неразличимы на большом расстоянии, значит нет необходимости в их прорисовке. С одной стороны этот прием позволяет уменьшить общее количество геометрических примитивов, выводимых в буфер кадра, а с другой — не терять в дальности отображения объектов сцены, что очень полезно при создании больших открытых миров.
OSG предоставляет инструменты для реализации этого приема через класс osg::LOD, наследуемый от всё того же osg::Group. Этот класс позволяет представить один и тот же объект в нескольких уровнях детализации. Каждый уровень детализации характеризуется минимальной и максимальной дистанцией до наблюдателя, при соблюдении которой происходит переключение отображения объекта в этом уровне детализации.
osg::LOD позволяет задавать данный диапазон сразу при задании дочерней ноды, или позже, применением методы setRange()
Продолжаем мучать цессну и проиллюстрируем описанную технику примером
main.h
main.h
Для начала загружаем модель
Теперь необходимо генерировать несколько (ограничимся для примера двумя) моделек, с более низким уровнем детализации. Для этого скопируем загруженную ноду дважды, применяя методику так называемого «глубокого» копирования класса, для ноды реализуемого методом clone()
Теперь редуцируем геометрию этих моделей, используя класс osgUtil::Simplifer. Степень упрощение модели задается методом setSampleRatio() данного класса — чем меньше передаваемый параметр, тем менее детальной будет модель после применения процедуры редукции
Когда у нас есть модельки разного уровня детализации мы можем зарядить их в корневую ноду, созданную как умный указатель на osg::LOD. Для каждого уровня детализации задаем дистанцию отображения этого уровня
Под FLT_MAX понимается в некотором роде «бесконечно» большое расстояние до наблюдателя. После запуска вьювера получаем следующую картину
Уровень детализации 3
Уровень детализации 2
Уровень детализации 1
Видно, как при отдалении камеры от объекта снижается детальность отображаемой геометрии. Применяя этот прием можно добиться высокой реалистичности сцены при малом расходе ресурсов.
2. Техника фоновой загрузки узлов сцены
В движке OSG представлены классы osg::ProxyNode и osg::PagedLOD, предназначенный для баллансировки нагрузки при рендеринге сцены. Оба класса наследуются от osg::Group.
Узел типа osg::ProxyNode уменьшает время запуска приложения до начала рендеринга, если в сцене огромное количество загружаемых с диска и отображаемых моделей. Он работает как интерфейс к внешним файлам, позволяя выполнять отложенную загрузку моделей. Для добавления дочерних узлов используется метод setFileName() (вместо addChild) чтобы установить имя файла модели на диске и загрузить его динамически.
Узел osg::PagedNode наследует методы osg::LOD и загружает и выгружает уровни детализации таким образом, чтобы избежать перегрузки конвейера OpenGL и обеспечить плавную отрисовку сцены.
3. Динамическая (runtime) загрузка модели
Посмотрим, как происходит процесс загрузки модели с применением osg::ProxyNode.
main.h
main.cpp
Процесс загрузки здесь немного отличается
Вместо явной загрузки модели коровы мы указываем корневой ноде имя файла, где содержится модель и индекс дочерней ноды, куда следует поместить эту модель после её загрузки. При выполнении программы мы получи такой результат
Видно, что точка обзора выбрана не лучшим образом — камера упирается прямо в зеркальный бок коровы. Это произошло потому, что модель загрузилась уже после запуска рендера и инициализации камеры, когда нода 0 ещё не была видна. Вьювер просто не смог просчитать необходимые параметры камеры. Однако, модель загрузилась и мы может настроить режим её отображения путем манипуляций мышью
Что происходит в рассмотренном примере? osg::ProxyNode и osg::PagedLOD работают в данном случае как контейнеры. Внутренний менеджер данных OSG будет посылать запросы и загружать данные в граф сцены по мере того, как возникнет необходимость в файлах моделей и уровнях детализации.
Данный механизм работает в нескольких фоновых потоках и управляет загрузкой статических данных, расположенных в файлах на диске и динамических данных, генерируемых и добавляемых в процессе выполнения программы.
Движок автоматически обрабатывает узлы, не отображаемые в текущем вьюпорту и удаляет их из графа сцены когда рендер перегружен. Однако, такое поведение не затрагивает узлы osg::ProxyNode.
Как и прокси-узел, класса osg::PagedLOD также имеет метод setFileName() для задания пути к загружаемой модели, однако для его необходимо установить диапазон дистанции видимости, как для узла osg::LOD. При условии, что у нас имеется файл cessna.osg и низкополигональная модель уровня L1 мы можем организовать выгружаемую ноду следующим образом
Нужно понимать, что узел modelL1 не может быть выгружен из памяти, так как это обычный дочерний не прокси-узел.
При рендеринге внешне не видна разница между osg::LOD и osg::PagedLOD, если использовать только один уровень детализации модели. Интересной идеей будет организовать громадный кластер моделей Cessna, используя класс osg::MatrixTransform. Для этого можно использовать например такую функцию
Пример программы реализующей фоновую загрузку 10000 самолетов
main.h
main.cpp
Предполагается, что самолеты будут располагаться на плоскости с интервалом в 50 единиц координат. При загрузке мы увидим, что загружаются только те цессны, что попадаю в кадр. Те самолеты, что исчезают из кадра пропадают из дерева сцены.
Заключение
Этот урок в цикле об OpenSceneGraph будет последним, выполненным в формате «How To». В рамках двенадцати статей удалось уместить базовые принципы работы и использования OpenSceneGraph на практике. Очень надеюсь, что данный движок стал более понятен русскоязычному разработчику.
Это не означает, что я закрываю тему OpenSceneGraph на ресурсе, напротив, будущие статьи планируется посвятить более продвинутым техникам и приемам применения OSG в разработке графических приложений. Но для этого следует накопить хороший материал и переработать массу англоязычных источников, а на это требуется время.
Но я не прощаюсь, благодарю за внимание и до новых встреч!
СОДЕРЖАНИЕ
Историческая справка
Такая же структура среды теперь предлагается как способ управления различными деталями, что позволяет избежать ненужных вычислений, но обеспечивает адекватное визуальное качество:
Однако важным моментом является то, что в сложной среде объем информации, представленной о различных объектах в окружающей среде, варьируется в зависимости от доли поля зрения, занятой этими объектами.
Хорошо известные подходы
Хотя представленный выше алгоритм охватывает весь спектр методов управления уровнем детализации, в реальных приложениях обычно используются специальные методы, адаптированные к визуализируемой информации. В зависимости от требований ситуации используются два основных метода:
В обоих случаях LOD выбираются на основе некоторой эвристики, которая используется для оценки того, сколько деталей теряется из-за уменьшения детализации, например, путем оценки геометрической ошибки LOD относительно модели с полной детализацией. Затем объекты отображаются с минимальным количеством деталей, необходимых для выполнения эвристики, которая предназначена для минимизации геометрических деталей в максимально возможной степени, чтобы максимизировать производительность при сохранении приемлемого уровня визуального качества.
Подробная информация о дискретном уровне детализации
Алгоритмы DLOD часто используются в ресурсоемких приложениях с небольшими наборами данных, которые легко помещаются в памяти. Хотя могут использоваться алгоритмы, не связанные с ядром, степень детализации информации не очень подходит для такого рода приложений. Этот тип алгоритма обычно легче запустить, поскольку он обеспечивает более высокую производительность и меньшую загрузку ЦП из-за небольшого количества операций.
Пример дискретного уровня детализации
Изображение | |||||
---|---|---|---|---|---|
Вершины | 140 | ||||
Примечания | Максимальная детализация для крупных планов. | Минимум деталей, очень далекие объекты. |
OpenGL используется для рендеринга из-за его высокой эффективности при управлении небольшими партиями, хранении каждой модели в списке отображения, что позволяет избежать накладных расходов на связь. Дополнительная вершинная нагрузка создается за счет применения двух направленных источников света, идеально расположенных бесконечно далеко.
В следующей таблице сравнивается производительность рендеринга с учетом LOD и метода полной информации ( грубой силы ).
Грубый | DLOD | Сравнение | |
---|---|---|---|
Визуализированные изображения | |||
Время рендеринга | 27,27 мс | 1,29 мс | 21 × уменьшение |
Вершины сцены | 2 328 480 | 109 440 | 21 × уменьшение |
Иерархический LOD
Поскольку оборудование ориентировано на большое количество деталей, рендеринг низкополигональных объектов может иметь неоптимальную производительность. HLOD позволяет избежать этой проблемы, группируя различные объекты вместе. Это позволяет повысить эффективность, а также воспользоваться соображениями близости.
Практическое применение
Видеоигры
В популярной игре о строительстве городов Cities: Skylines моды позволяют изменять уровень детализации.
В ГИС и 3D моделировании городов
Уровень детализации присутствует в ГИС и 3D моделях городов как схожая концепция. Он показывает, насколько тщательно были нанесены на карту особенности реального мира и насколько модель соответствует своему реальному аналогу. Помимо геометрической сложности, в LOD модели могут учитываться другие показатели, такие как пространственно-семантическая согласованность, разрешение текстуры и атрибуты. Стандартный CityGML содержит одну из самых известных категорий LOD.
Что такое детализация моделей
Первым из которых является составление технического задания. От того, насколько грамотно составлено техническое задание, зависит дальнейшая работа и, прежде всего, оперативность выполнения. На этом этапе заказчику необходимо определиться с масштабом, материалами, наличием подсветки, а также степенью детализации.
Степень детализации — один из основных параметров, выбор которого обусловлен концепцией сооружения и целью, с которой создается макет.
Так, например, если нужно создать градостроительный макет целого района с целью демонстрации новых дорог и развязок, то нет необходимости в проработке мельчайших деталей, которая увеличит цену и время изготовления. И напротив, если необходимо сделать архитектурный макет, чтобы продемонстрировать все конструкторские особенности сооружения и прилегающую инфраструктуру, будут отображены покрытие фасадов, детали декора, бордюры, лепнина и пр., а также вывески магазинов, скамейки, игровые площадки.
Разделяют три вида детализации
В макетах с низкой детализацией объекты схематичные, отображается только их форма, цвет часто прозрачный или однотонный, примерно так вы видите их в своем автомобильном навигаторе.
При средней детализации уже передается цветовая концепция сооружений, показывается очертания фасадов. Можно увидеть прилегающие парковочные зоны и парки.
Ну и, наконец, в макетах с высокой детализацией объект отображается наиболее достоверно, вплоть до мельчайших деталей. Это и структура облицовки сооружений, и брусчатка, бордюры, и газоны, деревья, и даже определенные типы автомобилей, припаркованные у подъезда.
Повышение степени детализации макета увеличивает его стоимость и сроки изготовления.
Уровни детализации цифровой модели: стандарт LOD
«…Вполне логично, что уровень детализации BIM-модели обычно определяется целесообразностью при решении поставленной задачи. Например, если модель жилого дома нужна для оценки экономической эффективности проекта, то нет смысла для этого прорабатывать систему крепления подоконников. Вроде бы все понятно. Но понимание уровня проработки модели у всех может быть свое, особенно — у заказчика и исполнителя (даже меняться в процессе взаимоотношений), что создает немалые трудности в работе.
В результате в 2008 году Американским Институтом Архитектуры (AIA) был впервые документально определен LOD (Level of Development) — уровень проработки (детализации) модели. На сегодняшний день для выполнения BIM-моделей действует усовершенствованный протокол AIA G202-2013, в котором для упорядочения взаимоотношений между участниками проектно-строительного процесса прописаны шесть базовых уровней детализации информационных моделей зданий LOD100, LOD200, LOD300, LOD350, LOD400 и наивысший LOD500.
К сожалению, в нашей стране про LOD пока еще мало кто слышал. Тем не менее, всегда, когда речь заходит о внедрении BIM, на первый план выходят вопросы глубины проработки модели, которые в настоящее время решаются у нас просто интуитивно. Часто сами компьютерные программы допускают возможность создавать библиотечные элементы, имеющие несколько уровней детализации, а затем, уже в модели, управлять переключением этих уровней в зависимости от ситуации.
Более сложной ситуация становится тогда, когда в модель вставляются элементы, имеющие только высший (для конкретной ситуации — чрезмерный) уровень геометрической проработки. В этом случае единственный выход — сделать свой, упрощенный элемент и использовать его в модели»