Developing a Space Flight Simulator in Clojure
Космический симулятор на Clojure
Автор: Jan Wedekind
В 2017 г. увидев проприетарный Orbiter 2016, решил написать свой симулятор. Первые прототипы — на C и GNU Guile, потом перешёл на Clojure: immutable-данные, быстрые коллекции, многопоточность через atoms/agents/refs.
Сразу взялся за сложное: 3D-планета, атмосфера, тени, объёмные облака. Открыл «OpenGL Superbible», изучил исходники Orbiter (90 % кода — графика) и понял, что выбор верный.
**Зависимости**
- Clojure
- LWJGL: OpenGL, GLFW, Nuklear, STB, Assimp
- Jolt Physics — коллизии и машины
- Fastmath — матрицы/сплайны
- Instaparse + Gloss — парсинг NASA PCK/DAF
- Coffi — FFI
- Malli — схемы, Progrock — прогресс, Claypoole — параллельные циклы и др.
deps.edn для Linux:
```clojure
org.lwjgl/lwjgl {:mvn/version "3.3.6"}
org.lwjgl/lwjgl$natives-linux {:mvn/version "3.3.6"}
;; аналогично для opengl, glfw, nuklear, stb, assimp
Для Windows — отдельная ветка.
Атмосфера
Реализован precomputed scattering Брунетона: 2D-трансмиттанс, 2D-поверхностное рассеяние, 4D-Релея и Ми. Таблицы строятся численным интегрированием; высшие функции на Clojure интегрируют по сфере и отрезку. Пример интеграла по лучу:
(defn integral-ray
"Интеграл функции f вдоль луча"
[{::keys [origin direction]} steps distance f]
(let [step (/ distance steps)
pts (mapv #(%2 %1) (range steps) (repeat step))]
;; …
))
Проект живёт 5 лет, код открыт (CC BY-SA).