Статьи

C3D Collision Detection: быстрое выявление коллизий в 3D-сценах

Роман Садовников, к.т.н., программист C3D Solver, C3D Labs

Роман Садовников

Модуль C3D Collision Detection применяется в различных отраслях, включая авиационную и автомобильную промышленность, где он служит для управления движением беспилотных транспортных средств (рис. 1). В робототехнике модуль обеспечивает безопасное перемещение станков ЧПУ в динамичной среде, автоматизацию упаковки и предотвращение столкновений с людьми. В игровых и медицинских приложениях модуль отвечает за обработку столкновений виртуальных объектов и используется в тренажерах для обучения проведению операций. В строительстве и логистике C3D Collision Detection помогает контролировать зазоры, реализовывать 3D-проектирование и автоматизировать строительные процессы.

C3D Collision Detection

Рис. 1. Области применения модуля C3D Collision Detection

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

Объекты, добавляемые в детектор столкновений, формируют сцену, в которой все элементы размещаются относительно общего начала координат. В сцене реализована поддержка понятий «образец» и «экземпляр», что позволяет многократно использовать один и тот же объект с разными положениями без дублирования данных. Например, экземпляр класса MbItem может быть добавлен в сцену несколько раз с различным положением, при этом поисковая структура Bounding Volume Tree строится только один раз. Это существенно снижает нагрузку на память и ускоряет вычисления.

На практике такой подход позволяет эффективно размещать повторяющиеся элементы, такие как части трубопроводов, в разных частях сцены. Благодаря повторному использованию образцов достигается экономия ресурсов и повышение производительности. Кроме того, сцена поддерживает понятие компонента — сборки из нескольких объектов с индивидуальными положениями. Древовидная структура сцены позволяет организовать быстрый и избирательный обход объектов, что ускоряет выполнение поисковых операций. Сцена также отвечает за репозицию экземпляров и компонентов, а также предоставляет средства для экспорта всей структуры в формат C3D с целью последующего повторного использования.

Функциональное API добавлено нами недавно. Оно принято в качестве основного, и все вызовы объектно-ориентированного API перенаправляются на вызовы функционального API. Это полезно для последующего журналирования с целью регрессионного тестирования и удаленной техподдержки. Такой подход упрощает тестирование и отладку, т. е. нужно тестировать и отлаживать только функциональное API. Легко создавать обертки для других языков программирования, таких как C#, JavaScript и Python. Это упрощает структуру программы (нет сложных иерархий классов), способствует модульности и повторному использованию кода, а также облегчает реализацию параллельных и распределенных вычислений.

C3D Collision Detection

В функциональном API было введено два вспомогательных типа. Это CDM_component, который позволяет добавить в сцену компонент с определенным положением в глобальной системе координат сцены (рис. 2). Другой тип — CDM_instance, который позволяет добавить экземпляр MbItem со своим положением относительно либо компонента, либо глобальной системы координат сцены.

C3D Collision Detection

Рис. 3. Тип CDM_Instance и пример кода

Рассмотрим удобство использования функционального API (рис. 3). Первая строка кода создает сцену и выделяет необходимые ресурсы. Третья и четвертая строки добавляют компонент в глобальной системе координат сцены. Пятая и шестая строки добавляют экземпляр какого-то тела, в данном случае в локальную систему координат компонента. В шестой строке добавляется экземпляр в компонент, который уже будет иметь положение в глобальной системе координат сцены, и это будет вычислять детектор. Пользователю удобно позиционировать элементы относительно сцены. В седьмой строке проверяются коллизии, а в восьмой — ресурс освобождается, и сцена удаляется.

C3D Collision Detection

Рис. 4. Древовидная структура сцены

Далее на примере рассмотрим древовидную структуру сцены и новую схему проверки коллизий (рис. 4). Здесь показано, как добавляются два компонента, два экземпляра тела и как формируется дерево. Все эти четыре объекта являются потомками корневого узла дерева. Далее добавляем в каждый из компонентов по несколько экземпляров тел, и в итоге мы получаем показанную древовидную структуру сцены. Для обхода сцены применяется обход в ширину, где на первом этапе будут проверены коллизии между элементами корневого узла дерева и затем, если это будет сформировано поисковыми запросами, будут проверены остальные коллизии между компонентами. Такая структура позволяет эффективно управлять поисковыми запросами.

C3D Collision Detection

Рис. 5. Допуск при контроле пересечений

По запросам пользователей реализована функция SetTouchTolerance, позволяющая классифицировать незначительные пересечения как касания. В этом случае такие ситуации не рассматриваются детектором как пересечения. Для интерпретации пересечения как касания задается отрицательная толерантность. Слева на рис. 5 показан случай, когда два тела пересекаются, но при заданной толерантности результатом считается касание. Справа же пересечения нет. Если при этом необходимо зафиксировать касание, задается положительная толерантность. Этот вариант используется реже, но он также поддерживается.

C3D Collision Detection

Рис. 6. Отсечение «слабых» пересечений тел

По запросу пользователя Pilot-BIM добавлена возможность отсекать незначительные пересечения для тел B-Rep геометрии (рис. 6). С помощью функции SetToleranceDelta задаются индивидуальные значения параметра delta для каждого объекта. Это позволяет устранить пересечения путем использования delta < 0, если речь идет о допуске, либо delta > 0 — при наличии зазора (припуска).

C3D Collision Detection

Рис. 7. Репозиция объектов сцены

Добавлена новая возможность репозиции объектов сцены. Ранее поддерживалась репозиция объектов через объектно-ориентированное API, теперь появилась возможность перемещения всего компонента целиком. В приведенном на рис. 7 примере сцена состоит из двух компонентов с двумя экземплярами в каждом. Матрица преобразования применяется ко всему компоненту, включая все принадлежащие ему объекты. За перемещение каждого экземпляра отвечает детектор столкновений.

C3D Collision Detection

Рис. 8. Экспорт сцены в формат C3D

Добавлена функция ExportToC3D для экспорта сцены в формат C3D (рис. 8). Это удобно для проверки корректности расположения объектов, а также для повторного использования сцены в других задачах.

В дальнейшем планируется усовершенствование алгоритмов детектирования пересечений и касаний для тел B-Rep-геометрии с использованием точных граней и ребер. Планируется реализация API для создания объекта MbAssembly, формирующего компонент целиком со всеми объектами. По запросу заказчиков будет обеспечена нативная поддержка параллелепипедов вокруг примитивов (bounding box), используемых как коллайдеры. Продолжится совершенствование API и пользовательской документации.


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

Читайте также: