Hacker News Digest

06 сентября 2025 г. в 01:39 • wedesoft.de • ⭐ 201 • 💬 62

OriginalHN

#clojure#lwjgl#opengl#jolt-physics#instaparse#gloss#coffi#malli#claypoole#3d-graphics

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).