eca68e1a28
LabMeasure (_measure.js): SVG-оверлей поверх сцены с pointer-events:none (симуляция остаётся интерактивной), перетаскиваемые ручки. Линейка — длина px + ≈ метры (PX_PER_M) + угол; угломер — угол при вершине с дугой. Кнопка-тумблер в топбаре лаборатории. Самодостаточно, симуляции не трогает. Этим Фаза 2 закрыта. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
78 lines
7.6 KiB
Markdown
78 lines
7.6 KiB
Markdown
# План улучшения симуляций (лаборатория)
|
|
|
|
Утверждён 2026-06-13. Цель — улучшить **текущие** симуляции (~50 шт.), а не наплодить новые.
|
|
|
|
## Текущее состояние
|
|
|
|
База сильная: data-driven реестр (`_registry.js`) с ленивой загрузкой и самовосстановлением
|
|
(`_loader.js`, `_sim_deps.js`), движок `LabFX` (частицы/звук/анимации), `LSGraphPanel`,
|
|
`_phys_visuals`, `_chem_visuals`. Каталог в БД (`lab_sims` миграция 042 + `lab_sim_links` 043),
|
|
синхрон в онлайн-уроке (`controllers/classroom/sim.js`).
|
|
|
|
Эталоны: **projectile, pendulum** (RK4), **opticsbench** (Снелл/линзы/дисперсия),
|
|
**circuit** (MNA-решатель), **trigcircle, titration**, **race** (единственная с задачами+проверкой).
|
|
|
|
Состав: физика 13, химия 16, математика 9, биология 2, игра 1.
|
|
|
|
## Сквозные пробелы (подтверждены ревью кода, 3 среза)
|
|
|
|
1. **Педагогика тонкая** — задания/цели/проверка лишь у ~6-8 из ~50; остальные — песочницы. Теория = голые формулы.
|
|
2. **Тач сломан в ~80%** — мост `_addTouchSupport` (`lab-init.js:158`) подключён в 2 симуляциях; вёрстка адаптивна, взаимодействие — нет.
|
|
3. **Доступность ≈ 0** — нет aria/role/alt на canvas, нет клавиатуры, контраст подписей < AA, нет `prefers-reduced-motion`.
|
|
4. **Нет сохранения состояния и «в Мои материалы»** — нельзя возобновить опыт/сдать результат; PNG-экспорт у 2 симуляций.
|
|
5. **Синхрон в онлайн-уроке частичный** — `getState/applyState` у ~11, часто 1 под-режим.
|
|
6. **Тех-долг жизненного цикла** — нет `destroy`, «дробовик» `_pauseAllSims/closeSim` по ~40 глобалам; добавить сим = 6+ мест; утечки; мёртвый `SimUtil` (`_util.js`).
|
|
7. **Палитра/DPR дублируются** в каждом canvas-файле; нет общего JS-модуля токенов; canvas игнорирует светлую тему.
|
|
8. **Производительность** — пул частиц обходит все 1500/кадр; нет «эконом-режима»; тяжёлые 3D/двойной маятник.
|
|
9. **Хрупкая вставка в урок** — `simId` сырым текстом без списка/валидации (`lesson-editor.html`).
|
|
|
|
## Фазы
|
|
|
|
### Фаза 0 — Фундамент
|
|
- `SimBase`/миксин жизненного цикла: `fit/play/pause/reset/destroy/getState/applyState` + DPR из одного места (подключать постепенно).
|
|
- `LabPalette` — общий JS-модуль цветов/констант (`PX_PER_M`), задел под светлую тему canvas.
|
|
- Заполнить `manifest.stop/destroy` per-sim → убрать «дробовик».
|
|
- Убрать мёртвый `SimUtil` (или перевести симуляции на него).
|
|
- lesson-editor: выпадающий список симуляций из `/api/lab/sims` вместо сырого `simId`.
|
|
- `prefers-reduced-motion` + «эконом-режим» в `LabFX` (центрально). Закрывает 6,7,8(част.),9.
|
|
|
|
### Фаза 1 — Педагогический слой (макс. эффект)
|
|
- Фреймворк заданий (обобщить `race.js`): `tasks:[{prompt, check(state), tolerance, hint}]` + панель ввода ответа/проверки/прогресса.
|
|
- «Что понять» + deep-link на § учебника.
|
|
- XP за задания (с дневным лимитом, анти-фарм). Закрывает 1.
|
|
|
|
### Фаза 2 — Ценность для ученика
|
|
- Сохранение/возобновление параметров (поверх `getState`, localStorage + опц. БД).
|
|
- «В Мои материалы» (скриншот canvas → `student_materials`) + «Скачать PNG» везде.
|
|
- Общие измерительные инструменты (линейка/транспортир/курсор). Закрывает 4.
|
|
|
|
### Фаза 3 — Тач и доступность
|
|
- Тач везде (`_addTouchSupport` во все canvas-открытия / pointer-events как `geometry.js`); pinch-zoom.
|
|
- aria/role/alt + текстовая сводка состояния; клавиатура; контраст до AA; `prefers-reduced-motion`. Закрывает 2,3.
|
|
|
|
### Фаза 4 — Полный синхрон в онлайн-уроке
|
|
- `getState/applyState` для всех симуляций и под-режимов. Закрывает 5 (опирается на Фазу 0).
|
|
|
|
### Фаза 5 — Производительность и стабильность
|
|
- Пул частиц: список живых вместо обхода 1500/кадр; общий RAF-планировщик + пауза по `visibilitychange`.
|
|
- Асинхронная загрузка тел симуляций (сейчас синхронный XHR).
|
|
- Фронт-тесты движка. Закрывает 8 + отсутствие тестов.
|
|
|
|
### Фаза 6 — Контент и охват
|
|
- Усилить биологию (генетика, экосистемы, ферменты, кровообращение).
|
|
- Доработать crystal/orbitals (статичные 3D) — интерактив + задания.
|
|
- Допривязать `lab_sim_links` к §§ учебников.
|
|
|
|
## Порядок
|
|
Старт — Фаза 0. Затем Фаза 1 (педагогика) + Фаза 3 (тач/доступность) параллельно.
|
|
Быстрые победы: тач массово, список симуляций в редакторе урока, reduced-motion/эконом, убрать `SimUtil`.
|
|
|
|
## Прогресс
|
|
- [x] Фаза 0 (фундамент заложен) — эконом-режим/reduced-motion (LabFX, тумблер), выбор симуляции из списка в редакторе урока, удалён мёртвый `SimUtil`, добавлены `LabPalette` (_palette.js) и `SimBase` (_simbase.js) как опциональные основания. **Адаптация симуляций к SimBase/LabPalette и удаление «дробовика» `_pauseAllSims/closeSim` — постепенно, по мере правок каждой симуляции (требует поштучной проверки, нет фронт-тестов).**
|
|
- [~] Фаза 1 — сделано: фреймворк `LabTasks` (_tasks.js) + интеграция в теорию; задания на 17 симуляций. Осталось: XP за задания, deep-link на §, наполнение остальных.
|
|
- [x] Фаза 2 — «Сохранить кадр в Мои материалы» + «Скачать PNG»; сохранение/возобновление параметров (localStorage, не в embed); измерительные инструменты `LabMeasure` (линейка + угломер, SVG-оверлей). Остаток-доработка: 3D/WebGL-снимок (preserveDrawingBuffer), привязка линейки к шкале конкретной симуляции.
|
|
- [ ] Фаза 3
|
|
- [ ] Фаза 4
|
|
- [ ] Фаза 5
|
|
- [ ] Фаза 6
|