Об этом проекте

godot-box3d — это GDExtension, интегрирующий Box3D, 3D-физический движок Эрина Катто, в Godot 4 как замену встроенному PhysicsServer3D. Стандартные физические узлы Godot продолжают работать: вы меняете настройку проекта, а не свои сцены. Проект описывается как ранний и экспериментальный, а сам Box3D — молодой движок. Мотивация: автор создаёт SurfsUp, воссоздание «SkillSurf» из движка Source в Godot. Серф-карты нагружают физику длинными вогнутыми тримеш-рампами, скоростными поворотами и серфом головой под геометрией. Встроенная физика Godot и godot-jolt, по сообщениям, испытывают трудности с частью этого. Box3D произошёл от Rubikon-lite от Valve, физического движка Source 2, поэтому решатель линии Rubikon показался достойным попытки. Мост между PhysicsServer3D Godot и Box3D следует архитектуре godot-jolt. По сравнению с box3d-godot, другой привязкой Box3D для Godot: box3d-godot предоставляет Box3D как 14 пользовательских узлов, работающих параллельно с физикой Godot, тогда как этот проект заменяет физику Godot. Это означает, что стандартные узлы и существующие аддоны продолжают работать, но функции, присущие только Box3D, такие как взрывы, гироскопический крутящий момент, профилирование решателя и асинхронный шаг, недоступны через интерфейс PhysicsServer3D. box3d-godot предлагает больше типов соединений (8 против 3), настоящее колёсное ограничение и больше платформ (Android, веб), тогда как этот проект поддерживает поля высот и VehicleBody3D через raycast. В README указано, что этот проект в настоящее время отстаёт от box3d-godot по типам соединений, ConeTwist и 6DOF, индексам на форму в результатах запросов, профилированию и платформам. Ни один из них не описывается как готовый к продакшену. Что работает: жёсткие, статические и кинематические тела; формы, включая коробку, сферу, капсулу, цилиндр, выпуклый многоугольник, вогнутый многоугольник (тримеш), карту высот и границу мира; области с событиями перекрытия, переопределениями гравитации/затухания, упорядочиванием приоритетов и точечной гравитацией; запросы прямого пространственного состояния (ray cast, пересечение точки и формы, shape cast, collide_shape, rest_info); body_test_motion, так что CharacterBody3D и move_and_slide() работают; мониторинг контактов с реальными точками контакта, нормалями и импульсами; исключения столкновений для отдельных пар; соединения pin, hinge и slider; многопоточный решатель с автоматическим определением физических ядер и переопределением worker_count, детерминированный при разном числе воркеров; а также тестовый проект с демо-хабом, детерминированным бенчмарком и 19 автономными регрессионными тестами. Оставшаяся работа включает separation ray shapes, соединения ConeTwist, Generic6DOFJoint3D (у Box3D нет ограничения с блокировкой/пределом/мотором по осям, поэтому точного отображения не существует), SoftBody3D, индексы на форму в результатах запросов и контактов, профилирование решателя, универсальные бинарники macOS и нотаризацию, больше платформ и архитектур, а также бенчмаркинг и настройку производительности. Различия в поведении задокументированы: Area3D не обнаруживает тела-тримеши или поля высот, поскольку вогнутые формы Box3D по замыслу не могут выступать посетителями сенсоров; collide_shape() сообщает точки контакта без глубины проникновения, потому что Box3D предоставляет GJK; для запросов формы требуется выпуклая форма запроса; а трение и упругость комбинируются иначе (sqrt(a*b) для трения, max(a,b) для упругости, против min(a,b) и ограниченной суммы у Godot), поэтому материалы могут потребовать перенастройки. README включает бенчмарк-сцену, которая сбрасывает коробки на фиксированную решётку с фиксированным зерном, пока не появится 4096 тел, запущенную на Linux с Godot 4.7.2.rc. Приведённые результаты ставят Box3D Physics выше Jolt Physics, Godot Physics и Rapier3D по телам при 16,66 мс, медианному шагу, p95 шагу, пиковому шагу и памяти в этом конкретном сценарии плотной кучи коробок. README явно предупреждает, что все четыре бэкенда выходят за бюджет задолго до 4096 тел, что это измеряет деградацию при перегрузке и что плотная куча коробок ничего не говорит о raycast'ах, контроллерах персонажей или соединениях, поэтому это следует воспринимать как отправную точку, а не рейтинг. Требования: Godot 4.3 или новее (тестовый проект нацелен на 4.7). Установка выполняется через zip-архив аддона из Releases: скопируйте addons/godot-box3d/ в проект, затем установите Project Settings → Physics → 3D → Physics Engine в Box3D Physics и перезапустите. Решатель по умолчанию использует один воркер на физическое ядро, с возможностью переопределения через physics/box3d/worker_count. macOS описывается как работа в процессе: только Apple Silicon, без нотаризации, не тестировалась дальше компиляции. Linux и Windows — протестированные платформы. Сборка использует CMake, с файлом toolchain MinGW-w64 для кросс-компиляции Windows DLL из Linux. Тестирование выполняется через автономный скрипт, который собирает расширение, регистрирует его, проверяет загрузку бэкенда и запускает 19 регрессионных тестов, завершаясь с ненулевым кодом при сбое или утечке Box3D RID. Вклад приветствуется. Лицензия MIT; Box3D — MIT, и проект черпает структурное вдохновение из godot-jolt, также MIT.