09.01.2025 • C3D Vision

Как «взорвать» модель с помощью C3D Vision

Функция «Взрыв» предназначена для наглядного отображения состава модели с минимальными усилиями со стороны пользователя. Это особенно полезно в случаях, когда часть объектов скрыта внутри подсборок и недоступна для визуального анализа. Хотя можно использовать альтернативные методы, такие как скрытие или полупрозрачное отображение объектов, эти подходы становятся трудоемкими при работе с крупными и сложными моделями.

Для упрощения работы предусмотрена возможность «взрыва» модели одним кликом. Эта функциональность представляет собой режим отображения на уровне графа сцены, который помогает быстро оценить состав модели. Дополнительные настройки позволяют гибко управлять процессом разнесения объектов, облегчая навигацию, что особенно актуально для сложных моделей с большим количеством компонентов.

Одним из вариантов использования функции является режим «Салют». В этом режиме объекты внутри сборок разлетаются относительно центров своих сборок, а сами сборки — относительно общего центра.

Технически реализация функции «Взрыв» основана на классе ExplodeDispatcher, который отвечает за управление и инициализацию всех параметров. Для настройки поведения достаточно вызвать метод SetParameter, передав идентификатор команды в качестве первого параметра. Такой подход обеспечивает лаконичность кода и удобство работы с функциональностью.

Основные особенности функциональности «Взрыв»

  1. Поддержка нескольких режимов разлета.
    1. Разлет относительно центра модели.
      m_explodeDispatcher.SetParameter(cpt_Explode, data);
      
    2. Разлет относительно выбранного объекта или сборки.
      SceneSegment* pSegm;
      m_explodeDispatcher.SetSelectedSegment(pSegm);
      m_explodeDispatcher.SetParameter(cpt_ExplodeFromItem, Variant())
      
    3. Разлет относительно набора выбранных объектов или сборок.
      SceneSegment* pSegm1;
      m_explodeDispatcher.SetSelectedSegment(pSegm1);
      SceneSegment* pSegm2;
      m_explodeDispatcher.SetSelectedSegment(pSegm2);
      m_explodeDispatcher.SetParameter(cpt_ExplodeFromItem, Variant())
      
Варианты разлета модели
Рис. 1. Варианты разлета модели

  1. Обеспечение возможности опционального выбора уровня вложенности разлетающихся объектов (сборки, подсборки и т. д.).
    1. Разлет сборок и объектов верхнего уровня.
    2. Разлет сборок и объектов, содержащихся в сборках верхнего уровня, и т. д.
      m_explodeDispatcher.SetParameter(cpt_TreeLevel, data);
Выбор уровня вложенности
Рис. 2. Выбор уровня вложенности

  1. Реализация режима точечных взрывов (режим «Салют») в целях обобщения режима взрыва, когда сборки разлетаются относительно общего центра, при этом объекты сборок разлетаются относительно центра сборок.
    m_explodeDispatcher.SetParameter(cpt_ExplodeFromItem, data);

  2. Перемещение объектов по траекториям, соответствующим интуитивным представлениям о взаимосвязи объектов. Например, объекты, изначально находящиеся на одной оси, должны при разлете оставаться соосными.
     
  3. Применение дополнительных инструментов для упрощения работы с большими моделями, позволяющих быстро убирать (делать невидимыми) ненужные объекты из сцены.
    1. Размеры которых меньше или больше заданных значений.
      m_explodeDispatcher.SetParameter(cpt_FilterHideSmallItems, data);
      m_explodeDispatcher.SetParameter(cpt_FilterHideBigItems, data);
    2. Находящихся от выбранного центра более чем на заданное расстояние.
      m_explodeDispatcher.SetParameter(cpt_FilterHideByDistance, data);
Скрытие объектов в зависимости от размера и расстояния
Рис. 3. Скрытие объектов в зависимости от размера и расстояния

  1. Дополнительные опции.
    1. Возможность регулировки скорости разлета объектов.
      m_explodeDispatcher.SetParameter(cpt_Speed, data);
    2. Возможность выбора разлета объектов вдоль оси симметрии, ортогонально оси симметрии; поддержка комбинации этих режимов.
      m_explodeDispatcher.SetParameter(cpt_RadialTrajectory, data);
      m_explodeDispatcher.SetParameter(cpt_AxialTrajectory, data);
      m_explodeDispatcher.SetParameter(cpt_OrthToAxialTrajectory, data);
Выбор направления разлета
Рис. 4. Выбор направления разлета

  1. Использование функциональности C3D для вычисления главных моментов инерции применительно к вычислению осей симметрии. Если при использовании этой функциональности появятся значительные временные задержки, возможна альтернативная упрощенная реализация для быстрого вычисления осей симметрии.
    m_explodeDispatcher.SetParameter(cpt_RefineAxisSymmetry, data);

  2. Применение дерева Octree для селектирования разлетающихся объектов без задержек в моделях с большим числом объектов.

Другая важная особенность функции «Взрыв» — создание разнесенных видов одной и той же модели в пределах одного окна. При выборе определенного фрагмента сборки можно создать отдельный вид любой подсборки и установить для него все те же индивидуальные параметры для просмотра. Создание числа таких видов неограниченно. При этом имеется возможность переключения между этими видами в сеансе работы. Кроме того, функция позволяет установить ориентацию модели индивидуально или синхронизовать ее с основным видом ориентации.

SceneSegment* pSegmSelected;
int maxTabNumber = m_explodeDispatcher.GetMaximumTabNumber();
std::string tabName = m_mainTabName + m_tabNameSeparator + std::to_string(++maxTabNumber == 1 ? ++maxTabNumber: maxTabNumber);
if (m_explodeDispatcher.CreateNewItem(tabName, pSegmSelected))
m_tabWidget->setCurrentIndex(m_tabWidget->addTab(new QWidget(), tabName.c_str()));

Создание видов
Рис. 5. Создание видов

Протестировать возможности функции «Взрыв» можно в примере №43 ExplodeManager в поставке дистрибутива.

Поделиться материалом
Вверх