От Box2D к Box3D: Эволюция от создателя
Эрин Катто, известный разработчик, стоявший за созданием легендарного 2D-физического движка Box2D, представил Box3D. Это не просто порт, а новая архитектура, спроектированная с нуля для современных требований. Движок написан на C17 (ядро) и C++20 (примеры), что обеспечивает максимальную производительность и контроль над памятью. Версия v0.1.0 уже доступна на GitHub.
Технические особенности и производительность
Box3D использует data-oriented design (DOD) для оптимизации работы с большими объемами данных. Ключевые преимущества включают:
- Мультипоточность и SIMD: Полная поддержка SSE2 (x86) и Neon (ARM) для ускорения вычислений. Можно отключить через флаг
BOX3D_DISABLE_SIMD. - Детерминизм: Кроссплатформенная детерминированность физики, критически важная для сетевых игр и записи/воспроизведения (replay).
- Решатель: Robust rigid body solver с непрерывной физикой для быстрых перемещений и вращений, а также система «островков» (island-based sleep) для экономии ресурсов.
Физические возможности
Движок поддерживает широкий спектр примитивов и типов столкновений. Ниже приведена сравнительная таблица ключевых физических функций:
| Категория | Поддерживаемые функции |
|---|---|
| Геометрия | Выпуклые оболочки (convex hulls), капсулы, сферы, треугольные сетки (triangle meshes), высотные поля (height fields) |
| Столкновения | Непрерывное обнаружение столкновений (CCD), фильтрация столкновений, сенсорная система, рейкасты, shape casts, overlap queries |
| Соединения (Joints) | Вращательные, призматические, дистанционные, моторные, сварные, колесные. Поддержка пределов, моторов, пружин и трения |
| Управление | Character mover (управление персонажем), события движения тел, уведомления о сне |
Интеграция и кроссплатформенность
Box3D работает на Windows, Linux и macOS. Для рендеринга в примерах используется sokol (D3D11, Metal, OpenGL 4.5) и GUI на базе imgui. Библиотека не имеет внешних зависимостей, кроме стандартной библиотеки C (и libm на Unix).
Интеграция в проект проста через CMake. Рекомендуется использовать FetchContent для загрузки из Git:
include(FetchContent)
FetchContent_Declare(
box3d
GIT_REPOSITORY https://github.com/erincatto/box3d.git
GIT_TAG v0.1.0
)
FetchContent_MakeAvailable(box3d)
target_link_libraries(my_app PRIVATE box3d::box3d)
Роль ИИ в разработке
Интересный факт: Эрин Катто активно использует LLM (Large Language Models) на этапе разработки, но только для вспомогательных задач: написания unit-тестов, создания примеров, миграции кода между Box2D и Box3D, настройки сборки и code reviews. Вся основная логика и архитектура написаны вручную, что гарантирует качество и предсказуемость кода.
Лицензия и сообщество
Box3D распространяется под лицензией MIT. Разработка спонсируется через GitHub Sponsors. Pull requests в репозитории временно отключены; обратная связь принимается через GitHub Issues и Discord-сервер.
Источник: Github ↗
