План: 3D-модели и конфиги крыльев по ТЗ (docs/research/glider_3d_tz.md)
Ветка wings/models3d (от main 5df933e), рабочая копия ~/deltaplan-wings3d, координатор — dp-coordinator. Задачи — в своих копиях ~/deltaplan-wings3d-<задача>, ветки wings3d/<задача>. Журнал — docs/archive/plan/wings-models3d-progress.md, контракты — docs/contracts/wings-models3d.md.
Цель
- Обновить 3D-модели 9 существующих крыльев по разделам E1–E9 ТЗ.
- Конфиги существующих — сверены и поправлены прошлой работой (
docs/research/wings_config_sources.md); здесь — только то, что вытекает из правок 3D (согласованность К1/К2). - Добавить 39 новых крыльев N1–N39: запись
glider_params.json, модельglider_<id>.glb, конфиг, перевод названия.
Решения пользователя (не обсуждаются)
- Точность: достаточно, чтобы с 3 м было похоже; не шлифовать; мелкие визуальные детали — не больше 2 попыток, берётся лучшая.
- Поляры: приоритет DHV; поляры без данных DHV не менять; абсолютным L/D заявок не верить;
combat.best_glideне калибровать. - Тип конструкции без цитаты — по году и классу, по умолчанию мачтовое.
- Совместимость не нужна: форматы конфигов и моделей можно менять.
- Внешние 3D-ассеты — только с подходящей лицензией (учёт в ASSETS.md). Здесь не нужны: модели строятся параметрическим скриптом.
Решения пользователя на шлюзе 1 (2026-10-01)
Поляры новых крыльев — вариант А: пересчёт по нагрузке от базы; расхождение с DHV Vmin — в
_doc, относительно базы, без порога 10 % (К4 v2). Варианты Б (тянуть к DHV Vmin) и В (исследование определения Vmin) не делаем.Приняты решения координатора: N19 Spyder — безмачтовое (
topless), N28 Litesport — мачтовое (kingpost), N15 MastR — мачтовое с оценкой высоты мачты; К3 v2.Дальше без шлюзов между волнами (если нет развилок): волна 2 (W3-03, W3-04), затем волна 3 (W3-05, W3-06), отчёт после волны 3 — что сделано, коммиты, по скриншоту на крыло (можно склейкой), открытые вопросы. Строки
docs/guide/models.mdдля N1, N24 — в волне 2. В main не вливать.Уточнение (2026-10-01): задача волн 2–3 — добавить много крыльев, корректность — по отзывам игроков; развилки решает координатор сам (журнал: «развилка → решение → почему»), возврат раньше — только при блокировке.
Что уже есть (шаблон)
Параметрический построитель крыла уже есть: tools/blender/build_gliders.py + glider_params.json (К1). Новая модель = новая запись (копия базы + значения из «Что задать») → сборка. Не хватает: машиночитаемой спецификации из ТЗ (К3), скрипта, который из неё пишет запись параметров, конфиг (поляра по К4) и перевод, и списков без жёстко зашитых id (render_all.sh, check_models.gd).
Границы
- Поляры новых крыльев — подобием от базы того же класса (К4), не по заявкам; L/D базы не меняется.
- Форма паруса, закрутка, профиль, высота кингпоста — от базы (в паспортах чисел нет).
- Модуль воздуха, физику полёта, меню (кроме вместимости списка крыльев) не трогаем.
- Цена: +39 моделей ≈ 0,5–0,7 МБ каждая (+ карты паруса) — сборка вырастет на ≈ 25–35 МБ.
Волна 1 — существующие крылья и шаблон (шлюз после)
W3-01. Существующие крылья по E1–E9 — dp-engineer (Opus).
- Скоуп:
glider_params.json→training(tip_chord_m0,90 → 1,00),sport(battens_per_side14 → 11,nose_forward_m1,30 → 1,35,nose_angle_deg132 → 128,lower_cover0,70 → ≈0,9 по К1),combat(battens_per_side16 → 12),laminar(battens_per_side13 → 9); E2, E6–E9 — без правок. Пересобрать изменённые модели. Убрать жёсткие списки id изtools/blender/render_all.sh,scenes/models_preview/check_models.gd(брать изconfigs/wings/*.json), строкуkindвrender_views.py. - Приёмка:
test_wing_models_contractзелёный;check_models.gd— ИТОГ: OK; тесты крыльев (test_wings, test_polar, test_mass, test_wing_catalog, test_wing_picker, test_roll, test_stall, test_landing, test_ground) — без новых падений; рендеры «было/стало» (снизу, 3/4, сбоку) для 4 изменённых крыльев вbuild/screenshots/w3-01/.
W3-02. Шаблон новой модели: спецификация (К3), применяющий скрипт (К1, К2, К4), проба на N1 и N24 — dp-engineer (Opus).
- Скоуп:
make_3d_tz.pyдополнительно пишетout/wings3d_spec.json(К3; ТЗ при перегенерации не меняется по числам); новый скриптtools/research/data/wing_passports/make_new_wings.py <id…>— записьglider_params.json(копия базы +params+ своя раскраска),configs/wings/<id>.json(копия базового конфига +config+ поляра по К4 +_docс источниками), строкаlocale/ui.csv(название «Производитель Модель Размер», ru = en); пробно — N1icaro_piumaи N24ww_t2c: модели, конфиги, перевод. Проверить меню выбора крыла при 15–20 крыльях в группе (временно сгенерировать все 39 конфигов, не коммитить): влезает ли список; если нет — прокрутка. - Приёмка: спецификация совпадает с таблицами ТЗ (скрипт сверки или тест); для N1/N24 —
test_wing_models_contractи тесты крыльев зелёные,check_models.gdOK, площадь в плане ±2 %,reference.best_glide= базе, сваливание поляры против DHV Vmin — числа в отчёте; рендеры N1/N24 (снизу, 3/4, сбоку) и скриншот меню выбора крыла — вbuild/screenshots/w3-02/.
Шлюз 1: скриншоты «было/стало», N1/N24, правило К4 — главной сессии.
Волна 2 — новые P1 (18 крыльев) · Волна 3 — новые P2 (21 крыло)
После шлюза: пачками по 9–10 крыльев на исполнителя (dp-engineer, Sonnet — запуск скрипта, сборка, просмотр; сложности — Opus), до 2 пачек параллельно (общие файлы glider_params.json, locale/ui.csv — правки в разных местах, слияние без конфликтов проверяет координатор).
- W3-03: N2, N3, N4, N10, N11, N12, N13, N14, N15 · W3-04: N20, N24*, N25, N26, N28, N29, N31, N32 (*N24 уже в W3-02).
- W3-05: N5–N9, N16–N19 · W3-06: N21–N23, N27, N30, N33–N39.
- Приёмка каждой пачки: контрактный тест и тесты крыльев зелёные,
check_models.gdOK, лист рендеров (3/4 и снизу, по крылу) вbuild/screenshots/<задача>/, особенности вида из «Заметок по виду» — только то, что выражается полями К1 (wheels,faired_uprights,tip_round,keel_pocket_m,short_battens), не больше 2 попыток; строки в таблицу моделейdocs/guide/models.md.
Риски
- Ошибки разбора паспортов (ТЗ помечает): брать опорный размер из «Что задать», при сомнении — в журнал, не гадать.
- Нагрузка на меню при 48 крыльях — W3-02.
- Совпадение формы у моделей одного класса (одна база): с 3 м различаются размахом, углом носа, латами и раскраской — этого достаточно по решению пользователя.