8af85961b5
- lab-init: _pauseAllSims() паузит активный rAF-сим при переключении (раньше стерео рендерило невидимый canvas вечно) - stereo: render-on-demand через _invalidate()/_needsRender, loop засыпает и просыпается по взаимодействию - pointer/touch-слушатели перенесены с window на canvas (pointer-capture), трекаются и снимаются в dispose() - обработка webglcontextlost/restored + метод dispose() - _clearGroup стал рекурсивным (устранена утечка вложенных групп), a11y-атрибуты на canvas - bump stereo.js?v=3 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
49 lines
3.9 KiB
Markdown
49 lines
3.9 KiB
Markdown
# План улучшения симуляции «Стереометрия 3D»
|
||
|
||
Файлы: `frontend/js/labs/stereo.js` (StereoSim, ~3720 строк), панель в `frontend/lab.html` (`#sim-stereo`), роутинг `frontend/js/labs/lab-init.js`.
|
||
|
||
Статус-легенда: [ ] не начато · [~] в работе · [x] готово
|
||
|
||
---
|
||
|
||
## Фаза 0 — Производительность и гигиена (быстрый эффект, низкий риск) — ГОТОВО
|
||
|
||
- [x] 0.1 Останавливать loop при переключении симуляций.
|
||
Добавлен `_pauseAllSims()` в `lab-init.js`, вызывается в начале `openSim()` — все rAF-симы (включая стерео) паузятся при переходе. Раньше предыдущий сим рендерил невидимый canvas вечно.
|
||
- [x] 0.2 Pointer/touch-слушатели перенесены с `window` на `renderer.domElement`, с pointer-capture для драга вне холста; все слушатели трекаются и снимаются в `dispose()`. Canvas получил `tabindex`/`role`/`aria-label`.
|
||
- [x] 0.3 Render-on-demand: `_invalidate()` + dirty-флаг `_needsRender`; loop засыпает (`_rafId=null`), просыпается по взаимодействию/изменению сцены. Хук в `_clearGroup()` покрывает все rebuild/clear; защита от двойного rAF.
|
||
- [x] 0.4 Обработка `webglcontextlost`/`webglcontextrestored` (пересборка сцены); метод `dispose()` (renderer, ResizeObserver, слушатели, текстуры). Бонус: `_clearGroup` стал рекурсивным — устранена утечка вложенных групп (измерения и т.п.).
|
||
|
||
## Фаза 1 — Камера и навигация
|
||
|
||
- [ ] 1.1 Демпфирование/инерция орбиты, панорамирование (pan), zoom-to-cursor.
|
||
- [ ] 1.2 Кнопки: сброс вида, пресеты ракурса (изометрия / спереди / сверху / сбоку).
|
||
- [ ] 1.3 Тумблер авто-вращения, fullscreen, скриншот PNG.
|
||
|
||
## Фаза 2 — Геометрия и пикинг
|
||
|
||
- [ ] 2.1 Точные сечения кривых тел (окружность/эллипс для шара/цилиндра/конуса) вместо сэмплинга порогом.
|
||
- [ ] 2.2 Унифицировать пикинг (расстояние точка-отрезок везде, в т.ч. `_pickNearestEdgeIdx`).
|
||
- [ ] 2.3 HiDPI-метки (резкие спрайты/SDF), пул текстур вместо пересоздания.
|
||
|
||
## Фаза 3 — Педагогика сечений
|
||
|
||
- [ ] 3.1 Построение сечения «по следам» с пошаговой анимацией и подписью вершин.
|
||
- [ ] 3.2 Точки сечения в произвольной точке грани.
|
||
- [ ] 3.3 Постоянная панель readout: длины/углы/площадь сечения с пояснением.
|
||
|
||
## Фаза 4 — Визуал
|
||
|
||
- [ ] 4.1 Материалы: рёбра с anti-alias, подсветка активной грани, свечение вершин.
|
||
- [ ] 4.2 Аккуратные оси X/Y/Z с подписями, опциональный фон (тёмный/бумага).
|
||
|
||
## Фаза 5 — Интеграция и архитектура
|
||
|
||
- [ ] 5.1 Разбить `stereo.js` на модули (builders / sections / tools / ui), вынести константы и цвета.
|
||
- [ ] 5.2 Связать симуляцию с учебниками 10–11 (открывать тело/сечение из §-канвы и задач).
|
||
- [ ] 5.3 Доступность: клавиатура, `aria`, фокус.
|
||
|
||
---
|
||
|
||
История: создан 2026-05-30.
|