В июне вышел C3D Toolkit 2020, обновленный набор инструментов для разработки инженерных 3D-приложений. В этой статье подробно рассказываем о новинках и усовершенствованиях модуля визуализации C3D Vision — они направлены на ускорение рабочих процессов, сокращение времени на выполнение часто повторяющихся задач, повышение удобства работы.
C3D Vision отвечает за визуальное отображение геометрических моделей и функционирование графического интерфейса инженерного приложения, управляя качеством отрисовки геометрических моделей при использовании математических, программных и аппаратных средств, вследствие чего оптимизирует скорость работы программного обеспечения. В новой версии улучшения сосредоточились в основном в трех областях:
Оптимизация процессов взаимодействия с пользователем. Конвертация любых представлений GUI событий в формат Vision, усовершенствование процессов управления объектами и их редактирования, обеспечение возможности выбора устройств в пользовательских процессах, минимизация пользовательского кода для генерации сцены — все эти и иные возможности повышают производительность работы с компонентом и удобство его использования.
Новые возможности для работы с геометрическими представлениями и геометрическими объектами. Дополнительные геометрические представления, принципиально новые геометрические объекты для работы с двумерными массивами, масштабные дополнения свойств геометрии объектов имеют своей целью предоставление пользователю дополнительного функционала при построении, редактировании, отрисовке и конвертации геометрии.
Усовершенствование существующих инструментов, например новые возможности масштабирования, выбора объектов с помощью рамки, сечения плоскостью.
А теперь рассмотрим подробнее.
Фильтрация событий от физических устройств
В каждой библиотеке, например Qt или MFC, описание и представление событий выполняются в своем формате, поэтому для работы с любыми библиотеками в Vision был разработан специальный инструмент — фильтр ConverterEventListener.
Он предназначен для конвертации представления GUI событий в формат Vision, при этом источником событий, как правило, является графическое окно, где отрисовывается вся сцена, но могут быть и иные системные объекты, в частности элемент управления или главное окно. Для иллюстрации взаимодействия реализации пользовательского графического интерфейса и Vision в качестве примеров можно использовать известные библиотеки, представляющие собой источники событий.
Усовершенствование процессов управления объектами и редактирования объектов
В новой версии обновление отрисовки сцены синхронизировано с отработкой события. Например, при сдвиге мыши и повороте всей сцены обновление кадра происходит после его подготовки, что обеспечивает плавность отрисовки при любых манипуляциях с объектами или со сценой. Кроме того, теперь гарантирована однородность событий при использовании различных физических устройств, примененных в процессе, что и отражено на представленной схеме.
Определение устройств в пользовательских процессах
В C3D Vision 2020 пользователь при создании своих процессов может назначить те источники событий, которые необходимы в каждом конкретном случае.
Минимизация пользовательского кода для генерации сцены
Интеграция Vision с математическим ядром осуществляется с помощью двух классов — MathRepresentation и MathGeometry, работающих непосредственно с математическим представлением MbItem.
Такая взаимосвязь позволяет программисту создавать определенные шаблоны для генерации визуальных представлений, при этом код их будет весьма лаконичным.
// создать математическое представление SPrt<MbSurface>* mathRep = createSqrtSinSurface(); // создать визуальное представление GeometryRep* visRep = SceneGenerator::Instance()-> CreateMathRep(mathRep, MathGeometry::Synchronous); // создать сегмент с заданным родителем SceneSegment* segSurface = new SceneSegment(visRep, topParent);
Дополнительные геометрические представления
Расширен и доработан набор простых геометрических объектов, которые можно применять в инструментах как раздельно, так и в совокупности.
Маркеры и значки
Появились новые геометрические представления — маркеры и значки. В частности, были добавлены геометрические иконки на базе изображений различных форматов, символьные и часто используемые значки.
Карта высот
К новым реализованным инструментам относится и геометрический объект 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);
DoubleSidedLighting управляет назначением двустороннего освещения геометрии независимо от общего освещения сцены.
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, определяющий выбор геометрических объектов с помощью рамки: добавлена возможность выделения как объединяющей, так и секущей рамками, а также их совокупностями — слева направо и справа налево.
Выбор объектов с помощью объединяющей и секущей рамок
Новый инструмент CoordLocator предназначен для конвертации координат от физических устройств, например клавиатуры, как правило, в процессах редактирования.
Разработано три вида локаторов:
- ModelCoordLocator — конвертация значений координат в модельные координаты;
- SurfaceScreenCoordLocator — конвертация значений координат в заданную поверхность;
- CurveScreenCoordLocator — конвертация значений координат в заданную кривую.
Применение локаторов для пересчета координат в пользовательском приложении
Интерактивные манипуляторы
В области редактирования геометрических объектов с помощью различных интерактивных инструментов проведены колоссальные изменения, а также реализованы новые возможности.
В частности, был усовершенствован инструмент CuttingTool — динамическое сечение плоскостью. Добавлено управление положением плоскости с помощью интерактивных инструментов — манипулятора сдвига или манипулятора поворота.
Одним из самых важных нововведений, касающихся интерактивных инструментов, является реализация манипуляторов. Базовый класс манипуляторов называется SceneWidget, применяется как отдельно, так и в составе процессов редактирования объектов. Он представляет некую оболочку, включающую процессы, с помощью которых обеспечивается его поведение, а также модель представления на экране. Процессы, описывающие поведение SceneWidget, могут быть инициализированы локаторами, которые будут определять поведение манипулятора.
В SceneWidget для манипуляторов предусмотрены и реализованы стандартные процессы поведения и их модели, охватывающие около 80% необходимых решений:
- Hot-point — виджет с определенным представлением и поведением;
- манипулятор сдвига, реализующий сдвиг по определенной оси;
- манипулятор поворота, реализующий вращение вокруг осей.
Мы прилагаем множество усилий для того, чтобы C3D Vision отвечал самым высоким требованиям пользователей. В ближайшей перспективе запланировано решение таких задач, как разработка материалов с поддержкой и использованием шейдеров, включая стандартный набор материалов, основанных на представлении текстового формата .JSON, разработка OcclusionCulling — критически необходимой функции, обеспечивающей оптимальную производительность отрисовки сложных моделей, а также создание продиктованного временем «облачного» решения с сохранением максимально возможного сходства API с Vision и предоставлением привычной среды как для опытных пользователей модуля, так и для новичков.