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 →

