Ветер у склона, подветренная зона, ротор и волна
Дельтаплан парит у горы, потому что ветер, наткнувшись на склон, вынужден идти вверх. За гребнем происходит обратное: воздух срывается, возникает зона опускания и болтанки — «ротор», в которую дельтапланеристы залетать избегают. Ниже — как это считается формулами (аналитика), откуда они взяты и что в них заведомо упрощено.
В игре подъём у склона, разгон на бровке, седловина и ротор теперь берутся из физического поля воздуха — модель воздуха. Формулы на этой странице остались запасным путём: на них игра переходит, если поле не удалось посчитать, и вне области поля. Пункты «чего формула не умеет» ниже относятся к ним.
Как это устроено
Весь воздух в игре пилот получает через одну функцию Atmosphere.air_velocity_at(pos)
(scripts/atmosphere/atmosphere.gd), и модель полёта вызывает её сразу в трёх точках — центр крыла
и обе консоли, — поэтому разный поток по размаху кренит и болтает крыло само по себе, без отдельного
«крена от порыва». Рельеф атмосфера знает через кеш GroundField — сетку 30 м с высотой и уклоном
в каждом узле.
Горизонтальный ветер растёт с высотой над землёй под пилотом по степенному закону и отдельно — с высотой над уровнем моря:
Направление ветра — одно на весь мир, рельеф его не поворачивает.
Склоновый подъём. У самой земли воздух идёт вдоль рельефа: чем круче склон против ветра, тем сильнее вертикальная составляющая. Точка, где берётся уклон, сдвинута вперёд по ветру (чем выше пилот — тем дальше от склона «чувствуется» подъём), а сила подъёма затухает с высотой:
где точка градиента взята со сдвигом 0,8 · agl (максимум 400 м) против ветра. Числа — из
configs/atmosphere.json → ridge: efficiency 0,85, decay_height_m 250, forward_shift_factor 0,8,
forward_shift_max_m 400, max_lift_ms 6.
Подветренная зона и ротор. За гребнем считается «линия тени» — граница, ниже которой при данном
ветре начинается зона отрыва потока: s(p) = maxᵢ(h(p − ŵ·dᵢ) − dᵢ·tg 12°) (отсчёты против ветра на
60…1600 м). Пилот ниже этой линии — в роторе. Сила зоны растёт с глубиной под линией и с высотой самого
препятствия и даёт:
- опускание
0,25…0,7 · u · lee(доля растёт с ветром — «опасность»gот 2 до 5 м/с); - болтанку σ
0,5…0,9 · u · lee; - редкие рывки вниз в пятнах шума, переносимых ветром;
- обратный поток у самой земли.
Замер на модельном хребте 300 м (tests/atmosphere/test_lee_rotor.gd):
| ветер на старте | средний w в роторе | σ | наветренный w / σ |
|---|---|---|---|
| 2 м/с | −0,74 м/с | 0,94 | +1,2 / 0,6 |
| 5 м/с | −3,8 м/с | 3,4 | +3,0 / 1,5 |
| 8 м/с | −6,0 м/с | 5,0 | +4,8 / 2,4 |
Полёт на триммере через гребень 50 м выше него при ветре 6 м/с: −126 м за 30 с (в штиль — −25 м).
Волна (wave_field.gd) — линейная теория Скорера вдоль направления ветра: смещение линий тока —
свёртка уклона рельефа с cos(k·d)·exp(−d/L), длина волны λ = 2πU/N (N — частота Брента — Вяйсяля).
В гребнях волны — подъём, под ними у земли — роторы, на верхних точках рельефа — линзовидные облака.
Слово «волна» пилоту нигде не показывается (оно ей незнакомо), в интерфейсе — только «ветер» и
«откуда». По умолчанию волна выключена (wave_strength = 0 во всех текущих погодных сценариях);
подветренная зона и ротор при этом работают всегда, от одного ветра.
Физика: законы и приближения
Ключевая идея — модель тонкого возмущения над рельефом (линейная теория Джексона — Ханта): поток
раскладывается на средний профиль плюс малое возмущение от формы холма, возмущение убывает с высотой
на масштабе полуширины холма. Наша формула w = U·∇h с экспоненциальным затуханием — это её грубое,
«орнитологическое» приближение (та же формула используется в моделях подъёма для хищных птиц), без
согласования горизонтали и вертикали через уравнение неразрывности.
Реальные величины, с которыми модель сверялась (docs/research/slope_wind.md, docs/research/calibration_data.md):
| Явление | Типичные значения | Источник |
|---|---|---|
| Ускорение ветра над вершиной (у земли) | ΔS_max ≈ B·H/L: B ≈ 2,0 (длинный хребет), 1,6 (сопка), 0,8 (уступ) | Jackson & Hunt 1975; Taylor & Lee 1984 |
| Спад ускорения с высотой | ΔS(z) ≈ ΔS_max·exp(−A·z/L), A ≈ 2,5–4 | Taylor & Lee 1984, ASCE 7 |
| Askervein (H = 116 м) | ускорение на вершине на 10 м ≈ +80 % | Taylor & Teunissen 1987 |
| Седловина (натурные замеры) | +40…60 % к подходу на 10 м AGL | Neal 1982, Gebbies Pass |
| Отрыв потока за гребнем | начинается при подветренном уклоне ≳ 15–20° | Wood 1995 |
| Полоса подъёма | ≈ высота склона от подножия, на хорошем хребте — до 1–2 высот | FAA AC 00-6A; York Soaring, Condor |
Границы модели
- Высота полосы подъёма не зависит от размера склона. У нас затухание всегда
exp(−agl/250 м). В жизни масштаб затухания — ширина самого склона L: над узким крутым гребнем подъём в модели тянется выше, чем должен, над широким пологим — гаснет слишком рано. - Нет ускорения ветра над гребнем. Реально на бровке ветер на 30–90 % сильнее, чем перед склоном; у нас горизонтальный ветер зависит только от высоты над морем, а не от формы рельефа.
- Мелкий рельеф «бьёт» на любой высоте. Уклон берётся в одной точке с базой 60 м, поэтому лощинка
шириной 100 м даёт такой же провал на высоте 100 м, как у земли — только умноженный на общую
экспоненту. Физически возмущение от детали размером λ должно затухать с высотой как
exp(−2πz/λ). - Поток не трёхмерный. Уединённая сопка, отрог («нос») и цирк («чаша») с одинаковым уклоном вдоль ветра дают у нас одинаковый подъём; реально сопку воздух частично обтекает с боков (подъём слабее), в чаше поток сходится (подъём сильнее).
- Угол ветра к хребту учтён только как косинус; поворот ветра вдоль хребта, усиление болтанки при косом ветре — нет.
- Седловина / перевал («труба») не усилены — в модели, наоборот, слабее: ниже высота над морем и положе уклон вдоль ветра дают меньший, а не больший подъём и ветер. Сжатия потока в понижении нет.
- Нет устойчивости атмосферы. Склоновый поток одинаков в устойчивый и неустойчивый день; в жизни при устойчивой стратификации воздух не переваливает через высокие вершины, а обтекает их и уходит в понижения — «труба» в перевалах должна быть сильнее именно тогда.
- Масса не сохраняется: горизонталь и вертикаль считаются независимо друг от друга.
- Отрыв — только через линию тени с фиксированным углом 12°, без зависимости от шероховатости поверхности и формы бровки; наветренного «пузыря» у подножия крутого обрыва нет.
По пилотскому отзыву провалы и удары вниз за гребнем ощущаются правильно — это сумма нескольких слагаемых (кольцо опускания вокруг термика, фон между термиками, опускание и рывки ротора, турбулентность, отклик крыла на перегрузку), и при доработке склона её решено не трогать.
Что рассматривали и почему так
Сравнение нашей формулы с потенциальным обтеканием двумерного хребта (профиль Аньези) показало: сила подъёма у земли в целом правдоподобна (расхождение 10–20 %), но перечисленные выше пункты — нет. Рассмотренные варианты доработки (от дешёвого к дорогому):
- Улучшенная аналитика (сглаживание уклона по высоте, масштаб затухания = ширина склона, ускорение над гребнем по Тейлору — Ли, признак седловины) — дни работы, рантайм почти не меняется; закрывает почти все найденные расхождения, но остаётся набором эвристик.
- Линейная 3D-теория через БПФ рельефа — согласованные подъём, ускорение над гребнем, обтекание сопок сбоку, поворот ветра; отрыва всё равно нет.
- Массосогласованное диагностическое поле (WindNinja-подобное) — плюс блокировка и «труба» в перевалах при устойчивом воздухе; всё ещё без реального отрыва и роторов.
- Офлайн-CFD — отрыв и реальные роторы, но только для встроенных локаций, сотни МБ данных, и даже CFD плохо предсказывает турбулентность в следе (проверено на полигоне Askervein).
Ни один из вариантов сам по себе не выбран: вместо точечной доработки склона решено считать одно физическое поле воздуха сразу для ветра, подъёма и термиков (план docs/plan/air_model.md), и это сделано — см. модель воздуха. Рассматривался и более узкий план — поле ветра на сетке, согласованное только по массе (docs/archive/plan/wind-field.md) — но в нём не было ни тепла (значит, ни термиков, ни разницы нагретого и холодного склона), ни инерции (мгновенный пересчёт при смене погоды); план воздуха в трёх масштабах его заменил.
Дальше
Модель воздуха в трёх масштабах (страница, docs/guide/air-model.md) даёт разгон на бровке, седловину, обтекание сопок сбоку и ротор не отдельными формулами для склона, а как следствие одного уравнения для всего поля воздуха. Там же — что она пока не умеет: например, разгон у бровки занижен на 15–20 %, а седловина даёт ×2,05 вместо ×1,5.
Подробнее
- docs/research/slope_wind.md — полное исследование: числа, формулы, сравнение с другими симуляторами, вопросы пилоту.
- docs/research/calibration_data.md — таблица опорных наблюдаемых для калибровки (разгон над гребнем, седловины, ущелья).
- docs/guide/atmosphere.md — устройство модуля атмосферы целиком.
- scripts/atmosphere/atmosphere.gd, scripts/atmosphere/ground_field.gd, scripts/atmosphere/wave_field.gd — код.
- configs/atmosphere.json — все числовые параметры (
ridge,lee,wave).