Приборы и звук

Никакого HUD — вся информация о полёте идёт через приборы, которые действительно висят на трапеции: два вариометра (планшет и отдельный дисплей «из 90-х»), ленточка на тросе для потока воздуха и звук — писк вариометра и звуки самого полёта.

Вариометр

Vario (scripts/instruments/vario.gd) обрабатывает вертикальную скорость планера так же, как это делает настоящий прибор:

  • Инерция датчика — фильтр первого порядка с точной дискретизацией 1−e−dt/τ1-e^{-dt/\tau} (не зависит от частоты кадров), постоянная времени 0,7 с (instruments.json); у реальных приборов — 0,5–1 с.
  • Среднее — изменение высоты за скользящее окно 25 с, делённое на окно (интегратор, как у настоящих приборов), пока окно не заполнилось — по тому, что уже есть.
  • Качество — пройденное по земле расстояние делить на потерянную высоту за отдельное окно; без снижения — «–».
  • Полёт (время, точка взлёта, пройденный путь, след) начинается с отрыва и превышения минимальной воздушной скорости, не раньше.

Звук слышит то же самое отфильтрованное значение, что показывает экран, — писк и цифры не расходятся.

Планшет (страница ПОЛЁТ)

Один полётный компьютер на центре базовой штанги — обобщённый e-ink планшет 6″ (720×960, портрет, монохром высокой контрастности, перерисовка 10 Гц, стиль сегментного LCD), без привязки к конкретной модели. Пять страниц (клавиши 1–5): ПОЛЁТ (шкала вариометра ±5 м/с, среднее, качество, высота, время, воздушная/путевая скорость, курс), КАРТА (след, цилиндры задания, автомасштаб; термики не показываются — это честный прибор, а не подсказка), ВЕТЕР (роза ветров, требуемое качество и высота прибытия до цели), ЗАДАНИЕ (список пунктов, настройки звука), ЦЕНТРОВКА (помощник термика).

Помощник центровки использует только то, что видит прибор — отфильтрованный вариометр и курс, без доступа к «настоящей» атмосфере: кружение определяется по сглаженной скорости разворота (≥ 8°/с не меньше 4 с), замеры относятся к курсу на время запаздывания датчика назад (иначе сильная сторона термика «уезжает» по кругу), первая гармоника по 36 секторам за 1,5 круга даёт сторону и силу асимметрии подъёма.

Оценка ветра — тоже только из данных, доступных настоящему прибору: по полным виражам (векторы путевой скорости GPS лежат на окружности радиусом = воздушная скорость, её центр — вектор ветра, метод наименьших квадратов) и по прямым участкам (путевая минус воздушная по курсу, сглаживание 40 с, подмешивается с меньшим весом). Оценка старше 10 минут помечается как отсутствующая.

Вариометр 1990-х

Отдельный прибор на стойке трапеции (VarioDisplay90s, scenes/instruments/vario_90s.tscn) — обобщённый дизайн без привязки к конкретной марке: сегментный ЖК без подсветки, дуга ±5 м/с с нулём сверху, крупная высота внизу, среднее и время по бокам. Датчик у него медленнее, чем у планшета (τ 1 с, среднее за 20 с) — как у простых приборов той эпохи.

Вариометр 1990-х на стойке трапеции

Звук — синтез «из 90-х»

Синтез — чистая математика в VarioSynth (scripts/audio/vario_synth.gd), звучит одинаково независимо от частоты кадров и нарезки аудиобуфера (проверено тестом побитово); нода VarioAudio только дозаполняет буфер AudioStreamGenerator.

Исследование (docs/research/vario_sounds.md) подтвердило по мануалам Flytec и Brauniger общую схему приборов той эпохи: с ростом скороподъёмности растут и высота тона, и частота повторения писков, снижение звучит отдельным непрерывным тоном. Конкретная модель прибора сознательно не выбиралась (решение — не привязываться к бренду), поэтому пресет classic_90s — обобщённый:

  • писк 700 → 2000 Гц, 2 → 11 писков в секунду, скважность 50 %;
  • тембр — меандр (нечётные гармоники, как у прямоугольного сигнала пьезозуммера) плюс резонанс пьезо около 3,2 кГц — это инженерная оценка типичных свойств пьезопищалок эпохи, а не данные одного прибора;
  • гудок на снижении 650 → 380 Гц.

Для сравнения есть современный пресет xctracer — по таблице тонов из реального мануала XC Tracer (0,1 м/с → 400 Гц/1,7 писка·с⁻¹ … 10 м/с → 1800 Гц/6,7 писка·с⁻¹, скважность растёт с 50 % до 70 %). Между табличными точками — линейная интерполяция; снижение ниже −2,5 м/с — непрерывный гудок 400→220 Гц; между порогами — тишина, гистерезис 0,05 м/с.

Чтобы писк не щёлкал на стыках буферов: фаза генератора непрерывна между вызовами, огибающая писка — линейный фронт 6–8 мс плюс сглаживание (smoothstep), частота скользит с постоянной времени 30 мс, а период и скважность фиксируются в начале каждого писка, внутри писка тон слегка подрастает (chirp, до 4 %). На стенде проверено: 0 пропусков буфера на 165, 60, 30 и даже 12 кадрах в секунду.

Ленточка на тросе трапеции

«Ниточка» (yaw string) — простейший прибор: показывает поток воздуха у крыла, без каких-либо подсказок, просто предмет в мире, как у настоящих пилотов. По просьбе пилота-консультанта — насыщенно-красная, с лёгким свечением (флуоресцентная ткань видна даже в тени), закреплена на переднем тросе трапеции (изначально была на боковом, перевешена по отзыву).

Ленточки на передних тросах трапеции

Узел крепления ищется по геометрии 3D-модели крыла без единой захардкоженной координаты (Telltale.find_anchor): либо по пустышкам TelltaleL/TelltaleR в модели, либо по материалу «Wire» у меша трапеции — так работает для всех крыльев генератора моделей.

Физика (TelltaleModel, обычный тестируемый класс): поток в точке узла = ветер в этой точке минус скорость планера с поправкой на вращение за шаг. Лента — цепочка звеньев; каждое звено стремится к равновесию между сопротивлением ткани (пропорционально квадрату отношения потока к «потоку, при котором лента отклоняется на 45°») и собственным весом, без потока висит вниз; подстройка к равновесию — безусловно устойчивая экспонента. Хвост тянется за предыдущим звеном, поверх — бегущая волна трепета с амплитудой и частотой, растущими от силы потока.

Ленточка сбоку на переднем тросе, вид из кабины

Прочие приборы

Карабин, звук пристёгивания и корпус вариометра — часть общей сборки трапеции, крепление прибора задаёт именованная пустышка InstrumentMount на модели крыла (контракт узлов — docs/guide/models.md). Нет файла модели прибора — используется заглушка из примитивов с теми же именами узлов, так же как для крыльев.

Звуки полёта

FlightAudio (scripts/audio/flight_audio.gd, логика — FlightSoundMix) собирает несколько слоёв на трёх аудиошинах (Wind, Effects, Ambient), громкость и параметры — в configs/audio.json.

СлойИсточникОт чего зависит
Шум обтекания, бафтинг у ушей, эоловы тоны тросовпроцедурный синтез (периодические лупы, физика Струхаля: частота ∝ V, мощность ∝ V⁵…⁶)воздушная скорость V, шаг синтетических «тросов» разного диаметра
Ветер в ушах / скоростной потокзаписи CC0 с freesound.orgкроссфейд по скорости: «в ушах» на 5–20 и 35–50 км/ч, «скоростной» на 55–80 км/ч
Гул паруса, трепетание задней кромки, хлопки на сваливаниизапись натянутого паруса под ветром + отдельные хлопкискоростной напор и перегрузка; хлопки — пуассоновский поток, частота ∝ квадрату сваливания
Скрипы каркасазапись трения троса/стропы под нагрузкойрезкие изменения перегрузки и болтанка, только в полёте
Шаги, дыхание, одышказаписи шагов по траве/щебню + дыханиедлина шага / путевая скорость; дыхание нарастает за 4 с бега, одышка после остановки
Посадказаписи падения на траву/грунт + удар по алюминиевой трубеоценка посадки (мягкая/жёсткая/авария), громкость ∝ вертикальной скорости
Луг, птицы, трава, порывы, колокольчикизаписи горного лугавысота над землёй (20–150 м, колокольчики — 50–400 м), ветер у земли

Все звуки — CC0 или CC-BY (с указанием авторов в титрах) с freesound.org и Kenney, отбор и обоснование каждого файла — docs/research/sounds.md. Громкость сглаживается (0,2 с), фильтр нижних частот на шине Wind открывается со скоростью (срез 800 + 60·V Гц), панорама смещается по углу скольжения.

Границы модели

  • Ленточка показывает боковой поток только в той мере, в какой он есть в модели полёта: полёт без скольжения (курс идёт строго по воздушной скорости), поэтому в ровном вираже лента смотрит строго назад — в полёте она реагирует лишь на ввод в крен (вращение узла) и на разницу ветра в точке узла и в центре крыла (болтанка). Это подтверждено ответом пилота-консультанта («в вираже лента смотрит строго назад, бокового сноса нет — правильно») — скольжение в лётную модель ради одной ленточки решено не добавлять; появится скольжение в самой физике — лента отреагирует сама, без переделки.
  • Вариометр 90-х и его звук — обобщённый образ эпохи по мануалам нескольких приборов (Flytec, Brauniger), не копия конкретной модели; тембр пьезопищалки — инженерная реконструкция, не измерение реального прибора.
  • Глиссада (страница ВЕТЕР) считается по прямой линии «расстояние / (высота − запас)», без учёта ветра и поляры (MacCready) — это следующий шаг, если понадобится.
  • Звуки полёта — гибрид из готовых записей и процедурного синтеза; синтетический вариант нужен именно потому, что записи ветра при растяжении по высоте тона на весь диапазон 20–90 км/ч звучат неестественно одинаково на разных скоростях.

Какие варианты рассматривались

  • Готовые модели вариометра (генеративный синтез звука, привязка к конкретному прибору) не подошли: решение — обобщённый дизайн и обобщённый звук эпохи, без брендов и логотипов.
  • Для звуков ветра рассматривались генеративные аудиомодели (Stable Audio Open, AudioLDM 2) — отклонены: первая требует токен доступа, которого не было, вторая — под некоммерческой лицензией CC-BY-NC-SA, несовместимой с открытым распространением игры; кроме того, готовая запись нельзя плавно менять по скорости в реальном времени, чего требует процедурный синтез.
  • Платные библиотеки звуков (Sonniss GDC, ZapSplat, Pixabay) отклонены по лицензии: либо нельзя распространять исходные файлы в открытом репозитории отдельно от игры, либо нужен логин/оплата.
  • Ленточка сначала висела на боковом тросе — перевешена на передний трос по отзыву пилота, ближе к центру поля зрения.

Подробнее