Skip to content

About

Реализация физического 2д движка на C++

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Physics Lab

Учебный двумерный физический движок на C++17 с визуализацией через raylib. В интерактивной сцене можно создавать шары, менять их материал и размер, бросать их на платформы и наблюдать за столкновениями, трением и вращением.

Возможности

  • Столкновения шаров между собой, со стенами и неподвижными платформами.
  • Вращение и трение: шары могут скользить и катиться по поверхности.
  • Три материала — дерево, резина и сталь — с разной плотностью, упругостью и трением.
  • Неподвижные шары, которые служат дополнительными препятствиями.
  • Захват и бросок мышью через пружину с демпфированием.
  • Пауза, пошаговая симуляция и отключение гравитации.
  • Отладочная отрисовка границ тел, скоростей и нормалей контактов.
  • Счётчики тел, контактов и частоты кадров.

Сборка и запуск

Сборка и запуск проверены на macOS с Apple M1 и raylib 6.0. Для сборки нужны компилятор с поддержкой C++17, raylib и pkg-config.

macOS

Если инструменты разработчика 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. Авторское уведомление сохранено в файле лицензии.

About

Реализация физического 2д движка на C++

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages