---
name: project_optics_constructor
description: Конструктор оптических систем в оптической скамье (BenchSim) — что это и как устроено
metadata: 
  node_type: memory
  type: project
  originSessionId: e04a2ab1-2fce-4387-9ec4-7f3f2fb6d65c
---

Оптическая скамья (`frontend/js/labs/opticsbench.js`, ~4600+ строк) — это **7 режимов-вкладок**, каждый отдельный класс/canvas/панель: линза (`ThinLensSim`), зеркало (`MirrorSim`), преломление (`RefractionSim`), **Конструктор** (`BenchSim`), призма (`PrismSim`), интерференция (`InterferenceSim`), волны (`DiffractionSim`). Переключение — `obSwitchMode(mode)`.

**Конструктор оптических систем** (май 2026, коммиты 832efc0…1c7d8e9) — режим `freebuild`, вкладка «Конструктор» (бывш. «Цепочка линз»). Класс `BenchSim` — общий 2D-трассировщик:
- Элементы по `xf` (0..1), центр на оси: линза (f, ap), зеркало (kind plane/concave/convex, R, ap), диафрагма (gap), экран, призма (apex, n, size), **граница сред** (n1|n2, Снеллиус+ПВО), **стеклянная пластина** (n, t, параллельный сдвиг). Источник: предмет/точка/параллель/**одиночный луч**/**лазер**, с углом прицеливания `ang`. Линза/зеркало отсекают лучи вне апертуры (виньетирование); у собирающей линзы метки F/2F.
- Трассировка `_traceRay`: ближайший элемент по ходу → `_interact` → дальше; лимит отражений (зеркала разворачивают ход). Линза — параксиальный кик θ'=θ−y/f (фокус в x+f). Призма — тонкопризменное δ=(n−1)·A + дисперсия `_nAtWavelength(n,λ)`.
- Белый свет (общий λ-бар скамьи, `window._obWhiteLight`): пучки по `OB_SPECTRAL`, каждый луч красится `wavelengthToRGB(wl)` → после призмы спектр. Экран ловит изображение — светящиеся пятна (`_drawScreenHits`, additive).
- UI: динамический инспектор (`_benchUpdateUI`, `bench-list`/`bench-props`), палитра `benchAdd(type)`, `benchSelect/benchUpdate/benchRemove`, пресеты `benchPreset` (микроскоп/телескоп/проектор/зеркальная), `benchExportPng`. ВАЖНО: слайдеры свойств вызывают `updateElement`→`_redraw` (только холст), НЕ `_changed` — иначе пересборка панели ломает drag слайдера.
- Состояние: `benchSim.getState/setState`, проброшено в `_obGetState/_obApplyState` (снимок/embed).

Старый `FreeBuildSim`/`freeSim` и функции `freeAddLens/freeLensF` — legacy, не используются (панель переведена на bench*). Ревью скамьи и план — `plans/OPTICS_CONSTRUCTOR.md`.

Бэклог: точная двухгранная призма (Снеллиус на гранях), апертурное отсечение лучей вне линзы (сейчас проходят прямо), профиль интенсивности на экране, поворот элементов.

Правило: при правке opticsbench.js поднимать `?v=N` у `<script src="/js/labs/opticsbench.js?v=N">`. См. [[project_stereo3d_improvements]], [[feedback_no_emoji]].
