Учебный двумерный физический движок на C++17 с визуализацией через raylib. В интерактивной сцене можно создавать шары, менять их материал и размер, бросать их на платформы и наблюдать за столкновениями, трением и вращением.
- Столкновения шаров между собой, со стенами и неподвижными платформами.
- Вращение и трение: шары могут скользить и катиться по поверхности.
- Три материала — дерево, резина и сталь — с разной плотностью, упругостью и трением.
- Неподвижные шары, которые служат дополнительными препятствиями.
- Захват и бросок мышью через пружину с демпфированием.
- Пауза, пошаговая симуляция и отключение гравитации.
- Отладочная отрисовка границ тел, скоростей и нормалей контактов.
- Счётчики тел, контактов и частоты кадров.
Сборка и запуск проверены на macOS с Apple M1 и raylib 6.0. Для сборки нужны компилятор с поддержкой C++17, raylib и pkg-config.
Если инструменты разработчика Apple ещё не установлены:
xcode-select --installУстановите зависимости через Homebrew:
brew install raylib pkg-configОткройте терминал в папке проекта и выполните:
clang++ popo.cpp -std=c++17 -O2 -Wall -Wextra $(pkg-config --cflags --libs raylib) -o popo
./popoКомпилируйте именно popo.cpp. Если в папке есть старый main.cpp, он относится к отдельной программе и не нужен для сборки Physics Lab.
Если компилятор не находит raylib.h, проверьте доступность библиотеки:
pkg-config --modversion raylib
pkg-config --cflags --libs raylibКоманды должны вывести версию библиотеки и параметры её подключения.
Действия мышью и добавление неподвижного шара работают в области сцены под верхней панелью.
| Действие | Управление |
|---|---|
| Добавить шар | Левая кнопка мыши |
| Захватить и бросить шар | Удерживать правую кнопку на шаре, переместить мышь и отпустить |
| Удалить шар | Средняя кнопка мыши на шаре |
| Изменить размер нового шара | Колесо мыши |
| Выбрать дерево, резину или сталь | 1, 2, 3 |
| Добавить неподвижный шар | B — в позиции курсора |
| Включить или выключить паузу | Пробел |
| Выполнить один шаг на паузе | N |
| Включить или выключить гравитацию | G |
| Восстановить начальную сцену | R |
| Удалить все шары, сохранив платформы | C |
| Показать или скрыть отладочную отрисовку | Tab |
| Закрыть программу | Esc |
Выбор материала и размера применяется к новым шарам. Линия на шаре показывает его вращение; неподвижные шары отмечены крестом. На паузе физика захвата мышью обновляется только при выполнении шага клавишей N.
Симуляция использует фиксированный шаг 1/120 секунды с четырьмя подшагами. Перед проверкой столкновений тела сортируются по левой границе вдоль оси X: это позволяет пропускать пары, чьи горизонтальные границы не пересекаются.
Контакты разрешаются методом последовательных импульсов. На каждом подшаге выполняются 16 проходов расчёта скоростей и 6 проходов коррекции положения. Нормальные и касательные импульсы накапливаются в пределах подшага. Трение рассчитывается по модели Кулона, а момент инерции — для сплошного диска.
Отдельно обрабатываются совпадающие центры шаров и попадание центра внутрь платформы. Контакты хранят индексы тел; при добавлении или удалении тел список контактов очищается.
Тесты запускают физику без графического окна. Из папки проекта выполните:
clang++ tests/popo_physics_test.cpp -std=c++17 -O1 -g -Wall -Wextra \
-fsanitize=address,undefined $(pkg-config --cflags --libs raylib) \
-o /tmp/popo-tests
/tmp/popo-testsВ набор входят 11 проверок: лобовое столкновение и сохранение количества движения, разделение совпадающих шаров, выход из платформы, неподвижные тела, трение и вращение, устойчивость стопки, быстрый удар о платформу, начальная сцена, захват мышью, удаление тел и ограничение их количества.
При успешном выполнении каждая проверка выводит PASS. Сборка также включает средства обнаружения ошибок памяти и неопределённого поведения.
| Файл | Назначение |
|---|---|
popo.cpp |
Физика, визуализация и обработка управления |
tests/popo_physics_test.cpp |
Автоматические проверки физики |
README.md |
Описание, сборка и управление |
LICENSE |
Лицензия проекта |
- Движущиеся тела имеют форму круга; прямоугольные платформы неподвижны.
- В сцене может быть не более 500 шаров.
- Скорость ограничена 1800 пикселями в секунду.
- Подшаги снижают риск пролёта сквозь объекты, но непрерывное обнаружение столкновений не реализовано.
- При задержке кадра больше 0,1 секунды часть прошедшего времени отбрасывается, поэтому симуляция замедляется относительно реального времени.
- Параметры материалов подобраны для демонстрации и не предназначены для инженерных расчётов.
- Сохранение и загрузка сцены пока не реализованы.
Проект распространяется по лицензии MIT. Авторское уведомление сохранено в файле лицензии.