Jolt Physics
Многоцелевая дружелюбная библиотека физики физики и обнаружения столкновений. Подходит для игр и виртуальных приложений. Используется Horizon Forbided West.
|
|---|
| Видео на YouTube, показывающее кучу RagDoll, смоделированную с помощью физики JOLT. |
Для получения дополнительных демонстраций и видео перейдите в раздел образцов.
Соображения дизайна
Зачем создавать еще один физический двигатель? Во -первых, это был личный учебный проект. Во -вторых, я хотел решить некоторые проблемы, которые у меня были с существующими физическими двигателями:
- Игры делают больше, чем моделирование физики. Эти вещи происходят по нескольким темам. Мы подчеркиваем одновременный доступ к данным физики за пределами основного обновления симуляции:
- Разделы симуляции могут быть загружены / выгружены в фоновом режиме. Мы готовим партию физических тел на фоновой потоке, не блокируя и не влияя на моделирование. Мы вставляем партию в симуляцию с минимальным влиянием на производительность.
- Запросы на столкновение могут работать параллельно с добавлением / удалением или обновлением тела. Если в той же потоке произошло изменение в теле, изменение будет немедленно видимо. Если изменение произошло в другом потоке, запрос увидит последовательный до или после состояния. Альтернативой будет прочитать версию мира чтения и писать. Это предотвращает немедленно видимые изменения, поэтому мы избегаем этого.
- Запросы на столкновения могут быть параллельно основной физике моделирования. Мы делаем грубую проверку (широкий фазовый запрос) перед шагом моделирования и делаем тонкие проверки (узкий фазовый запрос) на заднем плане. Таким образом, длительные процессы (например, генерация навигационной сетки) могут быть распределены по нескольким кадрам.
- Случайный пробуждение тел вызывает проблемы с производительностью при загрузке / разгрузке контента. Поэтому тела не будут автоматически просыпаться при создании. Соседние тела не будут разбудить, когда тела будут удалены. Это может быть вызвано вручную при желании.
- Симуляция работает детерминированно. Вы можете воспроизвести симуляцию с удаленным клиентом, просто повторив входы в моделирование. Прочитайте раздел детерминированного моделирования, чтобы понять пределы.
- Мы пытаемся имитировать поведение жестких тел в реальном мире, но делаем приближения. Следовательно, эта библиотека должна быть в основном использоваться для игр или виртуальных веществ.
Функции
- Моделирование жестких тел различных форм с использованием непрерывного обнаружения столкновений:
- Сфера
- Коробка
- Капсула
- Конусная капсула
- Цилиндр
- Конический цилиндр
- Выпуклый корпус
- Самолет
- Сложный
- Сетка (треугольник)
- Местность (поле высоты)
- Моделирование ограничений между телами:
- Зафиксированный
- Точка
- Расстояние (включая пружины)
- Петля
- Слайдер (также называемый призматическим)
- Конус
- Стойка и шестерня
- Механизм
- Шкив
- Плавные пути сплайна
- Свинг-трюк (для гуманоидных плеч)
- 6 Доф
- Двигатели для управления ограничениями.
- Обнаружение столкновения:
- Кастинг лучи.
- Тестирование форм против форм.
- Лицовая форма против другой формы.
- Broadphase только проверяет, чтобы быстро определить, какие объекты могут пересекаться.
- Датчики (триггерные объемы).
- Анимированные тряпки:
- Твердый ключ (кинематические только жесткие тела).
- Мягкий ключ (установка скоростей на динамических жестких тела).
- Движение моторов ограничений на анимированную позу.
- Картирование скелета с высокой детализацией (анимация) на скелете с низкой детализацией (Ragdoll) и наоборот.
- Игровое моделирование персонажа (капсула)
- Жесткий характер тела. Двигается во время физического моделирования. Самый дешевый вариант и самый точный ответ на столкновение между характером и динамическими телами.
- Виртуальный персонаж. Не имеет твердого тела в симуляции, но имитирует один, используя проверки столкновений. Обновлено за пределами обновления физики для большего контроля. Менее точное взаимодействие с динамическими телами.
- Транспортные средства
- Колесные транспортные средства.
- Отслеживаемые транспортные средства.
- Мотоциклы.
- Мягкое моделирование тела (например, мягкий шар или кусок ткани).
- Краевые ограничения.
- Двудодные ограничения изгиба.
- Тетраэдр объемные ограничения.
- Ограничения прикрепления больших расстояний (также называемые Tethers).
- Ограничение симуляции, чтобы оставаться в определенном диапазоне вершины с кожей.
- Внутреннее давление.
- Столкновение с моделируемыми жесткими телами.
- Испытания на столкновение с мягкими телами.
- Расчеты водной плавучести.
- Дополнительный режим двойной точности, который позволяет большим мирам.
Поддерживаемые платформы
- Windows (рабочий стол или UWP) x86/x64/arm32/arm64
- Linux (протестирован на Ubuntu) x64/arm64
- FreeBSD
- Android X86/X64/ARM32/ARM64
- Платформа Blue (популярная игровая консоль) x64
- MacOS X64/ARM64
- iOS X64/ARM64
- Msys2 mingw64
- Webassembly, см. Этот отдельный проект.
Требуемые функции процессора
- На x86/x64 минимальные требования являются SSE2. Библиотека может быть составлена с использованием SSE4.1, SSE4.2, AVX, AVX2 или AVX512.
- На ARM64 библиотека использует Neon и FP16. На ARM32 он может быть составлен без каких -либо специальных инструкций процессора.
Документация
Чтобы узнать больше о Jolt, перейдите к последней архитектуре и документации API. Документация для конкретного выпуска также доступна.
Чтобы начать, посмотрите на пример Helloworld. Пример Helloworld с использованием Cmake FetchContent также доступен, чтобы показать, как вы можете интегрировать физику Jolt в проект Cmake.
Некоторые алгоритмы, используемые JOLT, подробно описаны в моем GDC 2022 Talk: Архитирование физики JOLT для «Запретного Запада горизонта» (слайды, слайды с нотами динамика, видео).
Компиляция
- Компиляции с Visual Studio 2019+, Clang 10+ или GCC 9+.
- Использует C ++ 17.
- Зависит только от стандартной библиотеки шаблонов.
- Не использует RTTI.
- Не использует исключения.
Если вы хотите запустить на платформе Blue, вам нужно предоставить свою собственную среду сборки и Platformblue.h из -за требований NDA. Этот файл доступен на платформе Blue Developer Forum.
Для инструкций по сборке перейдите в раздел сборки. При обновлении из более старой версии библиотеки перейдите в разделы Notes Release или API.
Производительность
Если вы заинтересованы в том, как Jolt масштабируется с несколькими процессорами и сравнивается с другими физическими двигателями, посмотрите на этот документ.
Структура папки
- Активы - Эта папка содержит активы, используемые TestFramework, образцы и JoltViewer.
- Build - содержит все необходимое для построения библиотеки, см. Раздел сборки.
- Документы - содержит документацию для библиотеки.
- Helloworld - простое приложение, демонстрирующее, как использовать библиотеку физики Jolt.
- Jolt - весь исходный код для библиотеки находится в этой папке.
- JoltViewer - Можно записать вывод физического двигателя, используя класс DeBugRenderErcorder (файл .JOR), эта папка содержит исходный код для приложения, которое может визуализировать запись. Это полезно для, например, визуализации вывода производительности с разных платформ. В настоящее время доступно только в Windows.
- PerformanceTest - содержит простое приложение, которое запускает тест на производительность и собирает информацию о времени.
- Образцы - это содержит применение образца, см. Раздел образцов. В настоящее время доступно только в Windows.
- Testframework - структура рендеринга для визуализации результатов физического двигателя. Используется образцами и JoltViewer. В настоящее время доступно только в Windows.
- Университеты - набор модульных тестов для проверки поведения физического двигателя.
- Webincludes - ряд ресурсов JavaScript, используемых в рамках внутреннего профилирования двигателя физики.
Привязки для других языков
- C здесь и здесь
- C#
- Ява
- JavaScript
- Zig
Интеграции в других двигателях
Смотрите список проектов, которые используют физику Jolt здесь.
Лицензия
Проект распределен по лицензии MIT.
Вклад
Все взносы приветствуются! Если вы собираетесь внести большие изменения, пожалуйста, обсудите сначала в разделе обсуждения GitHub. Для нетривиальных изменений мы требуем, чтобы вы согласились с соглашением участника. Когда вы создаете PR, CLA Assistant побуждает вас подписать его.