Открыть сервис

Godot Engine: модуль geode

Geode — это встроенный модуль для работы с геометрическими фигурами в игровом движке Godot Engine, предоставляющий набор классов для создания, преобразования и анализа двумерных и трёхмерных примитивов. Модуль является частью базовой функциональности движка и используется для генерации процедурной геометрии, построения коллизий, визуализации математических абстракций и реализации инструментов редактирования уровней.

История и назначение

Модуль geode появился в ранних версиях Godot Engine как внутренняя утилита для решения задач вычислительной геометрии, которые возникают при работе с графическим редактором сцен. В отличие от полноценных библиотек геометрических ядер (например, OpenCASCADE), geode не претендует на роль САПР-системы, а решает узкий круг задач, типичных для разработки игр: определение пересечений, построение выпуклых оболочек, триангуляция полигонов и работа с сетками.

С развитием движка модуль расширялся. Начиная с версии Godot 3.0, часть функциональности geode была интегрирована в публичный API через классы Geometry и Geometry2D, что позволило разработчикам игр использовать алгоритмы модуля в скриптах GDScript и C#. В Godot 4.x модуль продолжает существовать как внутренний компонент, обеспечивающий работу PhysicsServer и редактора тайловой графики.

Основные возможности

Работа с полигонами

Ключевая функция модуля — обработка многоугольников на плоскости. Реализованы алгоритмы:

  • Триангуляция — разбиение произвольного полигона (включая многоугольники с отверстиями) на набор треугольников. Используется для отрисовки и построения коллизионных тел.
  • Выпуклая оболочка — построение минимального выпуклого многоугольника, охватывающего заданный набор точек. Применяется для оптимизации коллизий и генерации мешей.
  • Объединение, вычитание и пересечениебулевы операции над полигонами, реализованные на основе алгоритма Бентли — Оттмана для поиска пересечений отрезков.

Трёхмерная геометрия

Для трёхмерного пространства модуль предоставляет функции:

  • вычисление пересечения луча с плоскостью, сферой и ограничивающим боксом (AABB);
  • построение выпуклой оболочки из набора вершин (алгоритм Кларксона — Шора);
  • проверка принадлежности точки объёму выпуклого многогранника;
  • разбиение произвольной сетки на выпуклые части.

Аналитические вычисления

В состав модуля входят методы для расчёта расстояний между геометрическими объектами, определения ориентации точек относительно прямой или плоскости, а также функции аппроксимации кривых (например, сглаживание полилиний по методу Chaikin).

Архитектура и реализация

Модуль написан на языке C++ и расположен в исходном коде движка в директории modules/geode. Он зависит только от базовых математических классов Godot (Vector2, Vector3, Transform2D, Basis), что позволяет использовать его в серверных компонентах без привязки к графическому рендерингу.

Основные классы модуля:

  • Geometry — статический класс с набором функций для работы с 2D- и 3D-примитивами.
  • Geometry2D — подмножество методов, ориентированных на плоские задачи.
  • Triangulator — внутренний класс, реализующий алгоритм триангуляции ушной декомпозиции.
  • ConvexHull — реализация алгоритма quickhull для построения выпуклых оболочек.

В Godot 4.x часть функций geode была переписана с учётом новой системы математических типов и использования PackedVector2Array и PackedVector3Array вместо стандартных контейнеров, что повысило производительность при работе с большими массивами данных.

Применение в движке

Физический движок

Модуль geode используется при создании коллизионных форм из сеток. Когда разработчик назначает меш-объекту статическое тело, движок через geode строит выпуклую оболочку или разбивает сетку на выпуклые части для точного расчёта столкновений.

Редактор сцен

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

Процедурная генерация

Разработчики игр могут использовать методы модуля через публичный класс Geometry2D для генерации уровней, построения лабиринтов, разбиения территорий и создания декоративных элементов из простых примитивов.

Тайловые карты

При работе с тайловой графикой модуль позволяет объединять граничащие тайлы в единые полигоны, что снижает количество draw calls и упрощает построение навигационных сеток.

Пример использования в GDScript

Типичный сценарий применения модуля — построение выпуклой оболочки для массива точек:

```gdscript var points = PackedVector2Array([Vector2(0, 0), Vector2(10, 0), Vector2(10, 10), Vector2(5, 5), Vector2(0, 10)]) var hull = Geometry2D.convex_hull(points)

hull содержит вершины выпуклого многоугольника

```

Для триангуляции полигона с отверстием используется метод triangulate_polygon, который принимает массив полигонов, где первый элемент — внешний контур, а последующие — отверстия.

Ограничения и альтернативы

Модуль geode не предназначен для операций с произвольными поверхностями (NURBS, сплайны Безье высоких порядков) и не поддерживает топологические операции над трёхмерными сетками (например, булевы операции над мешами). Для таких задач в Godot рекомендуется использовать внешние библиотеки, подключаемые через GDExtension, либо инструменты моделирования, работающие до импорта ассетов.

Среди известных ограничений — отсутствие устойчивой обработки вырожденных случаев (самопересекающиеся полигоны, нулевые площади), что требует предварительной валидации входных данных. В отличие от специализированных библиотек (Clipper2, libigl), geode не гарантирует численную устойчивость при работе с экстремально большими координатами или при очень узких треугольниках.

Сравнение с аналогами

В игровых движках аналогичную функциональность предоставляют:

  • Unity — через сторонние ассеты (Poly2Tri, Clipper) и встроенные методы Mesh.RecalculateNormals (без полноценной булевой алгебры).
  • Unreal Engine — через модуль GeometryProcessing и плагины для процедурной генерации мешей.
  • Blender (как отдельное приложение) — содержит развитый набор инструментов, но не является встраиваемой библиотекой.

Отличительная особенность geode — тесная интеграция с типами данных Godot и отсутствие необходимости в дополнительных зависимостях, что упрощает кросс-платформенную сборку движка.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →