В июне вышел C3D Toolkit 2020, обновленный набор инструментов для разработки инженерных 3D-приложений. В этой статье подробно рассказываем о новинках и усовершенствованиях модуля визуализации C3D Vision — они направлены на ускорение рабочих процессов, сокращение времени на выполнение часто повторяющихся задач, повышение удобства работы.
C3D Vision отвечает за визуальное отображение геометрических моделей и функционирование графического интерфейса инженерного приложения, управляя качеством отрисовки геометрических моделей при использовании математических, программных и аппаратных средств, вследствие чего оптимизирует скорость работы программного обеспечения. В новой версии улучшения сосредоточились, в основном, в трех областях:
Оптимизация процессов взаимодействия с пользователем. Конвертация любых представлений GUI событий в формат Vision, усовершенствование процессов управления и редактирования объектов, обеспечение возможности выбора устройств в пользовательских процессах, минимизация пользовательского кода для генерации сцены — все эти и иные возможности повышают производительность работы с компонентом и удобство его использования.
Новые возможности для работы с геометрическими представлениями и геометрическими объектами. Дополнительные геометрические представления, принципиально новые геометрические объекты для работы с двумерными массивами, масштабные дополнения свойств геометрии объектов имеют своей целью предоставление пользователю дополнительного функционала при построении, редактировании, отрисовке и конвертации геометрии.
Усовершенствование существующих инструментов, например, новые возможности масштабирования, выбора объектов с помощью рамки, сечения плоскостью.
А теперь рассмотрим подробнее.
Фильтрация событий от физических устройств.
В каждой библиотеке, например, Qt или MFC, описание и представление событий выполняются в своем формате, поэтому для работы с любыми библиотеками в Vision был разработан специальный инструмент — фильтр ConverterEventListener.
Он предназначен для конвертации представления GUI событий в формат Vision, при этом источником событий, как правило, является графическое окно, где отрисовывается вся сцена, но могут быть и иные системные объекты, в частности, элемент управления или главное окно. Для иллюстрации взаимодействия реализации пользовательского графического интерфейса и Vision в качестве примеров можно использовать известные библиотеки, представляющие собой источники событий.
Усовершенствование процессов управления и редактирования объектов.
В новой версии обновление отрисовки сцены синхронизировано с отработкой события. Например, при сдвиге мыши и повороте всей сцены обновление кадра происходит после его подготовки, что обеспечивает плавность отрисовки при любых манипуляциях с объектами или со сценой. Кроме того, теперь гарантирована однородность событий при использовании различных физических устройств, примененных в процессе, что и отражено на представленной схеме.
В данном случае процесс работает с двумя источниками событий — клавиатурой и мышью, которые транслируют в процесс однородные события, к примеру, сдвиг по оси Х. В совокупности это позволяет использовать определенные шаблоны в коде.
Определение устройств в пользовательских процессах.
В C3D Vision 2020 пользователь при создании своих процессов может назначить те источники событий, которые необходимы в каждом конкретном случае.
Эти устройства можно настраивать по своему усмотрению. Например, задать для определенных клавиш назначенных устройств выполнение того или иного действия в ходе реализации процесса. Допустим, клавиша «D» клавиатуры отвечает за активизацию сдвига по оси Х, комбинация клавиш «Ctrl+стрелка» — за вращение объекта вокруг выбранной оси и т.д.
Минимизация пользовательского кода для генерации сцены.
Интеграция Vision с математическим ядром осуществляется с помощью двух классов — MathRepresentation и MathGeometry, работающих непосредственно с математическим представлением MbItem.
Такая взаимосвязь позволяет программисту создавать определенные шаблоны для генерации визуальных представлений, при этом код их будет весьма лаконичным.
// создать математическое представление SPrt<MbSurface>* mathRep = createSqrtSinSurface(); // создать визуальное представление GeometryRep* visRep = SceneGenerator::Instance()-> CreateMathRep(mathRep, MathGeometry::Synchronous); // создать сегмент с заданным родителем SceneSegment* segSurface = new SceneSegment(visRep, topParent);
Дополнительные геометрические представления.
Расширен и доработан набор простых геометрических объектов, которые можно применять в инструментах как раздельно, так и в совокупности.
Добавился также геометрический объект — начало координат с возможностью выбора его примитивов, которые могут быть использованы при моделировании в качестве опорных объектов, при этом начало координат имеет два представления — простое и объемное.
Маркеры и значки
Появились новые геометрические представления — маркеры и значки. В частности, были добавлены геометрические иконки на базе изображений различных форматов, символьные и часто используемые значки.
Разработан стандартный набор маркеров для обозначения ограничений. При необходимости пользователь может создавать собственные представления с помощью инструмента «Painter».
Карта высот
К новым реализованным инструментам относится и геометрический объект HeightMapSurfaceGeometry, позволяющий работать с двумерным массивом карты высот. Как известно, представить двумерный массив можно с помощью изображения в формате .png или ином формате, поэтому карта высот позволяет рассчитать как автоматически, так и вручную, значения по всем трем координатам.
Sketch и Label
Это новые объекты, базирующиеся на плоскости. Разработаны классы MathSketchRepresentation, MathSketchGeometry, предназначенные для отображения массива двумерных кривых, являющихся наследниками от MbCurve. Также реализованы LabelRepresentation и LabelGeometry, предназначенные для отображения текста с настройкой ориентации изображения.
Новые возможности отрисовки
В C3D Vision 2020 проведены масштабные изменения, нацеленные на улучшение и доработку возможностей отрисовки геометрических объектов, в частности, добавлены новые режимы отрисовки и отображения геометрии с оптимизацией отрисовки и др.
Так, например, ScreenPlaneOnly позволяет определенной геометрии назначить режим отрисовки в плоскости экрана.
SceneSegment* planeScreen = new SceneSegment(pTopParentSegment); planeScreen->AddFeature(new Feature::ScreenPlaneOnly);
NoScalable задает геометрию сегмента немасштабируемой независимо от изменения общего масштаба сцены.
SceneSegment* noScalableSegment = new SceneSegment(pTopParentSegment); noScalableSegment->AddFeature(new Feature::NoScalable);
DoubleSidedLighing управляет назначением двустороннего освещения геометрии независимо от общего освещения сцены.
SceneSegment* doubleSidedLighting = new SceneSegment(pTopParentSegment); doubleSidedLighting->AddFeature(new Feature::DoubleSidedLighting);
RenderMode отображает выбранную геометрию в определенном режиме (тон, полутон, каркас и т.д.).
SceneSegment* renderModeSegment = new SceneSegment(pTopParentSegment); renderModeSegment->AddFeature(new Feature::RenderMode(rm_Wireframe));
Режим SectionPlanes позволяет назначить сечение геометрии плоскостью выбранных сегментов. На рисунке сечение плоскостью назначено только для детали, а куб сечением игнорируется.
SceneSegment* sectionPlanesSegment = new SceneSegment(pTopParentSegment); sectionPlanesSegment->AddFeature(new Feature::SectionPlanes(12));
Для оптимизации отрисовки сложной геометрии применяется режим FaceCulling. Он позволяет отрисовывать не назначенные грани, а именно те, которые не видны пользователю, либо наоборот, только те, которые видны. Это определяется флагом при создании объекта в FaceCulling. Так, на представленном примере не отрисовываются передние грани.
SceneSegment* faceCullingSegment = new SceneSegment(pTopParentSegment); faceCullingSegment->AddFeature(new Feature::FaceCulling(bool back));
Отрисовка слоев
Структура параметров RenderLayerSettings позволяет задать режимы отрисовки для определенного слоя, такие как освещение, материал и тип отрисовки. Номер слоя для сегмента сцены определяет функция SetRenderLayer, где первый параметр — номер слоя, а второй параметр является флагом для распространения отрисовки слоя на дочерние сегменты.
SceneSegment* pSegment = new SceneSegment(pTopParentSegment); pSegment ->SetRenderLayer(1, false);
Новые и усовершенствованные инструменты
Важные изменения были привнесены в инструменты, связанные с непосредственным редактированием геометрических объектов.
Доработан инструмент PrFindSelectArea, определяющий выбор геометрических объектов с помощью рамки: добавлена возможность выделения как объединяющей, так и секущей рамками, а также их совокупностями — слева направо и справа налево.
Расширены возможности масштабирования объектов: теперь масштабирование может выполняться с помощью рамки. Инструмент PrCameraZoomBox имеет настройки в зависимости от конфигурации пользователя.
Новый инструмент CoordLocator предназначен для конвертации координат от физических устройств, например, клавиатуры, как правило, в процессах редактирования.
Разработано три вида локаторов:
- ModelCoordLocator — конвертация значений координат в модельные координаты
- SurfaceScreenCoordLocator — конвертация значений координат в заданную поверхность
- CurveScreenCoordLocator — конвертация значений координат в заданную кривую.
Интерактивные манипуляторы
В области редактирования геометрических объектов с помощью различных интерактивных инструментов проведены колоссальные изменения, а также реализованы новые возможности.
В частности, был усовершенствован инструмент CuttingTool — динамическое сечение плоскостью. Добавлено управление положением плоскости с помощью интерактивных инструментов — манипулятора сдвига или манипулятора поворота.
Одним из самых важных нововведений, касающихся интерактивных инструментов, является реализация манипуляторов. Базовый класс манипуляторов называется SceneWidget, применяется как отдельно, так и в составе процессов редактирования объектов. Он представляет некую оболочку, включающую процессы, с помощью которых обеспечивается его поведение, а также модель представления на экране. Процессы, описывающие поведение SceneWidget, могут быть инициализированы локаторами, которые будут определять поведение манипулятора.
В SceneWidget для манипуляторов предусмотрены и реализованы стандартные процессы поведения и их модели, охватывающие около 80% необходимых решений:
- Hot-point — виджет с определенным представлением и поведением
- манипулятор сдвига, реализующий сдвиг по определенной оси
- манипулятор поворота, реализующий вращение вокруг осей.
Мы прилагаем множество усилий для того, чтобы C3D Vision отвечал самым высоким требованиям пользователей. В ближайшей перспективе запланировано решение таких задач, как разработка материалов с поддержкой и использованием шейдеров, включая стандартный набор материалов, основанных на представлении текстового формата .JSON, разработка OcclusionCulling — критически необходимой функции, обеспечивающей оптимальную производительность отрисовки сложных моделей, а также создание продиктованного временем «облачного» решения с сохранением максимально возможного сходства API с Vision и предоставлением привычной среды как для опытных пользователей модуля, так и для новичков.
Автор:
Артем Максименко
Команда C3D Vision