16.10.2024 • C3D Modeler

Расширение возможностей кинематической операции

Операция построения кинематического тела путем движения образующей кривой вдоль траектории относится к базовому функционалу геометрического ядра C3D Modeler. Это одна из старейших и проработанных операций построения 3D-объектов. Тем не менее наш заказчик поставил перед разработчиками ядра задачу по расширению функциональности этой операции.

Необходимо было предоставить возможность изменять плоское образующее сечение вдоль траектории. В качестве примеров управления сечением можно назвать: изменение длины кривых, ограничения угла между ними, а также требование прохождения сечения через набор кривых или касательно некоторой поверхности. Совокупность подобных требований исключала реализацию кинематической поверхности в аналитическом виде, а многообразие варьируемых параметров делало сложным управление ими.

После непростых обсуждений было решено на уровне ядра предоставить абстрактный интерфейс для получения сечения в произвольной точке траектории, а реализацию этого интерфейса перенести на сторону пользователя.

class MATH_CLASS IVariableSectionData {
public:
  /// \ru Деструктор. \en Destructor.
  virtual ~IVariableSectionData(){}

  /** \brief \ru Получить сечение.
             \en Obtain a section. \~
    \param[in]  t        - \ru Значение параметра вдоль траектории.
                           \en Value of parameter along the trajectory. \~
    \param[in]  place    - \ru Плейсмент сечения.
                           \en Placement of the section. \~
    \param[out] contours - \ru Множество двумерных контуров.
                           \en Array of plane contours. \~
    \return \ru Возвращает "true" в случае успеха.
            \en Returns "true" in case of success. \~
  */
  virtual bool GetSection(       double                         t,
                           const MbPlacement3D &                place,
                                 c3d::PlaneContoursSPtrVector & contours ) const = 0;
};

Такое решение позволило на стороне ядра сосредоточиться на построении аппроксимирующей поверхности, натянутой на набор сечений, которая бы удовлетворяла заданной точности построения. На стороне клиентского кода появилась возможность гибко управлять формой сечения.

Одним из ключевых решений, позволяющих получить максимальный эффект в этом случае, является использование на стороне клиента решателя параметрических ограничений C3D Solver. Он обеспечивает расчет формы сечений при заданных геометрических ограничениях. По сути, разработчику необходимо на момент инициализации операции осуществить «накачку» решателя, который по запросу из ядра будет решать систему ограничений и тем самым определять форму образующего сечения в заданной точке траектории. Важно отметить, что количество сегментов в образующих контурах должно быть одинаковым во всех сечениях. Неизбежную потерю производительности из-за организации цепочки взаимодействия «геометрическое ядро — пользовательский код — параметрический решатель» удалось компенсировать за счет использования параллельных вычислений на стороне ядра.

В итоге совместных усилий разработчиков С3D Labs кинематическая операция с динамически изменяемым вдоль траектории сечением получила новые возможности, которые позволяют реализовывать многообразные и гибкие сценарии для построения сложных форм в рамках одной операции. На рис. 1 приведен пример протягивании красного сечения, которое меняет свою форму вдоль оранжевой траектории. В этом примере положение центра дуги окружности и ее радиус определяются заданными пользователем функциями от длины траектории.

Пример операции кинематики с изменяемым сечением с использованием функциональных ограничений
Рис. 1. Пример операции кинематики с изменяемым сечением с использованием функциональных ограничений

Следующий пример (рисунок 2) демонстрирует использование в качестве ограничения кривых (зеленые кривые), через которые должно проходить образующее сечение (красная кривая) при движении вдоль траектории (оранжевая кривая).

Пример операции кинематики с изменяемым сечением с использованием ограничивающих кривых
Рис. 2. Пример операции кинематики с изменяемым сечением с использованием ограничивающих кривых

Анимация движения сечения представлена на рисунке 3.

Анимация изменения образующего сечения при движении вдоль траектории
Рис.3. Анимация изменения образующего сечения при движении вдоль траектории

Заключительный пример (рисунок 4) иллюстрирует возможность учета касания с внешними объектами. При формировании кинематического тела сегменты сечения AB и СD (красная кривая) должны при движении вдоль траектории оставаться касательными к поверхностям внешних тел. Дополнительно сохраняется длина линейного размера для образующего сечения.

Пример операции кинематики с изменяемым сечением с использованием ограничений в виде касаний к внешним поверхностям
Рис. 4. Пример операции кинематики с изменяемым сечением с использованием ограничений в виде касаний к внешним поверхностям

Приведенные примеры не ограничивают список возможных сценариев работы алгоритма. Это дает пользователю широчайшие возможности по построению сложных геометрических форм в рамках одной операции.

Андрей Туманин, Руководитель команды разработки C3D Modeler, к.т.н.
Андрей Туманин
Руководитель команды разработки C3D Modeler, к.т.н.
C3D Labs
Поделиться материалом
Вверх