Loading repository data…
Loading repository data…
Hausmaster333 / repository
2D orbital spacecraft simulator near Saturn built with C++17 and SFML
Лабораторная работа на C++17: двумерная ньютоновская симуляция полёта около кольца A Сатурна. SFML 2.6.2 отвечает только за окно, ввод и графику; физика находится в независимой библиотеке sim_core.
double;1/120 с;Начальная круговая скорость относительно Сатурна задаётся один раз:
v_circular = sqrt(G·M_saturn / r)
Далее объект не привязывается к окружности, а постоянно свободно падает:
a_gravity = Σ G·M_i·(r_i - r) / |r_i - r|³
standard_gravity = 9.80665 м/с² не входит в орбитальную гравитацию. Она используется только для перевода удельного импульса двигателя в расход:
dm/dt = F / (Isp·g₀)
Шаг Velocity Verlet:
r₁ = r₀ + v₀·dt + 1/2·a₀·dt²
a₁ = gravity(r₁) + thrust/m
v₁ = v₀ + 1/2·(a₀ + a₁)·dt
Такой симплектический интегратор лучше сохраняет энергию ограниченной орбиты, чем обычный или полунеявный Эйлер. Тест выполняет полный оборот и проверяет радиус и удельную энергию.
Сатурн и Пан обращаются вокруг общего барицентра. Влияние малых объектов на них игнорируется, поскольку отношение масс слишком мало. Гравитация станции, кораблей и астероидов друг на друга также не рассчитывается.
Масса и момент инерции астероида:
m = 4/3·π·r³·ρ
I = 2/5·m·r²
При радиусах 7–22 м и плотности 700–3000 кг/м³ масса одной глыбы находится примерно в диапазоне
1 000–133 800 т. Поэтому крупный астероид способен заметно изменить скорость и вращение даже линкора массой
3,309 млн тонн. В вакууме полученная угловая скорость сама не затухает.
Static означает начальную кинематическую круговую орбиту. После первого удара
корабля такая глыба освобождается, принимает равный противоположный импульс и
переходит в Gravitating. Контакт разрешается по фактически столкнувшемуся
локальному кругу корпуса с учётом угловых скоростей, поэтому корабль не
телепортируется на свой общий bounding_radius и не дрожит внутри астероида.
Сухая масса станции — 12 000 000 т, запас топлива stationkeeping — 1 000 000 т. Коррекция включается только при выходе из мёртвой зоны:
10⁻⁵;Тяга ограничена ускорением 0,005 м/с², Isp = 3000 с. K отключает или включает регулятор. После отстыковки его сила действует только на станцию.
Отдельный контур ориентации гасит накопленное вращение станции физическим моментом. Эквивалентная пара маневровых двигателей ограничена угловым ускорением 5·10⁻⁶ рад/с² и расходует тот же конечный запас топлива. Угол, угловая скорость, момент и расход видны в режиме камеры станции и в F1.
При стыковке сохраняются масса, линейный и угловой импульсы. Общий центр масс и момент инерции пересчитываются по теореме Штейнера. При отстыковке станция и корабль получают равные противоположные разделительные импульсы. Пользовательские координаты портов не изменены; средний крейсер стартует на ID 7, линкор — на H-1, ID 9.
Мягкий захват закрепляется за конкретным кораблём и конкретным портом. Контроллер и станция рассчитываются для одного момента времени, а защёлка проверяется после общего физического шага. Поэтому переключение Tab не переносит решение захвата на другой корабль. Занятый или уже зарезервированный порт исключается из поиска.
Мягкий захват учитывает расстояние, линейную и относительную угловую скорость. Финальная защёлка разрешается при расстоянии до 25 м, скорости до 5 м/с, относительном вращении до 2°/с и ошибке ориентации до 12°.
Каждый порт имеет физический коридор подхода. Контроллер сначала выравнивает
корабль на безопасной дистанции и только затем вводит его в проход. Коллайдеры
станции отключаются не целиком, а только для кругов корпуса, полностью
помещающихся в совместимый свободный коридор. Благодаря этому M-2 и M-3
не выталкивают крейсер после отстыковки.
| Параметр | Значение |
|---|---|
| Размер | 800 × 320 м |
| Сухая масса | 2 200 000 т |
| Топливо | 1 100 000 т |
| Полная масса | 3 309 280 т |
| HP | 5000 |
| Поглощение | 5 ГДж/HP |
| Основные двигатели | 3 × 300 МН |
| Дополнительные | 2 × 100 МН |
| Isp | 650 с |
| Реверс | 20% всех пяти двигателей |
| Ракеты | 80 × 20 т STD, 48 × 35 т HOMING |
| Рельсотроны | 4 башни, 1200 × 5 т, 6000 м/с |
| РЛС / захват | 60 / 40 км |
| Клавиша | Действие |
|---|---|
W | основные двигатели |
Q / E | левые / правые дополнительные двигатели |
S | 20% реверс тех же кормовых двигателей |
A / D | отклонение центрального сопла |
1 / 2 / 3 | STD / HOMING / RAILGUN |
Space | пуск или выстрел |
Tab | следующий корабль |
F | мягкий захват, стыковка или отстыковка |
K | stationkeeping on/off |
| ЛКМ | захват цели в поле или на РЛС |
| ПКМ + движение / стрелки | свободная камера |
| колесо | масштаб |
Home / O | слежение за кораблём / станцией |
C | переключить следование и свободную камеру |
| клик по строке ракеты | следовать за ракетой |
, / . или Numpad - / + | 0.25× / 1× / 5× / 20× / 100× |
M | панель активных ракет |
P | пауза |
F1 / H | диагностика / помощь |
R / N | восстановить seed / новая сцена |
Физический dt при warp не меняется. Приложение лишь выполняет больше шагов; если кадр не успевает обработать очередь, warp автоматически снижается. Поэтому 100× не усиливает удар, но показывает 100 секунд последующего перемещения и вращения за одну реальную секунду.
F1 дополнительно показывает настоящие круги коллизий кораблей, станции, астероидов, ракет и снарядов, поверхности небесных тел, щит, центры масс, конструктивный центр станции, порты и их коридоры. У отслеживаемого объекта зелёная стрелка обозначает абсолютную скорость, жёлтая — отклонение от локальной круговой скорости. В свободном режиме камеры стрелки скрыты.
cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallel 4
ctest --test-dir build --output-on-failure
cmake --install build --prefix dist --component Runtime
Запуск автономной версии:
.\dist\space_sim.exe
SFML подключена статически, поэтому рядом с EXE не нужны SFML DLL. Папка assets устанавливается CMake автоматически.
Установить компилятор, CMake и зависимости оконной части SFML:
sudo apt update
sudo apt install -y \
build-essential cmake git \
libfreetype6-dev libgl1-mesa-dev libudev-dev \
libx11-dev libx11-xcb-dev libxrandr-dev libxcursor-dev libxi-dev \
fonts-dejavu-core
Собрать и проверить проект:
cmake -S . -B build-ubuntu -DCMAKE_BUILD_TYPE=Release
cmake --build build-ubuntu --parallel
ctest --test-dir build-ubuntu --output-on-failure
Запускать приложение нужно из корня проекта, чтобы оно нашло каталог assets:
./build-ubuntu/space_sim
Для отдельной готовой папки можно выполнить установку:
cmake --install build-ubuntu --prefix dist --component Runtime
cd dist
./space_sim
SFML собирается статически внутри проекта. Системные библиотеки Linux для OpenGL, X11, устройств ввода и шрифтов устанавливаются командами выше.
CTest проверяет круговую, эллиптическую и повышенную орбиты, барицентрическое движение Сатурна и Пана, независимость результата от warp, stationkeeping, массу и импульсы при стыковке, объёмные астероиды, щит, составные коллизии, живучесть линкора, вооружение, поверхности небесных тел, камеру и snake_case проектных идентификаторов.
Дополнительные регрессионные проверки контролируют освобождение статических астероидов, парный импульс, внецентренный удар по линкору, независимость столкновения от группировки шагов warp, устойчивое разделение контакта, выход крейсера через M-2/M-3, занятые доковые коридоры, направление отстыковки, отсутствие телепортации оставшихся кораблей, сходимость мягкого захвата крейсера и линкора, изоляцию комбинации F + Tab, стабилизацию станции, реверс перехватчика/крейсера и относительное упреждение рельсотронов.
include/sim/Simulation.hpp — единый фасад и полный класс Simulation;include/sim/Physics.hpp, SimulationTypes.hpp, Entities.hpp, Station.hpp — тематические типы;src/Simulation*.cpp — координатор, физика, сцена, корабли, станция, стыковка, оружие и столкновения;src/Application.cpp — SFML, ввод, камера, HUD и renderer;tests/PhysicsTests.cpp — физическая приёмка;cmake/CheckNaming.cmake — автоматическая проверка стиля;assets — финальные спрайты, исходники и промпты;.github/workflows/ubuntu-build.yml — автоматическая сборка и тесты в Ubuntu.