Алексей Ющенко, руководитель отдела исследований и разработки в группе компаний ТЕСИС, делится опытом применения библиотеки C3D Vision в CAE-системе FlowVision.
Программный комплекс FlowVision ориентирован на инженерные расчеты и охватывает широкий спектр мультифизических процессов, относящихся к физико-математическому моделированию. Это зрелый и востребованный на рынке продукт, уже более двух десятилетий успешно решающий разнообразные задачи в разных отраслях. Однако специфика этих задач предъявляет особые требования к визуализации — зачастую нестандартные и выходящие за рамки традиционного функционала библиотеки C3D Vision. Как известно, C3D Vision изначально создавался для отображения математических моделей в системах автоматизированного проектирования, тогда как FlowVision ориентирован на задачи проектирования и анализа (CAE), что формирует для библиотеки особые задачи (рис. 1).
До интеграции C3D Vision во FlowVision уже существовал собственный, достаточно зрелый движок визуализации. Он позволял реализовывать различные режимы представления геометрических моделей: сечения плоскостями, прозрачность, отображение границ групп, фасетную визуализацию (рис. 2). Поддержка всех этих возможностей потребовалась и от C3D Vision.
Одной из типовых задач является анализ поверхностных и объемных сеток в реберном представлении с параллельной визуализацией ключевых особенностей геометрии, таких как границы поверхностей. При этом важно, чтобы элементы визуализации не конфликтовали между собой. Ранее в C3D Vision существовал только класс WireframeGeometry, не поддерживавший приоритеты и стили отображения. В рамках сотрудничества была реализована новая сущность — класс PolygonGeometry, способный управлять стилями и приоритетами линий, благодаря чему, например, можно настраивать отображение ребер поверх других элементов сцены.
Класс PolygonGeometry также поддерживает передачу нормалей к ребрам, что позволяет использовать функцию FaceCulling для сокрытия ребер, которые не должны быть видимы в текущем ракурсе. Это особенно полезно при визуализации внутренних структур: например, при просмотре внутренней части куба передние стенки и их ребра могут быть скрыты (рис. 4).
Еще одна важная задача — корректная визуализация совпадающих в пространстве поверхностей. Примером служит сечение расчетной сетки, накладываемое на геометрию, с которой оно совпадает по координатам. В таких случаях возникает артефакт Z-fighting, вызванный тем, что значения глубины в Z-буфере совпадают. Для его устранения в C3D Vision реализован метод SetFaceOffset, позволяющий разнести поверхности в глубине и обеспечить корректное отображение нужного слоя (рис. 5).
В инженерных расчетах нередко возникает необходимость заглянуть внутрь объектов, поскольку именно в объеме происходят ключевые процессы (рис. 6). Для этого в C3D Vision применяется прием скрытия передних стенок – технология Face Culling, которая применяется к скин-сегментам. Такой прием редко встречается в CAD-приложениях, но в расчетных задачах он используется повсеместно.
При моделировании в FlowVision цветовая раскраска поверхностей отображает наложенные граничные условия. Поскольку условие может различаться с двух сторон одной и той же поверхности, необходимо уметь назначать цвета отдельно для каждой стороны. В текущей версии C3D Vision такая возможность реализуется через дублирование поверхности и применение метода FaceCulling, но в будущих релизах поддержка двухсторонней раскраски планируется «из коробки» (рис. 7).
Для визуализации полной постановки расчета часто приходится строить массивы, в том числе зеркальные. Это реализуется с помощью метода SceneSegment::Clone, обеспечивающего так называемое «инстанциирование». Такой подход позволяет не загружать память лишними копиями геометрии, но при этом визуализировать полную картину. Например, при расчетах лопаточных машин моделируется только один сегмент, а затем он дублируется вокруг оси вращения (рис. 8).
Кроме того, в ряде задач требуется отображение распределений скалярных полей, таких как температура, с помощью наложения текстур на поверхности (рис. 9). В C3D Vision предусмотрена возможность цветового текстурирования с поддержкой прозрачности. Это позволяет, например, приглушить визуализацию холодных областей и выделить горячие. Однако при этом требуется вручную задать для материала коэффициент прозрачности, отличный от единицы, чтобы движок корректно обработал поверхность.

Рис.10. Режимы рендеринга
а) Legacy – прозрачность зависит от порядка отрисовки, получаются артефакты
б) DepthPeeling – многопроходный рендеринг, создает реалистичное изображение
в) WeightedBlend – порядконезависимое смешивание, избавляет от артефактов
Визуализация полупрозрачных объектов в C3D Vision за последние годы значительно продвинулась вперед. Если ранее применялся лишь простой альфа-блендинг с зависимостью от порядка отрисовки, что часто приводило к артефактам на границах прозрачных поверхностей, то теперь доступны более совершенные и физически корректные методы. Один из них — DepthPeeling, обеспечивающий поэтапную визуализацию полупрозрачных слоев. Он позволяет избежать проблем с некорректным смешением цветов, но требует дополнительных ресурсов на рендеринг. В качестве компромиссного решения используется режим WeightedBlend. Он дает близкий к физически точному результат при меньших вычислительных затратах, хотя в отдельных случаях возможны незначительные визуальные искажения, особенно в зонах с переменной прозрачностью (рис. 10).
Текстурирование также используется для визуализации векторных полей (рис. 11). В частности, линии тока могут быть представлены как цилиндры, раскрашенные с помощью текстур. Это дает наглядное представление о направлении и характере потока. Если требуется более легкая визуализация, вместо цилиндров применяются ребра, при этом текстура привязывается к точкам в объекте PolygonGeometry, а цветовая информация задается через объект Pen. Таким образом удается добиться выразительного и информативного результата без перегрузки сцены геометрией.
Для отображения распределения скалярных полей в объеме реализована трассировка лучей по трехмерной текстуре (рис. 12). Это особенно полезно, когда двумерного сечения недостаточно для анализа пространственного распределения.
Библиотека C3D Vision позволяет подключить собственные пиксельные шейдеры через механизм RenderPostProcess. С их помощью в каждом пикселе экрана рассчитывается луч, проходящий через сцену, и накапливается цвет в зависимости от данных в объеме. Такой подход дает возможность визуализировать, например, зоны нагрева внутри сложных трехмерных объектов — уже не на плоскости, а во всем пространстве сцены (рис. 13).
Часто возникает необходимость отображать поверх сцены дополнительные экранные элементы — такие как легенда, текстовые подписи или шкалы. Для этого в C3D Vision используется механизм ViewWidget, в который можно заранее отрисовать нужное изображение и привязать его к экрану (рис. 14). Преимущество ViewWidget в том, что он позволяет осуществлять интерактивное управление — пользователь может переместить его мышью в нужное место. При этом следует учитывать, что ViewWidget не блокирует обработку событий курсора — если, например, поворот камеры осуществляется теми же кнопками, то эти действия могут сработать одновременно. В таких случаях требуется вручную отключать лишние обработчики на время взаимодействия с виджетом.
Альтернативным способом наложения экранных слоев служит RenderScreen — он позволяет просто и быстро отрисовать нужные элементы без возможности управления. Это удобно для статичных или автоматических элементов интерфейса. Так, например, на экране может отображаться линейка масштаба, которая автоматически обновляется при изменении положения камеры.
Интересный пример нестандартного применения возможностей C3D Vision — построение real-time анимации. На каждом кадре перестраивается геометрия объекта и вычисляется движение частиц вдоль линий тока (рис. 15). Такая сцена отображается с частотой около 60 кадров в секунду, что обеспечивает плавную визуализацию. Хотя изначально движок не был рассчитан на подобные сценарии, он справляется с ними довольно уверенно. В дальнейшем планируется оптимизация подобных режимов, что сделает их еще более производительными.
Руководитель отдела исследований и разработки
ТЕСИС

















