Files
Learn_System/plans/STEREO_3D_IMPROVEMENT.md
T
Maxim Dolgolyov 8af85961b5 perf(stereo3d): Фаза 0 — render-on-demand, остановка фонового рендера, dispose
- 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>
2026-05-30 11:05:35 +03:00

3.9 KiB
Raw Blame History

План улучшения симуляции «Стереометрия 3D»

Файлы: frontend/js/labs/stereo.js (StereoSim, ~3720 строк), панель в frontend/lab.html (#sim-stereo), роутинг frontend/js/labs/lab-init.js.

Статус-легенда: [ ] не начато · [~] в работе · [x] готово


Фаза 0 — Производительность и гигиена (быстрый эффект, низкий риск) — ГОТОВО

  • 0.1 Останавливать loop при переключении симуляций. Добавлен _pauseAllSims() в lab-init.js, вызывается в начале openSim() — все rAF-симы (включая стерео) паузятся при переходе. Раньше предыдущий сим рендерил невидимый canvas вечно.
  • 0.2 Pointer/touch-слушатели перенесены с window на renderer.domElement, с pointer-capture для драга вне холста; все слушатели трекаются и снимаются в dispose(). Canvas получил tabindex/role/aria-label.
  • 0.3 Render-on-demand: _invalidate() + dirty-флаг _needsRender; loop засыпает (_rafId=null), просыпается по взаимодействию/изменению сцены. Хук в _clearGroup() покрывает все rebuild/clear; защита от двойного rAF.
  • 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.